Исследователи представили Einstein, автоматический генератор атак на данные программ

Раньше хакер, нашедший в программе ошибку переполнения буфера или use-after-free, обычно перехватывал поток управления: перезаписывал указатель на код и заставлял программу выполнить чужой код. Десятилетия защит вроде DEP, CFI и CPI сделали такой перехват почти невозможным. По данным, которые в статье приводят сами Microsoft, Google и Mozilla, около 70% ошибок безопасности в их продуктах, это как раз ошибки безопасности памяти, то есть потенциальный материал для подобных атак.

В ответ на ужесточение защит внимание сместилось к атакам «только на данные» (data-only attacks): программа выполняет исключительно свой собственный, легальный код, но с данными, которые подменил атакующий. Такие атаки известны почти два десятилетия, но считались либо слишком специфичными для конкретного приложения (нужно детально знать его внутреннее устройство), либо технически слишком сложными, построение рабочего эксплойта требовало трудоёмкого ручного анализа или тяжёлых алгоритмов решения ограничений на потоки данных.

Авторы статьи поясняют идею на примере веб-сервера: при старте он читает из конфигурационного файла путь к каталогу CGI-BIN, где лежат исполняемые скрипты, и кладёт его в переменную cgi_bin_path. Если у сервера есть ошибка переполнения буфера, атакующий может перезаписать эту переменную с «/usr/local/server/cgi-bin» на «/bin». После этого запрос вида «POST /sh» с командой в теле заставляет сервер выполнить не безобидный скрипт сортировки, а системную оболочку, и запустить произвольную команду атакующего. Сервер при этом не запускает ни одной строки чужого кода: он выполняет ровно ту же последовательность действий, что и для легитимного запроса, только с подменёнными данными.

Инструмент Einstein автоматизирует построение таких эксплойтов и не привязан к конкретному приложению: вместо изучения особенностей протокола или логики программы он отслеживает данные, которые попадают в аргументы системных вызовов (syscalls), универсального интерфейса взаимодействия любой программы с операционной системой. Работает в два этапа. Сначала, с помощью динамического taint-анализа (отслеживания распространения «помеченных», потенциально подконтрольных атакующему данных), Einstein запускает программу, помечает данные, которые может исказить известная уязвимость, и смотрит, куда они попадают при обработке обычных, легитимных запросов. Если помеченные данные доходят до аргумента чувствительного с точки зрения безопасности системного вызова (например, execve) в неизменном виде, это кандидат на эксплойт. Затем, на втором этапе, Einstein перезапускает программу, реально подменяет данные согласно найденному кандидату и посылает соответствующий запрос, чтобы проверить, действительно ли атака сработала.

Авторы делают из этого вывод: расхожее мнение, что атаки только на данные слишком сложны или слишком специфичны, чтобы быть практической угрозой, не подтверждается, такие атаки оказались доступны и малоквалифицированным атакующим. Из этого следует практический вызов индустрии: разработчикам защитных механизмов и производителям софта стоит пересмотреть стратегии защиты, которые сегодня почти целиком сосредоточены на перехвате потока управления, а не на подмене данных.

Ключевые факты

  • На USENIX Security 2024 представлен инструмент Einstein, автоматически строящий атаки, которые не меняют код программы, а только подделывают её данные
  • По приводимым в статье данным самих компаний, около 70% ошибок безопасности в продуктах Microsoft, Google и Mozilla, это ошибки безопасности памяти, то есть потенциальный материал для таких атак
  • Классический пример: перезапись пути к CGI-каталогу веб-сервера позволяет заставить его исполнить системную оболочку вместо безобидного скрипта, без единой строки чужого кода
  • Einstein не привязан к конкретному приложению: он ищет данные атакующего, которые доходят без изменений до аргументов системных вызовов, таких как execve
  • Авторы утверждают, что атаки только на данные, которые почти 20 лет считались слишком сложными или нишевыми, на практике доступны низкоквалифицированным атакующим, и защитные стратегии индустрии стоит пересмотреть

Почему это важно

Десятилетия работы над DEP, CFI, CPI и подобными защитами почти закрыли классический путь атаки, перехват потока управления через перезапись указателей на код. Индустрия считала, что альтернативный путь, атаки только на данные, слишком сложен или слишком специфичен для конкретной программы, чтобы быть практической угрозой. Статья на USENIX Security 2024 и инструмент Einstein показывают, что это предположение было ошибочным: такие атаки строятся автоматически и без глубокого знания конкретного приложения.

Кому это важно

В первую очередь, производителям софта и разработчикам систем защиты, чья модель угроз до сих пор в основном закрывает перехват потока управления. В статье прямо приводится в пример опыт Microsoft, Google и Mozilla, у которых около 70% ошибок безопасности, это ошибки безопасности памяти. Также это касается исследователей безопасности и специалистов по анализу уязвимостей (pentest), которым инструмент вроде Einstein упрощает поиск рабочих эксплойтов.

Как это применить

Практический вывод статьи, сместить фокус защитных мер с одного лишь контроля потока управления на защиту данных, которые попадают в аргументы системных вызовов. Метод Einstein, двухэтапный: сначала с помощью динамического taint-анализа находятся места, где данные атакующего доходят без изменений до аргумента чувствительного системного вызова (например, execve), затем кандидат проверяется реальным запуском атаки. Такой подход не требует ни разбора протокола конкретной программы, ни решения сложных ограничений на потоки данных.

Можно ли доверять

Источник, научная статья, представленная на USENIX Security 2024, одной из ведущих академических конференций по компьютерной безопасности с рецензированием, и сопровождающий её материал на портале USENIX ;login: online. Доступный текст статьи обрывается перед разделом с результатами эксперимента, поэтому конкретные цифры о том, для скольких реальных программ Einstein нашёл рабочие эксплойты, в нём не приводятся, оценивать масштаб находки по одним лишь заявлениям авторов стоит с поправкой на это.

Риски и подводные камни

Главный риск, который описывают сами авторы: у большого числа программ уже сегодня есть ошибки безопасности памяти (около 70% по данным трёх крупных вендоров), а значит потенциальный материал для атак только на данные широко распространён, и до сих пор недооценивался как угроза. Отдельная оговорка: доступный текст статьи обрывается до раздела с результатами, поэтому неизвестно, на каких именно реальных программах и с каким успехом Einstein подтвердил свои эксплойты, судить о практическом масштабе угрозы по одному пересказу метода преждевременно.

«Построение такой атаки требует глубокого понимания семантики программы»

— авторы примера атаки, на который ссылается статья (в тексте не названы)