Книга: Программирование для Linux. Профессиональный подход
10.6.2. Конкуренция доступа к каталогу /tmp
10.6.2. Конкуренция доступа к каталогу /tmp
Другая распространенная проблема безопасности связана с созданием файлов с предсказуемыми именами, в основном в каталоге /tmp
. Предположим, что программа prog
, выполняющаяся от имени пользователя root
, всегда создает временный файл /tmp/prog
и помещает в него важную информацию. Тогда злоумышленник может заранее создать символическую ссылку /tmp/prog
на любой другой файл в системе. Когда программа попытается создать временный файл, функция open()
завершится успешно, но в действительности вернет дескриптор символической ссылки. Любые данные, записываемые во временный файл, окажутся перенаправленными в файл злоумышленника.
В такой ситуации говорят о конкуренции. Она неявно существует между автором программы и хакером. Кто первым успеет создать временный файл, тот и победит.
Посредством этой атаки часто уничтожаются системные файлы. Создав нужную символическую ссылку, хакер может заставить программу, выполняющуюся с правами суперпользователя, затереть важный системный файл, например /etc/passwd
.
Один из способов избежать такой атаки — создавать временные файлы со случайными именами. Например, можно прочитать из устройства /dev/random
случайные данные и включить их в имя файла. Это усложнит задачу хакеру, но не остановит его полностью. Он может попытаться создать большое число символических ссылок с потенциально верными именами. Даже если их будет 10000, одна верная догадка приведет к непоправимому.
Другой подход заключается в вызове функции open()
с флагом O_EXCL
. Он заставляет функцию завершиться неудачей, если обнаруживается факт существования файла. К сожалению, это не срабатывает, если программа работает через NFS. Нельзя заранее предсказать, в какой файловой системе будет находиться программа, поэтому рассчитывать только на флаг O_EXCL
нельзя.
В разделе 2.1.7, "Временные файлы", рассказывалось о применении функции mkstemp()
для создания временных файлов. К сожалению, в Linux эта функция открывает файл с флагом O_EXCL
после того, как было выбрано трудно угадываемое имя. Другими словами, применять функцию небезопасно, если каталог /tmp
смонтирован через NFS.[35]
Прием, который всегда работает, заключается в вызове функции lstat()
(рассматривается в приложении Б, "Низкоуровневый ввод-вывод") для созданного файла. Она отличается от функции stat() тем, что возвращает информацию о самой символической ссылке, а не о файле, на который она ссылается. Если функция сообщает, что новый файл является обычным файлом, а не символической ссылкой, и принадлежит владельцу программы, то все в порядке.
В листинге 10.5 представлена функция, которая пытается безопасно открыть файл в каталоге /tmp
. Возможно, у этой функции есть свои слабости. Мы не рекомендуем читателям включать показанный код в свои программы без дополнительной экспертизы, просто мы хотим убедить читателей в том, что создание безопасных приложений — непростая задача,
- 10.6.2. Конкуренция доступа к каталогу
- 14.4.1. Прохождение по каталогу
- 9.4. Права доступа к squid
- 10.5. Транзакции и пути доступа меню
- Настройка доступа пользователей к рабочей книге
- 3.5 Проблемы доступа при использовании нескольких протоколов
- Есть ли быстрый способ доступа к папкам?
- После переустановки Windows нет доступа к папке Мои документы или нельзя удалить оставшуюся от старой системы папку Docu...
- Как не запутаться в разрешениях доступа к файлам?
- Можно ли копировать права доступа вместе с данными?
- 8.2. Изменение пароля доступа к маршрутизатору
- 4.1. Права доступа