Фтруктура для автоматизации обнаружения целевых изделий со статическим анализом статического анализа
Исследователи уязвимости, проводящие оценки безопасности на программном обеспечении, часто используют возможности пузырьки под руководством покрытия с помощью мощных инструментов, таких как AFL ++ и Libfuzzer. Это важно, так как он автоматизирует процесс настройки и быстро выявляет условия использования в целях. Однако при столкновении с большими и сложными кодовыми базами или двоичными файлами с закрытым исходным кодами исследователи должны кропотливо посвятить время для вручную аудит и реверсийного инженера, чтобы идентифицировать функции, в которых может быть полезно исследование на основе пузырьков.
Fuzzable - это структура, которая интегрируется как с исходным кодом C/C ++, так и двоичными файлами, чтобы помочь исследователям уязвимости в определении целей функций, которые жизнеспособны для нечетки. Это делается путем применения нескольких статических эвристики, основанных на анализе, для определения рискованного поведения в программном обеспечении и функций, которые их выполняют. Исследователи могут затем использовать структуру для создания основных шаблонов жгута, которые затем можно использовать для охоты на уязвимости или для интеграции как часть непрерывного промазанного конвейера, такого как проект Google OSS-Fuzz.
В дополнение к запуску в качестве автономного инструмента Fuzzable также интегрируется в качестве плагина для бинарного разборщика ниндзя, причем поддержка других разборки разрабатывается бэкэнды.
Ознакомьтесь с оригинальным сообщением в блоге, в котором подробно описывается инструмент, который подчеркивает технические характеристики эвристики статического анализа и то, как появился этот инструмент. Этот инструмент также представлен в Black Hat Arsenal USA 2022.
Некоторые бинарные цели могут потребовать некоторого дезинфекции (т.е. соответствия подписи или идентификации функций из внедрения), и, следовательно, пузырь, в первую очередь использует бинарную ниндзя в качестве бэкэнда разборки из -за его способности эффективно решать эти проблемы. Следовательно, его можно использовать как в качестве автономного инструмента, так и плагина.
Поскольку бинарный ниндзя недоступен для всех, и может возникнуть спрос для оценки безопасности и потенциально масштабировать в облаке, также поддерживается бэкэнд за отстранение ANGR. Я ожидаю включить другие разборщики в будущем (приоритет: Ghidra).
Если у вас есть бинарный рекламный ролик ниндзя, обязательно установите API для автономного использования без головы:
$ python3 /Applications/Binary Ninja.app/Contents/Resources/scripts/install_api.py
Установить с помощью pip :
$ pip install fuzzable
Мы используем поэзию для управления зависимостями и строительства. Чтобы сделать ручную сборку, клонируйте репозиторий с сторонними модулями:
$ git clone --recursive https://github.com/ex0dus-0x/fuzzable
Для установки вручную:
$ cd fuzzable/
# without poetry
$ pip install .
# with poetry
$ poetry install
# with poetry for a development virtualenv
$ poetry shell
Теперь вы можете проанализировать двоичные файлы и/или исходный код с помощью инструмента!
# analyzing a single shared object library binary
$ fuzzable analyze examples/binaries/libbasic.so
# analyzing a single C source file
$ fuzzable analyze examples/source/libbasic.c
# analyzing a workspace with multiple C/C++ files and headers
$ fuzzable analyze examples/source/source_bundle/
Fuzzable можно легко установить через бинарный рынок плагинов Ninja, перейдя на Binary Ninja > Manage Plugins и поиска. Вот пример запуска Fuzzable Plagin, точности идентификации целей для нечетки и дальнейшей оценки уязвимости:

