...
Several rules apply to creating temporary files in shared directories including this one: temporary files must have unique names. Privileged programs that create files in world-writable directories can overwrite protected system files. An attacker who can predict the name of a file created by a privileged program can create a symbolic link (with the same name as the file used by the program) to point to a protected system file. Unless the privileged program is coded securely, the program will follow the symbolic link instead of opening or creating the file that it is supposed to be using. As a result, the protected system file referenced by the symbolic link can be overwritten when the program is executed.
Non-Compliant Code Example: fopen()
The following statement creates some_file
in the /tmp
directory.
...
To exploit this coding error, an attacker need only create a symbolic link called /tmp/some_file
before execution of this statement.
Non-Compliant Code Example: open()
Wiki Markup |
---|
The {{fopen()}} function does not indicate whether an existing file has been opened for writing or a new file has been created. However, the {{open()}} function as defined in the Open Group Base Specifications Issue 6 \[[Open Group 04|AA. C References#Open Group 04]\] provides such a mechanism. If the {{O_CREAT}} and {{O_EXCL}} flags are used together, the {{open()}} function fails when the file specified by {{file_name}} already exists. To prevent an existing file from being opened and truncated, include the flags {{O_CREAT}} and {{O_EXCL}} when calling {{open()}}. |
...
Wiki Markup |
---|
Care should be observed when using {{O_EXCL}} with remote file systems, as it does not work with NFS version 2. NFS version 3 added support for {{O_EXCL}} mode in {{open()}}; see IETF RFC 1813 \[[Callaghan 95|AA. C References#Callaghan 95]\], in particular the {{EXCLUSIVE}} value to the {{mode}} argument of {{CREATE}}. |
Non-Compliant Code Example: tmpnam()
Wiki Markup |
---|
The C99 {{tmpnam()}} function generates a string that is a valid filename and that is not the same as the name of an existing file \[[ISO/IEC 9899-1999|AA. C References#ISO/IEC 9899-1999]\]. Files created using strings generated by the {{tmpnam()}} function are temporary in that their names should not collide with those generated by conventional naming rules for the implementation. The function is potentially capable of generating {{TMP_MAX}} different strings, but any or all of them may already be in use by existing files. If the argument is not a null pointer, it is assumed to point to an array of at least {{L_tmpnam}} chars; the {{tmpnam()}} function writes its result in that array and returns the argument as its value. |
...
Wiki Markup |
---|
Unfortunately, this solution is still non-compliant because it violates \[[FIO32-C|FIO32-C. Temporary file names must be unique when the file is created]\], \[[FI040-C|FI040-C. Temporary files must be opened with exclusive access]\], \[[FI041-C|FI041-C. Temporary files must have an unpredictable name]\], and \[[FI042-C|FI042-C. Temporary files must be removed before the program exits]\]. |
Non-Compliant Code Example: tmpnam_s()
(ISO/IEC TR 24731-1)
Wiki Markup |
---|
The TR 24731-1 {{tmpnam_s()}} function generates a string that is a valid filename and that is not the same as the name of an existing file \[[ISO/IEC TR 24731-2006|AA. C References#SO/IEC TR 24731-2006]\]. The function is potentially capable of generating {{TMP_MAX_S}} different strings, but any or all of them may already be in use by existing files and thus not be suitable return values. The lengths of these strings must be less than the value of the {{L_tmpnam_s}} macro. |
...
Wiki Markup |
---|
This solution is also non-compliant because it violates \[[FIO32-C|FIO32-C. Temporary file names must be unique when the file is created]\] and \[[FI042-C|FI042-C. Temporary files must be removed before the program exits]\]. |
Non-Compliant Code Example: mktemp()/open()
(POSIX)
The POSIX function mktemp()
takes a given filename template and overwrites a portion of it to create a filename. The template may be any filename with some number of Xs appended to it (for example, /tmp/temp.XXXXXX
). The trailing Xs are replaced with the current process number and/or a unique letter combination. The number of unique filenames mktemp()
can return depends on the number of Xs provided.
...
Include Page | ||||
---|---|---|---|---|
|
Risk Assessment
A protected system file to which the symbolic link points can be overwritten when a vulnerable program is executed.
...
Examples of vulnerabilities resulting from the violation of this rule can be found on the CERT website.
References
Wiki Markup |
---|
\[[ISO/IEC 9899-1999|AA. C References#ISO/IEC 9899-1999]\] Sections 7.19.4.4, "The tmpnam function," 7.19.4.3, "The tmpfile function," and 7.19.5.3, "The fopen function" \[[ISO/IEC TR 24731-2006|AA. C References#ISO/IEC TR 24731-2006]\] Sections 6.5.1.2, "The tmpnam_s function," 6.5.1.1, "The tmpfile_s function," and 6.5.2.1, "The fopen_s function" \[[Open Group 04|AA. C References#Open Group 04]\] [mktemp()|http://www.opengroup.org/onlinepubs/000095399/functions/mktemp.html], [mkstemp()|http://www.opengroup.org/onlinepubs/009695399/functions/mkstemp.html], [open()|http://www.opengroup.org/onlinepubs/009695399/functions/open.html] \[[Seacord 05a|AA. C References#Seacord 05a]\] Chapter 3, "File I/O" \[[Wheeler 03|AA. C References#Wheeler 03]\] [Chapter 7, "Structure Program Internals and Approach"|http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/avoid-race.html#TEMPORARY-FILES] \[[Viega 03|AA. C References#Viega 03]\] Section 2.1, "Creating Files for Temporary Use" \[[Kennaway 00|AA. C References#Kennaway 00]\] \[[HP 03|AA. C References#HP 03]\] |