1.5. Managing File Descriptors Safely
Problem
When your program starts up, you
want to make sure that only the standard
stdin
,
stdout, and stderr file
descriptors are open, thus avoiding denial of service
attacks and avoiding having an attacker place untrusted files on
special hardcoded file descriptors.
Solution
On Unix, use the function getdtablesize(
)
to obtain the size of the process’s file descriptor
table. For each file descriptor in the process’s
table, close the descriptors that are not stdin,
stdout, or stderr, which are
always 0, 1, and 2, respectively. Test stdin,
stdout, and stderr to ensure
that they’re open using fstat(
)
for
each descriptor. If any one is not open, open
/dev/null and associate with the descriptor. If
the program is running setuid, stdin,
stdout, and stderr should also
be closed if they’re not associated with a tty, and
reopened using /dev/null.
On Windows, there is no way to determine what file handles are open, but the same issue with open descriptors does not exist on Windows as it does on Unix.
Discussion
Normally, when a process is started, it inherits all open file descriptors from its parent. This can be a problem because the size of the file descriptor table on Unix is typically a fixed size. The parent process could therefore fill the file descriptor table with bogus files to deny your program any file handles for opening its own files. The result is essentially a denial of service for your program.
When a new file is opened, a descriptor is ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access