Гонка символических ссылок — это своего рода уязвимость безопасности программного обеспечения , которая возникает из-за того, что программа создает файлы небезопасным образом. [1] Злонамеренный пользователь может создать символическую ссылку на файл, который в противном случае был бы ему недоступен. Когда привилегированная программа создает файл с тем же именем, что и символическая ссылка, она фактически создает вместо этого связанный файл, возможно, вставляя содержимое, желаемое злонамеренным пользователем (см. пример ниже), или даже предоставленное злонамеренным пользователем (в качестве входных данных для программы).
Это называется « гонкой », потому что в типичном проявлении программа проверяет, существует ли файл с таким именем; если его нет, программа создает файл. Злоумышленник должен создать ссылку в промежутке между проверкой и созданием файла .
Гонка символических ссылок может происходить с антивирусными продуктами, которые решают, что они поместят подозрительный файл в карантин или удалят его, а затем продолжают и делают это. В промежутке между решением и действием вредоносное ПО может заменить подозрительный файл системным или антивирусным файлом, который вредоносное ПО хочет перезаписать. [2]
В этом наивном примере программа Unixfoo
— setuid
. Ее функция — извлекать информацию для учетных записей , указанных пользователем. Для «эффективности» она сортирует запрошенные учетные записи во временный файл ( /tmp/foo
естественно) перед выполнением запросов.
Каталог /tmp
доступен для записи всем. Злонамеренный пользователь Mallory создает символическую ссылку на файл /root/.rhosts
с именем /tmp/foo
. Затем Mallory вызывает foo
с помощью user
запрошенной учетной записи. Программа создает (временный) файл /tmp/foo
(на самом деле создавая /root/.rhosts
) и помещает в него информацию о запрошенной учетной записи (например user password
). Она удаляет временный файл (просто удаляя символическую ссылку).
Теперь /root/.rhosts
содержит информацию о пароле, которая (если она вообще находится в правильном формате) является заклинанием, необходимым для того, чтобы позволить любому пользователю rlogin
войти в компьютер в качестве суперпользователя .
В некоторых Unix-системах существует специальный флаг, O_NOFOLLOW
предотвращающий open(2)
открытие файла через символическую ссылку (висячую или иную), который был стандартизирован в POSIX.1-2008 .
Функцию стандартной библиотеки POSIX C можно использовать для безопасного создания временных файлов. Для скриптов оболочки системная утилита делает то же самое.mkstemp