Fuzzable поставляется с различными вариантами, чтобы лучше настроить ваш анализ. Больше будет поддерживаться в будущих планах и любых сделанных запросов функций.
Чтобы определить нечеткость, Fuzzable использует несколько эвристических данных, чтобы определить, какие цели наиболее жизнеспособны для цели для динамического анализа. Все эти эвристики по-разному взвешиваются с использованием библиотеки Scikit-Criteria, в которой используется многокритериа-анализ решений для определения лучших кандидатов. Эти метрики и есть ли здесь веса:
| Эвристика | Описание | Масса |
|---|---|---|
| Пухоподобное имя | Имя символа подразумевает поведение, которое проглатывает ввод файлов/буфера | 0,3 |
| Рискованные раковины | Аргументы, которые поступают в рискованные звонки (т. Е. Memcpy) | 0,3 |
| Природные петли | Количество петель, обнаруженных с границей доминирования | 0,05 |
| Цикломатическая сложность | Сложность целевой функции на основе краев + узлов | 0,05 |
| Глубина покрытия | Количество каллеров, цель проходит в | 0,3 |
Как уже упоминалось, ознакомьтесь с техническим сообщением в блоге для более подробного взгляда на то, как и как используются эти показатели.
Многие показатели были в значительной степени вдохновлены оригинальной работой Винченцо Иоццо в 0-знакомство.
Каждая цель, которые вы хотите проанализировать, разнообразны, и Fuzzable не сможет учитывать каждое поведение в случае края в целевой программе. Таким образом, во время анализа может быть важно, чтобы эти веса соответствующим образом настроили эти веса, чтобы увидеть, имеют ли различные результаты больше смысла для вашего случая использования. Чтобы настроить эти веса в CLI, просто укажите аргумент --score-weights :
$ fuzzable analyze <TARGET> --score-weights=0.2,0.2,0.2,0.2,0.2
По умолчанию, Fuzzable будет отфильтровать цели функций на основе следующих критериев:
static и не выявляются через заголовки. Чтобы увидеть звонки, которые были отфильтрованы путем Fuzzable , установите флаг --list_ignored :
$ fuzzable analyze --list-ignored <TARGET>
В бинарной ниндзя вы можете повернуть эту настройку в Settings > Fuzzable > List Ignored Calls .
В том случае, если пухлевые ложно отфильтровывают важные вызовы, которые следует проанализировать, рекомендуется использовать --include-* аргументы, чтобы включить их во время пробега:
# include ALL non top-level calls that were filtered out
$ fuzzable analyze --include-nontop <TARGET>
# include specific symbols that were filtered out
$ fuzzable analyze --include-sym <SYM> <TARGET>
В бинарном ниндзя это поддерживается через Settings > Fuzzable > Include non-top level calls и Symbols to Exclude .
Теперь, когда вы нашли своих идеальных кандидатов в Fuzz, Fuzzable также поможет вам генерировать нечеткие жгуты, которые (почти) готовы к прибору и компилируются для использования либо с пуззером на основе файлов (т.е. AFL ++, Honggfuzz), либо в Fuzzer в памяти (Libfuzzer). Сделать это в CLI:
# generate harness from a candidate
$ fuzzable create-harness target --symbol-name=some_unsafe_call
# make minimal and necessary modifications to the harness
$ vim target_some_unsafe_call_harness.cpp
# example compilation for AFL-QEMU, which is specified in the comments of the generated harness
$ clang target_some_unsafe_call_harness.cpp -no-pie -o target_some_unsafe_call_harness -ldl
# create your base seeds, ideally should be more well-formed for input
$ mkdir in/
$ echo "seed" >> in/seed
# start black box fuzzing
$ afl-fuzz -Q -m none -i in/ -o out/ -- ./target_some_unsafe_call_harness
Если эта цель является исходной кодовой базой, будет использоваться шаблон общего источника.
Если цель является двоичным, будет использоваться общий шаблон черного ящика, который в идеале может использоваться с режимом пузырьки эмуляции, такой как AFL-Qemu. Копия бинарного файла также будет создана в качестве общего объекта, если символ не экспортируется непосредственно, чтобы быть dlopen Ed, используя LIEF.
На данный момент эта функция довольно рудиментарная, так как она просто создаст автономный жгут C ++, заполненный соответствующими параметрами, и не будет автоматически генерировать код, который необходим для любого поведения во время выполнения (т.е. мгновенный и освобождающий структуры). Тем не менее, шаблоны, созданные для Fuzzable, должны заставить вас быстро работать. Вот некоторые амбициозные функции, которые я хотел бы реализовать в будущем:
Fuzzable поддерживает генерирование отчетов в различных форматах. Нынешние поддерживаются, - это JSON, CSV и Markdown. Это может быть полезно, если вы используете это как часть автоматизации, где вы хотели бы проглапить выход в сериализуемом формате.
В CLI просто передайте аргумент --export с именем файла с соответствующим расширением:
$ fuzzable analyze --export=report.json <TARGET>
В бинарной ниндзя перейдите в Plugins > Fuzzable > Export Fuzzability Report > ... и выберите формат, в который вы хотите экспортировать, и путь, в который вы хотите написать его.
Этот инструмент будет постоянно развиваться, и любая помощь от внешних мантаксисов ценится!
Fuzzable лицензируется по лицензии MIT.