
GUSTAVE — это платформа для фаззинга ядер встроенных ОС. Она основана на QEMU и AFL (и всех их форк-серверных родственниках). Она позволяет фаззить ядра ОС как простые приложения.
(c) Airbus 2021, sduverger
GUSTAVE — это платформа для фаззинга ядер встраиваемых ОС. Она основана на QEMU и AFL (а также на всех их forkserver-собратьях). Она позволяет фаззить ядра ОС как обычные приложения.
Благодаря QEMU, он кроссплатформенный. Можно рассматривать GUSTAVE как реализацию forkserver AFL внутри QEMU с детальным анализом цели.
GUSTAVE в основном разработан для фаззинга ядер встраиваемых ОС. Вероятно, это не лучший инструмент для фаззинга больших и сложных ядер, таких как в Windows, Linux или macOS.
Однако, если у вас есть цель, которую можно подготовить с одним-двумя приложениями для загрузки без взаимодействия с пользователем, возможно, стоит попробовать GUSTAVE.
Инструмент afl-fuzz из проекта AFL используется для автоматического фаззинга вашей цели. Однако AFL не может напрямую фаззить ядро ОС и ожидает, что его цель будет напрямую разбирать сгенерированные тестовые наборы.
Короче говоря, afl-fuzz запустит QEMU с интеграцией GUSTAVE в качестве своей цели. В свою очередь, GUSTAVE будет обрабатывать:
Как и в режиме AFL/QEMU-user, используемом в проекте AFL++, GUSTAVE реализует двоичную инструментацию на уровне TCG IR QEMU для покрытия кода.
Однако вы можете отключить это и пересобрать код целевого ядра, оставив только определенные части под анализ покрытия кода. Вам придется внедрить шайбы AFL на этапе сборки для обновления битовых карт трассировки. Это был наш первоначальный подход (см. Публикации).
В отличие от существующих решений, GUSTAVE не заботится о мониторинге kernel panics. Мы рассматриваем их как управляемые ошибки и хотим обнаружить незаконное поведение, которое не вызвало никаких предупреждений.
Для этой цели GUSTAVE использует байт-ориентированную битовую карту фильтрации памяти за O(1), чтобы обнаружить недопустимые обращения из ядра. Возможны большие споры о том, что считать недопустимым с точки зрения ядра. Но в ограниченных, высокодетерминированных средах встраиваемых систем вы можете чувствовать себя комфортно, определяя легитимные области памяти для вашей прошивки и отслеживая обращения за их пределы.
Существуют сопоставимые подходы, такие как:
Проектные решения GUSTAVE подразумевают следующие отличия:
Однако вам всё равно нужно сообщить GUSTAVE:
На данный момент поддерживается только хост x86, но так как многие рабочие среды основаны на этой архитектуре, мы не считаем это серьезным ограничением.
Ограничение связано с тем, как мы изначально реализовали бэкенд фильтрации памяти на уровне tcg-target для быстрого пути загрузки/сохранения QEMU. Недавняя архитектура обратных вызовов памяти TCGPlugin может быть альтернативным подходом для поддержки любого хоста.
Мы реализовали и протестировали поддержку Intel x86 и PowerPC. Реализация GUSTAVE не зависит от архитектуры. Если вы можете запустить свою цель с помощью QEMU, вы можете фаззить её с GUSTAVE с небольшими усилиями.
Мы предоставляем примеры плат с интеграцией GUSTAVE: Intel 440FX и PowerPC PREP. Реализовать свою собственную плату очень просто и заключается в обёртке функции MACHINE_INIT для данной архитектуры.
Мы также добавили поддержку инструментальных шайб GUSTAVE для x86 и PowerPC в afl-gcc на случай, если вы не хотите использовать двоичную инструментацию TCG.
Мы предоставляем разработки, специфичные для микроядра POK:
Вам потребуется:
Прочитайте руководство для цели POK.
Материалы различных докладов о GUSTAVE можно найти на https://airbus-seclab.github.io/.