Symlink race
A symlink race is a kind of software security vulnerability that results from a program creating files in an insecure manner. A malicious user can create a symbolic link to a file not otherwise accessible to them. When the privileged program creates a file of the same name as the symbolic link, it actually creates the linked-to file instead, possibly inserting content desired by the malicious user, or even provided by the malicious user.
It is called a "race" because in its typical manifestation, the program checks to see if a file by that name already exists; if it does not exist, the program then creates the file. An attacker must create the link in the interval between the check and when the file is created.
A symlink race can happen with antivirus products that decide they will quarantine or delete a suspicious file, and then go ahead and do that. During the interval between decision and action, malicious software can replace the suspicious file with a system or antivirus file that the malicious software wants overwritten.
Example
In this naive example, the Unix programfoo is setuid. Its function is to retrieve information for the accounts specified by the user. For "efficiency", it sorts the requested accounts into a temporary file before making the queries.The directory
/tmp is world-writable. Malicious user Mallory creates a symbolic link to the file /root/.rhosts named /tmp/foo. Then, Mallory invokes foo with user as the requested account. The program creates the file /tmp/foo and puts information about the requested account in it. It removes the temporary file.Now the
/root/.rhosts contains password information, which is the incantation necessary to allow anyone to use rlogin to log into the computer as the superuser.In some Unix-systems there is a special flag
O_NOFOLLOW for open to prevent opening a file via a symbolic-link and has become standardized in POSIX.1-2008.Workaround
The POSIX C standard library functionmkstemp can be used to safely create temporary files. For shell scripts, the system utility does the same thing.