Продвинутый фаззер для поиска уязвимостей в бинарных программах методом покрытия кода. Форк и улучшение AFL: QEMU-режим (без исходников), persistent mode, laf-intel, CmpLog, MOpt мутации, параллельный фаззинг. Один из главных инструментов в vulnerability research и bug bounty.
# Ubuntu/Kali: sudo apt install afl++ # Или из исходников (для последних фич): git clone https://github.com/AFLplusplus/AFLplusplus cd AFLplusplus make distrib sudo make install # Компиляция цели с инструментацией: CC=afl-clang-fast ./configure make # Запуск фаззинга: afl-fuzz -i input/ -o output/ -- ./target_binary @@ # QEMU-режим (без исходников): afl-fuzz -i input/ -o output/ -Q -- ./target_binary @@
Версия релиза: 5.02c
Версия в GitHub: 5.02c
Репозиторий: https://github.com/AFLplusplus/AFLplusplus
AFL++ поддерживается:
frida_mode поддерживается @WorksbutnottestedПервоначально разработан Михалом "lcamtuf" Залевски.
AFL++ является превосходным форком Google AFL - больше скорости, больше и лучших мутаций, больше и лучшей инструментации, поддержка пользовательских модулей и так далее.
AFL++ лицензируется по AGPL-3.0-or-later, и также содержит файлы под лицензией Apache-2.0.
Всё, что компилируется в fuzzing-харнес, является и останется лицензированным по Apache 2.0.
Каждый файл указывает свою лицензию в заголовке SPDX-License-Identifier — это
лицензия, которой вы должны следовать для данного файла.
Для организаций, которые не могут использовать AGPL, доступна опциональная коммерческая лицензия
(получается за пожертвование на благое дело — проект и его
контрибьюторы не получают денег).
Смотрите LICENSING.md для простого
обзора и
раздел «Лицензия» ниже для подробностей.
Вот некоторая информация для начала работы:
stable или
dev — в зависимости от вашей толерантности к риску. Также посмотрите список
важных изменений в AFL++ и список
особенностей.aflplusplus, или используйте
afl-clang-fast с AFL_LLVM_CMPLOG=1. Конфигурацию по умолчанию aflplusplus
можно найти в репозитории Google
fuzzbench.Чтобы AFL++ был легкодоступен со всем скомпилированным, просто скачайте образ напрямую из Docker Hub (доступен как для x86_64, так и для arm64):
docker pull aflplusplus/aflplusplus
docker run -ti -v /location/of/your/target:/src aflplusplus/aflplusplus
Этот образ автоматически публикуется при пуше в ветку stable
(см. ветки). Если вы используете команду выше, ваш исходный код
цели будет находиться в /src в контейнере.
Замечание: вы также можете скачать aflplusplus/aflplusplus:dev, который
представляет собой последнее состояние разработки AFL++.
Чтобы собрать AFL++ самостоятельно — что мы рекомендуем — продолжайте по docs/INSTALL.md.
ПРИМЕЧАНИЕ: Перед началом, пожалуйста, прочтите о типичных рисках фаззинга.
Это быстрый старт для фаззинга целей при наличии исходного кода. Чтобы прочитать о процессе подробно, см. docs/fuzzing_in_depth.md.
Чтобы узнать о фаззинге других целей, смотрите: * Цели только в бинарном виде: docs/fuzzing_binary-only_targets.md * Сетевые сервисы: docs/best_practices.md#fuzzing-a-network-service * GUI-программы: docs/best_practices.md#fuzzing-a-gui-program
Пошаговый быстрый старт:
afl-cc. Типичный способ
сделать это:CC=/path/to/afl-cc CXX=/path/to/afl-c++ ./configure --disable-shared
make clean all
Получите небольшой, но валидный входной файл, который имеет смысл для программы. При фаззинге громких синтаксисов (SQL, HTTP и т.д.) также создайте словарь, как описано в dictionaries/README.md.
Если программа читает из stdin, запустите afl-fuzz следующим образом:
./afl-fuzz -i seeds_dir -o output_dir -- \
/path/to/tested/program [...аргументы командной строки программы...]
Чтобы добавить словарь, добавьте -x /path/to/dictionary.txt к afl-fuzz.
Если программа берет входные данные из файла, вы можете поставить @@ в командной
строке программы; AFL++ подставит автоматически сгенерированное имя файла.
Изучите всё, что показано красным цветом в интерфейсе фаззера, немедленно обратившись к docs/afl-fuzz_approach.md#understanding-the-status-screen.
Вы найдете найденные падения (crashes) и зависания (hangs) в подкаталогах crashes/ и
hangs/ в директории -o output_dir. Вы можете воспроизвести падения, подавая их
на вход цели, например, если ваша цель использует stdin:
cat output_dir/crashes/id:000000,* | /path/to/tested/program [...аргументы командной строки программы...]
Вы можете генерировать core-файлы или использовать gdb напрямую для расследования падений.
Для анализа покрытия вашего фаззинга мы рекомендуем наши партнёрские инструменты cov-analysis (отчёты о покрытии на основе исходного кода из корпуса фаззинга) и fuzz-reachability (статический анализ того, какие функции может достичь харнес, чтобы отличить действенное покрытие от мёртвого кода и генерировать белые списки инструментации).
Мы не можем достаточно подчеркнуть это - если вы хотите фаззить эффективно, прочитайте документ docs/fuzzing_in_depth.md!
Вопросы? Проблемы? Отчёты об ошибках?
Существуют следующие ветки:
Посмотрите наш список issues с тегом "help wanted". Это может быть ваш способ поддержать и внести вклад в AFL++ — расширить его чтобы сделать что-то крутое. Если у вас есть другие идеи — просто создайте issue и предложите!
Для всех, кто хочет внести вклад (и отправлять pull requests), пожалуйста, прочтите наши руководство по контрибьюции перед отправкой.