Время проверки до времени использования
В разработке программного обеспечения время проверки до времени использования ( TOCTOU , TOCTTOU или TOC/TOU ) — это класс программных ошибок, вызванных состоянием гонки , включающим проверку состояния части системы (например, учетные данные безопасности) и использование результатов этой проверки.
Условия гонки TOCTOU распространены в Unix между операциями в файловой системе . [1] но может произойти и в других контекстах, включая локальные сокеты и неправильное использование транзакций базы данных . В начале 1990-х годов почтовая утилита BSD 4.3 UNIX имела возможность использования состояния гонки для временных файлов, поскольку она использовала mktemp()
[2] функция. [3]
Ранние версии OpenSSH имели возможность использования состояния гонки для сокетов домена Unix . [4] Они остаются проблемой в современных системах; с 2019 года состояние гонки TOCTOU в Docker обеспечивает root-доступ к файловой системе хост-платформы. [5] На соревновании Pwn2Own 2023 года в Ванкувере команда хакеров смогла взломать шлюз в обновленной модели Tesla Model 3 с помощью этой ошибки. [6]
Примеры
[ редактировать ]В Unix следующий код C при использовании в setuid
программа имеет ошибку TOCTOU:
if (access("file", W_OK) != 0) {
exit(1);
}
fd = open("file", O_WRONLY);
write(fd, buffer, sizeof(buffer));
Здесь доступ предназначен для проверки того, является ли реальный пользователь, выполнивший setuid
программе обычно разрешается записать файл (т. е. access
проверяет реальный идентификатор пользователя, а не эффективный идентификатор пользователя ).
Это состояние гонки уязвимо для атаки:
Жертва | Злоумышленник |
---|---|
if (access("file", W_OK) != 0) {
exit(1);
}
|
|
После проверки доступа, перед открытием, злоумышленник подменяет file с символической ссылкой на файл паролей Unix /etc/passwd : symlink("/etc/passwd", "file");
| |
fd = open("file", O_WRONLY);
write(fd, buffer, sizeof(buffer));
/etc/passwd
|
В этом примере злоумышленник может воспользоваться состоянием гонки между access
и open
обмануть setuid
жертва перезаписала запись в базе данных системных паролей. Гонки TOCTOU можно использовать для повышения привилегий для получения административного доступа к машине.
Хотя такая последовательность событий требует точного времени, злоумышленник может организовать такие условия без особого труда.
Подразумевается, что приложения не могут предполагать, что состояние, управляемое операционной системой (в данном случае пространство имен файловой системы), не будет меняться между системными вызовами.
Надежный расчет времени TOCTOU
[ редактировать ]Использование состояния гонки TOCTOU требует точного расчета времени, чтобы гарантировать правильное чередование действий злоумышленника с действиями жертвы. В приведенном выше примере злоумышленник должен выполнить команду symlink
системный вызов именно между access
и open
. Для наиболее общей атаки злоумышленник должен быть запланирован для выполнения после каждой операции жертвы, что также известно как «пошаговый обход» жертвы.
В случае почтовой утилиты BSD 4.3 и mktemp()
, [2] злоумышленник может просто продолжать запускать почтовую утилиту в одном процессе, продолжать угадывать имена временных файлов и создавать символические ссылки в другом процессе. Атака обычно может быть успешной менее чем за одну минуту.
Методы пошагового обхода программы-жертвы включают лабиринты файловой системы. [7] и атаки на сложность алгоритмов. [8] В обоих случаях злоумышленник манипулирует состоянием ОС, чтобы контролировать планирование жертвы.
Лабиринты файловой системы вынуждают жертву прочитать запись каталога, которой нет в кэше ОС, а ОС усыпляет жертву, пока она читает каталог с диска. Атаки, усложняющие алгоритмы, заставляют жертву тратить весь квант планирования на один системный вызов, просматривающий хеш-таблицу ядра с именами кэшированных файлов. Злоумышленник создает очень большое количество файлов с именами, которые имеют то же значение хеша, что и файл, который будет искать жертва.
Предотвращение ТОКТУ
[ редактировать ]Несмотря на концептуальную простоту, состояния гонки TOCTOU трудно избежать и устранить. Один общий метод заключается в использовании обработки ошибок вместо предварительной проверки в соответствии с философией EAFP – «Легче попросить прощения, чем разрешения», а не LBYL – «посмотри, прежде чем прыгать» – в этом случае проверки нет, и несостоятельность предположений сигнализируются возвращаемым сообщением об ошибке. [9]
В контексте условий гонки файловой системы TOCTOU фундаментальной проблемой является обеспечение того, чтобы файловая система не могла быть изменена между двумя системными вызовами. В 2004 году был опубликован результат невозможности, показывающий, что не существует переносимого детерминированного метода, позволяющего избежать состояний гонки TOCTOU при использовании UNIX. access
и open
вызовы файловой системы. [10]
библиотеки для отслеживания файловых дескрипторов и обеспечения корректности. Поскольку этот результат невозможен, исследователи предложили [11]
Альтернативное решение, предложенное исследовательским сообществом, заключается в том, чтобы системы UNIX принимали транзакции в файловой системе или ядре ОС. Транзакции обеспечивают абстракцию управления параллелизмом для ОС и могут использоваться для предотвращения гонок TOCTOU. Хотя ни одно промышленное ядро UNIX еще не поддерживает транзакции, для Linux были разработаны экспериментальные прототипы концепции, включая файловую систему Valor. [12] и ядро TxOS. [13] Microsoft Windows добавила транзакции в свою NTFS . файловую систему [14] но Microsoft не рекомендует их использовать и указала, что они могут быть удалены в будущей версии Windows. [15]
Блокировка файлов — это распространенный метод предотвращения состояний гонки для одного файла, но он не распространяется на пространство имен файловой системы и другие метаданные, а также не работает хорошо с сетевыми файловыми системами и не может предотвратить условия гонки TOCTOU.
Для setuid
двоичные файлы, возможное решение — использовать seteuid()
системный вызов для изменения действующего пользователя, а затем выполнить open()
вызов. Различия в setuid()
между операционными системами может быть проблематично. [16]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Вэй, Цзиньпэн; Пу, Калтон (декабрь 2005 г.). «Уязвимости TOCTTOU в файловых системах UNIX-стиля: анатомическое исследование» . УСЕНИКС . Проверено 14 января 2019 г.
- ^ Jump up to: а б "мктемп(3)" . Страница руководства по Linux . 15 сентября 2017 г.
- ^ Шандэ Чжоу (周尚德) (1 октября 1991 г.). «Лазейка безопасности в Unix» . Архивировано из оригинала 16 января 2013 г.
- ^ Ачесон, Стив (4 ноября 1999 г.). «Часто задаваемые вопросы по Secure Shell (SSH)» . Архивировано из оригинала 13 февраля 2017 г.
- ^ «Ошибка Docker обеспечивает root-доступ к файловой системе хоста» . Расшифровать . Дуэт безопасности. 28 мая 2019 года . Проверено 29 мая 2019 г.
- ^ «Windows 11, Tesla, Ubuntu и macOS были взломаны на Pwn2Own 2023» . Мигающий компьютер . Проверено 24 марта 2023 г.
- ^ Борисов Никита; Джонсон, Роб; Састри, Навин; Вагнер, Дэвид (август 2005 г.). «Урегулирование гонок ради удовольствия и выгоды: как злоупотреблять временем». Материалы 14-й конференции по симпозиуму по безопасности USENIX . 14 . Балтимор, Мэриленд: 303–314. CiteSeerX 10.1.1.117.7757 .
{{cite journal}}
: CS1 maint: дата и год ( ссылка ) - ^ Сян Цай; Ювэй Гуй; Джонсон, Роб (май 2009 г.). «Использование гонок файловой системы Unix посредством атак на сложность алгоритма» (PDF) . 2009 г. 30-й симпозиум IEEE по безопасности и конфиденциальности . Беркли, Калифорния. стр. 27–41. дои : 10.1109/SP.2009.10 . ISBN 978-0-7695-3633-0 . S2CID 6393789 . Архивировано из оригинала (PDF) 18 мая 2021 г.
{{cite book}}
: CS1 maint: отсутствует местоположение издателя ( ссылка ) - ^ Мартелли, Алекс (2006). «Глава 6: Исключения». Python в двух словах (2-е изд.). О'Рейли Медиа . п. 134. ИСБН 978-0-596-10046-9 .
- ^ Дин, Дрю; Ху, Алан Дж. (август 2004 г.). «Урегулирование гонок ради удовольствия и прибыли: как использовать доступ (2)». Материалы 13-го симпозиума по безопасности USENIX . Сан-Диего, Калифорния): 195–206. CiteSeerX 10.1.1.83.8647 .
{{cite journal}}
: CS1 maint: дата и год ( ссылка ) - ^ Цафрир, Дэн; Герц, Томер; Вагнер, Дэвид; Да Силва, Дилма (июнь 2008 г.). «Портативное предотвращение атак типа «гонка файлов» с помощью разрешения пути в пользовательском режиме» . Технический отчет RC24572, Исследовательский центр IBM TJ Watson . Йорктаун-Хайтс, Нью-Йорк.
- ^ Спиллейн, Ричард П.; Гайквад, Сачин; Чинни, Манджунатх; Садок, Эрез (24–27 февраля 2009 г.). «Включение транзакционного доступа к файлам с помощью облегченных расширений ядра» (PDF) . Седьмая конференция USENIX по файловым технологиям и технологиям хранения (FAST 2009) . Сан-Франциско, Калифорния.
{{cite web}}
: CS1 maint: дата и год ( ссылка ) - ^ Портер, Дональд Э.; Хофманн, Оуэн С.; Россбах, Кристофер Дж.; Бенн, Александр; Витчел, Эммет (11–14 октября 2009 г.). «Транзакции операционной системы» (PDF) . Материалы 22-го симпозиума ACM по принципам операционных систем (SOSP '09) . Биг Скай, Монтана.
{{cite web}}
: CS1 maint: дата и год ( ссылка ) - ^ Руссинович, Марк; Соломон, Дэвид А. (2009). Внутреннее устройство Windows . Майкрософт Пресс . ISBN 978-0735648739 .
- ^ «Альтернативы использованию транзакционной NTFS» . Сеть разработчиков Microsoft . Архивировано из оригинала 29 сентября 2022 года . Проверено 10 декабря 2015 г.
- ^ Хао Чен; Вагнер, Дэвид; Дин, Дрю (12 мая 2002 г.). «Сетуид демистифицирован» (PDF) .
Дальнейшее чтение
[ редактировать ]- Бишоп, Мэтт; Дилджер, Майкл (1996). «Проверка условий гонки при доступе к файлам» (PDF) . Вычислительные системы . стр. 131–152.
- Цафрир, Дэн; Герц, Томер; Вагнер, Дэвид; Да Силва, Дилма (2008). «Портативное решение файлов TOCTTOU Races с усилением твердости» (PDF) . Материалы 6-й конференции USENIX по файловым технологиям и технологиям хранения (FAST '08), Сан-Хосе (Калифорния), 26–29 февраля 2008 г. стр. 189–206.