Введение

Безопасность программного обеспечения

Гонка симссылок — это вид уязвимости в безопасности программного обеспечения, возникающая из-за небезопасного способа создания файлов программой. Злоумышленник может создать символическую ссылку на файл, к которому у него обычно нет доступа. Когда привилегированная программа создает файл с тем же именем, что и символическая ссылка, она фактически создает файл, на который указывает ссылка, возможно, вставляя контент, желаемый злоумышленником (см. пример ниже), или даже предоставленный злоумышленником в качестве входных данных для программы. Это называется "гонкой", потому что в типичном случае программа сначала проверяет, существует ли файл с таким именем; если файла не существует, программа создает его. Злоумышленник должен создать ссылку в промежутке между проверкой и созданием файла. Гонка симссылок может произойти с антивирусными продуктами, которые принимают решение поместить подозрительный файл в карантин или удалить его, а затем приступают к выполнению этого решения. В промежуток между принятием решения и его выполнением вредоносное ПО может заменить подозрительный файл системным или антивирусным файлом, который злоумышленник хочет перезаписать.

Пример

В этом наивном примере программа Unix foo имеет атрибут setuid. Её функция – извлекать информацию об учетных записях, указанных пользователем. Для "оптимизации" она сортирует запрошенные учетные записи во временный файл (/tmp/foo, естественно) перед выполнением запросов. Каталог /tmp доступен для записи всем пользователям. Злоумышленник Малори создает символическую ссылку на файл /root/.rhosts с именем /tmp/foo. Затем Малори запускает foo, указав пользователя в качестве запрашиваемой учетной записи. Программа создает (временный) файл /tmp/foo (фактически создавая /root/.rhosts) и помещает в него информацию о запрашиваемой учетной записи (например, пароль пользователя). Она удаляет временный файл (удаляя лишь символическую ссылку). Теперь файл /root/.rhosts содержит информацию о пароле, которая (если она окажется в правильном формате) является ключом, необходимым для того, чтобы любой мог использовать rlogin для входа в систему от имени суперпользователя. Кроме того, в некоторых Unix-системах существует специальный флаг O_NOFOLLOW для функции open(2), предотвращающий открытие файла через символическую ссылку (недействительную или иную). Он был стандартизирован в POSIX.1 2008.

Обход

Функция стандартной библиотеки POSIX C `mkstemp` может использоваться для безопасного создания временных файлов. Для сценариев оболочки ту же задачу выполняет системная утилита.