Jump to content

Время проверки до времени использования

В разработке программного обеспечения время проверки до времени использования ( 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]

См. также

[ редактировать ]
  1. ^ Вэй, Цзиньпэн; Пу, Калтон (декабрь 2005 г.). «Уязвимости TOCTTOU в файловых системах UNIX-стиля: анатомическое исследование» . УСЕНИКС . Проверено 14 января 2019 г.
  2. ^ Jump up to: а б "мктемп(3)" . Страница руководства по Linux . 15 сентября 2017 г.
  3. ^ Шандэ Чжоу (周尚德) (1 октября 1991 г.). «Лазейка безопасности в Unix» . Архивировано из оригинала 16 января 2013 г.
  4. ^ Ачесон, Стив (4 ноября 1999 г.). «Часто задаваемые вопросы по Secure Shell (SSH)» . Архивировано из оригинала 13 февраля 2017 г.
  5. ^ «Ошибка Docker обеспечивает root-доступ к файловой системе хоста» . Расшифровать . Дуэт безопасности. 28 мая 2019 года . Проверено 29 мая 2019 г.
  6. ^ «Windows 11, Tesla, Ubuntu и macOS были взломаны на Pwn2Own 2023» . Мигающий компьютер . Проверено 24 марта 2023 г.
  7. ^ Борисов Никита; Джонсон, Роб; Састри, Навин; Вагнер, Дэвид (август 2005 г.). «Урегулирование гонок ради удовольствия и выгоды: как злоупотреблять временем». Материалы 14-й конференции по симпозиуму по безопасности USENIX . 14 . Балтимор, Мэриленд: 303–314. CiteSeerX   10.1.1.117.7757 . {{cite journal}}: CS1 maint: дата и год ( ссылка )
  8. ^ Сян Цай; Ювэй Гуй; Джонсон, Роб (май 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: отсутствует местоположение издателя ( ссылка )
  9. ^ Мартелли, Алекс (2006). «Глава 6: Исключения». Python в двух словах (2-е изд.). О'Рейли Медиа . п. 134. ИСБН  978-0-596-10046-9 .
  10. ^ Дин, Дрю; Ху, Алан Дж. (август 2004 г.). «Урегулирование гонок ради удовольствия и прибыли: как использовать доступ (2)». Материалы 13-го симпозиума по безопасности USENIX . Сан-Диего, Калифорния): 195–206. CiteSeerX   10.1.1.83.8647 . {{cite journal}}: CS1 maint: дата и год ( ссылка )
  11. ^ Цафрир, Дэн; Герц, Томер; Вагнер, Дэвид; Да Силва, Дилма (июнь 2008 г.). «Портативное предотвращение атак типа «гонка файлов» с помощью разрешения пути в пользовательском режиме» . Технический отчет RC24572, Исследовательский центр IBM TJ Watson . Йорктаун-Хайтс, Нью-Йорк.
  12. ^ Спиллейн, Ричард П.; Гайквад, Сачин; Чинни, Манджунатх; Садок, Эрез (24–27 февраля 2009 г.). «Включение транзакционного доступа к файлам с помощью облегченных расширений ядра» (PDF) . Седьмая конференция USENIX по файловым технологиям и технологиям хранения (FAST 2009) . Сан-Франциско, Калифорния. {{cite web}}: CS1 maint: дата и год ( ссылка )
  13. ^ Портер, Дональд Э.; Хофманн, Оуэн С.; Россбах, Кристофер Дж.; Бенн, Александр; Витчел, Эммет (11–14 октября 2009 г.). «Транзакции операционной системы» (PDF) . Материалы 22-го симпозиума ACM по принципам операционных систем (SOSP '09) . Биг Скай, Монтана. {{cite web}}: CS1 maint: дата и год ( ссылка )
  14. ^ Руссинович, Марк; Соломон, Дэвид А. (2009). Внутреннее устройство Windows . Майкрософт Пресс . ISBN  978-0735648739 .
  15. ^ «Альтернативы использованию транзакционной NTFS» . Сеть разработчиков Microsoft . Архивировано из оригинала 29 сентября 2022 года . Проверено 10 декабря 2015 г.
  16. ^ Хао Чен; Вагнер, Дэвид; Дин, Дрю (12 мая 2002 г.). «Сетуид демистифицирован» (PDF) .

Дальнейшее чтение

[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 1179715a682b794b9518a1eab87e02ce__1722519660
URL1:https://arc.ask3.ru/arc/aa/11/ce/1179715a682b794b9518a1eab87e02ce.html
Заголовок, (Title) документа по адресу, URL1:
Time-of-check to time-of-use - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)