
Эволюционный фаззер, основанный на знаниях
Этот документ призван кратко объяснить теорию, лежащую в основе Choronzon. Кроме того, он предоставляет подробную информацию о его внутреннем устройстве и о том, как можно расширить Choronzon для новых требований. Обзор архитектуры Choronzon был впервые представлен на конференции ZeroNights 2015. Также доступны запись презентации и слайды.
Choronzon — это эволюционный фаззер. Он пытается имитировать эволюционный процесс, чтобы постоянно получать лучшие результаты. Для этого у него есть система оценки, которая классифицирует, какие из фаззированных файлов интересны, а какие следует отбросить.
Кроме того, Choronzon — это фаззер, основанный на знаниях. Он использует пользовательскую информацию для чтения и записи файлов целевого формата. Чтобы ознакомиться с терминологией Choronzon, следует учитывать, что каждый файл представлен хромосомой. Пользователи должны описать элементарную структуру рассматриваемого формата файла. Предпочтительно дать высокоуровневое описание формата вместо описания каждой детали и аспекта. Каждая из этих определенных пользователем элементарных структур считается геном. Каждая хромосома содержит дерево генов и способна построить из него соответствующий файл.
Choronzon разделен на три подсистемы: модуль Tracer, модуль Chromosome и фаззер.
Кратко: компонент Chromosome используется для описания целевого формата файла. Пользователи могут писать свои собственные модули для поддержки новых или пользовательских форматов. В качестве тестового примера с поставляется модуль PNG.
С другой стороны, компонент Tracer отвечает за мониторинг целевого приложения и сбор различной информации о его выполнении. Эта версия Choronzon использует инструмент бинарной инструментации Intel Pin для регистрации базовых блоков, которые были посещены во время выполнения. Однако Choronzon может поддерживать и другие средства трассировки. Также имейте в виду, что в следующей версии Choronzon Pin будет заменен из-за его значительного влияния на производительность.
Наконец, компонент фаззера используется для изменения содержимого тестируемых файлов. Модуль содержит набор Mutator (мутаторов) и Recombinator (рекомбинаторов). Mutators просто изменяют файл, как это делают обычные фаззеры. Например, они выполняют переворот байтов, перестановку байтов, случайную мутацию байтов и так далее. Но Choronzon имеет еще одну функцию, которая не так распространена среди фаззеров. Recombinators используют информацию о структуре формата файла, предоставленную модулем Chromosome, для выполнения интеллектуального фаззинга.
В каталоге chromosome/parsers вы можете найти файл PNG.py. Этот
модуль Python описывает фаззеру формат файла PNG. Вы можете добавить свои
собственные модули для других форматов файлов в этот каталог.
Основная идея подсистемы Chromosome заключается в преобразовании начальных seed-файлов с помощью Deserializer в дерево Genes. В какой-то момент (фаззированные) Genes будут записаны в файл с помощью Serializer.
Учтите, что в Choronzon цель модуля синтаксического анализа — предоставить элементарную структуру формата файла, а не каждую мелкую деталь. Это поможет фаззеру создавать в основном корректные файлы, избегая преждевременного завершения целевого приложения. Кроме того, такой подход экономит время, поскольку описание каждого аспекта формата файла требует времени и вносит значительные накладные расходы на разработку.
Новый модуль синтаксического анализатора должен импортировать:
и должен реализовывать:
В примере, поставляемом с Choronzon, каждый PNGGene соответствует PNG-чанку. В общем, вы можете думать о Gene как об элементарной структуре данных целевого формата. Каждая Chromosome состоит из дерева Genes и представляет собой уникальный файл. Каждый Gene должен уметь создавать байтовую строку, содержащую его данные в сочетании с данными нижележащих Genes в дереве.
PNGSerializer должен уметь создавать (в основном корректный) файл, когда ему передается список Genes. С другой стороны, PNGDeserializer должен уметь анализировать валидный файл целевого формата и десериализовывать его в дерево Genes.
Проверьте chromosome/parsers/PNG.py для получения примера с комментариями для формата PNG.
Модуль Tracer используется для дизассемблирования целевого приложения (и/или одной или нескольких его библиотек). В этой версии Choronzon это достигается с помощью IDA. Мы использовали этот подход, потому что можем соотнести любую интересную информацию из кампании фаззинга с нашими IDB. Однако мы можем отказаться от зависимости от IDA в ближайшем будущем, чтобы сделать Choronzon более переносимым и доступным.
Файл тестируется в приложении с помощью утилиты Pin. В
каталоге analyzer/coverage находится исходный код этого инструмента Pin, который
внедряет хуки в начало каждого базового блока в целевом приложении.
Когда выполнение завершается, мы сопоставляем базовый блок, который был затронут, с
базовым блоком из бинарного файла. Таким образом, мы можем вычислять метрики, которые
ценны для нас (покрытие и т.д.).
Компонент Fuzzer использует представление Chromosome для фаззинга файла. Как упоминалось ранее, в Choronzon есть два метода фаззинга.
Для первого метода Choronzon получает содержимое из одного или нескольких генов
и применяет один из Mutators. Mutators реализуют распространенные, но эффективные
методы фаззинга, такие как случайная мутация байтов, установка старшего бита, перестановка байтов
и многие другие. Вы также можете написать свои собственные мутаторы и добавить их в
fuzzers/mutators.py.
Второй метод фаззинга называется рекомбинацией. Recombinators используются для изменения структуры файла. Вот пример с форматом PNG.
Файлы PNG состоят из последовательных чанков, которые содержат четыре поля:
Предположим, у нас есть PNG-файл, который содержит только чанки IHDR, IDAT и IEND. Его структура будет выглядеть следующим образом:
[ PNG signature ] [ IHDR ] [ IDAT ] [ IEND ]
Поскольку Choronzon знает о базовых структурах (т.е. чанках PNG), он может изменять их последовательность. После успешной рекомбинации фаззированный выходной файл PNG может выглядеть так:
[ PNG signature ] [ IDAT ] [ IHDR ] [ IEND ]
Choronzon содержит множество других стратегий рекомбинации, которые позволяют ему справляться даже со сложными форматами файлов.
Choronzon тестировался с Python 2.7, Pin 3, IDA Pro 6.6–6.9, на Ubuntu 16.04 LTS (ядро Linux 4.4) и Windows 10.
Для его запуска вам потребуется установить пакет Python sortedcontainers. Вы можете найти его здесь или установить через pip.
Кроме того, Choronzon требует IDA Pro (фактически, его терминальную версию). Путь к IDA Pro должен быть указан в вашем конфигурационном файле следующим образом:
DisassemblerPath = 'C:\\Program Files (x86)\\IDA 6.6'
Он успешно тестировался с IDA Pro 6.6, 6.7, 6.8 и 6.9.
Инструмент Pin для покрытия Choronzon находится в analyzer/coverage и должен быть
скомпилирован. Вы можете обратиться к документации Pin для получения подробной информации или выполнить
следующие шаги:
coverage.cpp и makefile.rules в
/path/to/pin/source/tools/MyPinToolmake. Если вы работаете в Windows, запустите командную строку Visual
Studio и используйте утилиту make и ее зависимости из
Cygwin/path/to/choronzon/analysis/coverage только что созданный
каталог obj-intel64 (или obj-ia32 для 32-битных систем)Для фаззинга с Choronzon необходимо предоставить конфигурационный
файл. В каталоге settings находится пример конфигурации Choronzon.