Странные машины: как хакеры превращают данные в процессор

Представьте, что вы можете запустить любой код на чужом сервере, даже не имея доступа к его памяти. Звучит как магия? Для хакеров это рутина. Концепция «странных машин» (weird machines) ломает шаблон о том, что для атаки нужен shellcode. Атакующий просто манипулирует данными — картинкой, сетевым пакетом или JSON-файлом. И программа, сама того не желая, превращается в послушный процессор.
Что такое странная машина? Это не баг, а новая логика
Термин ввели исследователи Серж Брутус и Томас Дюлльен. Они назвали это «абстрактным процессором на необычных примитивах». Простыми словами: хакер находит в приложении недокументированную возможность управлять его состоянием через входные данные. Он не пишет код. Он собирает новую вычислительную машину поверх работающей программы.
Ключевое отличие от классических уязвимостей: shellcode не нужен. Атакующий использует штатные функции системы, но в неожиданной последовательности. Классический пример — ROP (return-oriented programming). Но ROP — лишь частный случай. Любой парсер, от JSON до JPEG, может стать процессором для злоумышленника.
Как из данных рождается процессор
Чтобы собрать странную машину, нужно два компонента: интерпретатор (функция, обрабатывающая данные) и изменяемое состояние. Хакер подает на вход специально сформированные данные. Интерпретатор обрабатывает их, меняя внутреннее состояние. Это новое состояние влияет на обработку следующего блока данных. Так формируется цикл.
В чем суть: получается машина Тьюринга, где лента — это память программы, а команды — это данные, которые хакер ей отправляет.
Реальный пример: В 2014 году исследователи атаковали libjpeg через парсер JPEG. Изображение содержало блоки, которые декодировались последовательно. Искусственно сконфигурированные квантовые таблицы изменяли указатели на следующие блоки. Один блок декодировался — менял структуру — влиял на декодирование следующего. Цикл замкнулся. Атака прошла без единой строчки shellcode. Только через структуру данных.
Типы странных машин: от ROP до DNS
Разные типы требуют разной сложности. Вот ключевые:
- ROP-машина. Цепочки гаджетов из существующего кода. Сложность — средняя. Пример — эксплойт для Windows.
- Python pickle-машина. Исполнение pickle-байткода. Сложность — низкая. Пример — удаленное выполнение кода.
- JPEG-машина. Декодирование изображений как цикл. Сложность — высокая. Пример — атака на libjpeg.
- DNS-машина. Побочные эффекты DNS-запросов. Сложность — средняя. Пример — атака на кэширующий сервер.
Личное наблюдение автора. Долгое время я считал, что достаточно просто не использовать опасные функции вроде eval(). Но после изучения weird machine понял: проблема глубже. Любая программа, которая принимает данные и имеет состояние, может быть превращена в процессор. Хорошая новость — такие атаки сложны в реализации и требуют глубокого понимания системы.
Что делать разработчику? Практические выводы
Странные машины объясняют, почему патчи отдельных уязвимостей не всегда спасают. Если атакующий нашел способ управлять состоянием программы через данные, он может обходить защиты. Рекомендации:
- Ограничивайте интерпретацию данных. Не соединяйте парсеры с исполнением произвольных операций.
- Используйте ASLR. Рандомизация адресов усложняет ROP, но не спасает от других типов.
- Внедряйте верификацию данных. Проверяйте корректность структуры перед обработкой.
Главная защита: не усложнять логику обработки данных и минимизировать количество состояний. Чем проще программа, тем меньше возможностей для создания странной машины.
Будущее: автоматический поиск странных машин
Сейчас разрабатываются инструменты для автоматического выявления таких возможностей. Fuzzing с отслеживанием покрытия может обнаружить неожиданные последовательности состояний. Но полностью автоматизировать поиск пока не удается. Возможно, в будущем мы увидим системы, способные доказывать отсутствие странных машин в коде.
Странные машины — напоминание о том, что программное обеспечение сложнее, чем кажется. И безопасность — это не просто исправление ошибок, а понимание того, как ваша программа может быть переосмыслена злоумышленником.










