Your application stores potentially sensitive data in memory, and you want to prevent this data from being written to disk if the program crashes, because local attackers might be able to examine a core dump and use that information nefariously.
On Unix systems, use setrlimit(
)
to
set the RLIMIT_CORE
resource to zero, which will
prevent the operating system from leaving behind a core file. On
Windows, it is not possible to disable such behavior, but there is
equally no guarantee that a memory dump will be performed. A
system-wide setting that cannot be altered on a per-application basis
controls what action
Windows takes when an application
crashes.
A Windows feature called Dr. Watson, which is enabled by default, may cause the contents of a process’s address space to be written to disk in the event of a crash. If Microsoft Visual Studio is installed, the settings that normally cause Dr. Watson to run are changed to run the Microsoft Visual Studio debugger instead, and no dump will be generated. Other programs do similar things, so from system to system, there’s no telling what might happen if an application crashes.
Unfortunately, there is no way to prevent memory dumps on a
per-application basis on Windows. The settings for how to handle an
application crash are system-wide, stored in the registry under
HKEY_LOCAL_MACHINE
, and they require Administrator
access to change them. Even if you’re reasonably
certain Dr. Watson will be the handler on systems on which your
program will be running, there is no way you can disable its
functionality on a per-application basis. On the other hand, any dump
that may be created by Dr. Watson is properly protected by ACLs that
prevent any other user from accessing them.
On most Unix systems, a program that crashes will " dump core.” The action of dumping core causes an image of the program’s committed memory at the time of the crash to be written out to a file on disk, which can later be used for post-mortem debugging.
The problem with dumping core is that the program may contain potentially sensitive information within its memory at the time the image is written to disk. Imagine a program that has just read in a user’s password, and then is forced to dump core before it has a chance to erase or otherwise obfuscate the password in memory.
Because an attacker may be able to manipulate the program’s runtime environment in such a way as to cause it to dump core, and thus write any sensitive information to disk, you should try to prevent a program from dumping core if there’s any chance the attacker may be able to get read access to the core file.
Generally, core files are written in such a way that the owner is the only person who can read and modify them, but silly things often happen, such as lingering core files accidentally being made world-readable by a recursive permissions change.
It’s best to prevent against core dumps as early in the program as possible, because if an attacker is manipulating the program in a way that causes it to crash, you cannot know in advance what state the program will be in when the attacker manages to force it to crash.
Process core dumping can be restricted on a per-application basis by
using the resource limit capabilities of most Unix systems. One of
the standard limits that can be applied to a process is the maximum
core dump file size. This limit serves to protect against large (in
terms of memory consumption) programs that dump core and could
potentially fill up all available disk space. Without this limit in
place, it would even be possible for an attacker who has discovered a
way to cause a program to crash from remote and dump core to fill up
all available disk space on the server. Setting the value of
RLIMIT_CORE
to 0 prevents the process from writing
any memory dump to disk, instead simply terminating the program when
a fatal problem is encountered.
#include <sys/types.h> #include <sys/time.h> #include <sys/resource.h> void spc_limit_core(void) { struct rlimit rlim; rlim.rlim_cur = rlim.rlim_max = 0; setrlimit(RLIMIT_CORE, &rlim); }
Tip
In addition to the RLIMIT_CORE
limit, the
setrlimit( )
function also allows other
per-process limits to be adjusted. We discuss these other limits in
Recipe 13.9.
The advantage of disabling core dumps is that if your program has
particularly sensitive information residing in memory unencrypted
(even transient data is at risk, because a skilled attacker could
potentially time the core dumps so that your program dumps core at
precisely the right time), it will not ever write this data to disk
in a core dump. The primary disadvantage of this approach is that the
lack of a core file makes debugging program crashes very difficult
after the fact. How big an issue this is depends on program
deployment and how bugs are tracked and fixed. A number of shells
provide an interface to the setrlimit( )
function
via a built-in command. Users who want to prevent core file
generation can set the appropriate limit with the shell command, then
run the program.
However, for situations where data in memory is required to be
protected, the application should limit the core dumps directly via
setrlimit( )
so that it becomes impossible to
inadvertently run the program with core dumps enabled. When core
dumps are needed for debugging purposes, a safer alternative is to
allow core dumps only when the program has been compiled in
“debug mode.” This is easily done
by wrapping the setrlimit( )
call with the
appropriate preprocessor conditional to disable the code in debug
mode and enable it otherwise.
Some Unix variants (Solaris, for example) allow the system administrator to control how core dumps are handled on a system-wide basis. Some of the capabilities of these systems allow the administrator to specify a directory where all core dumps will be placed. When this capability is employed, the directory configured to hold the core dump files is typically owned by the superuser and made unreadable to any other users. In addition, most systems force the permissions of a core file so that it is only readable by the user the process was running as when it dumped core. However, this is not a very robust solution, as many other exploits could possibly be used to read this file.
Get Secure Programming Cookbook for C and C++ now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.