
AFLplusplus v5.03c
Фаззер afl++ — это afl с патчами сообщества, обновлением qemu 5.1, покрытием без коллизий, улучшенными laf-intel & redqueen, планировщиками мощности AFLfast++, мутаторами MOpt, unicorn_mode и многим другим!
American Fuzzy Lop plus plus (AFL++)
Версия релиза: 5.03c
Версия GitHub: 5.03c
Репозиторий: https://github.com/AFLplusplus/AFLplusplus
AFL++ поддерживается:
- Marc "van Hauser" Heuse [email protected]
- Dominik Maier [email protected]
- Andrea Fioraldi [email protected]
- Heiko "hexcoder-" Eissfeldt [email protected]
- frida_mode поддерживается @Worksbutnottested
Изначально разработан Michal "lcamtuf" Zalewski.
AFL++ — это превосходный форк Google AFL — больше скорости, больше и лучше мутаций, больше и лучше инструментирования, поддержка пользовательских модулей и т.д.
AFL++ распространяется под лицензией AGPL-3.0-or-later, а также содержит файлы под лицензией Apache-2.0.
Всё, что компилируется в фаззинг-харнесс, лицензировано и останется лицензированным под Apache 2.0.
Каждый файл указывает свою собственную лицензию в заголовке SPDX-License-Identifier — именно
эту лицензию вы должны соблюдать для данного файла.
Доступна коммерческая лицензия для организаций, которые
не могут использовать AGPL (получается путём пожертвования на благое дело — проект и его
поддерживающие не получают денег).
См. LICENSING.md для обзора простым языком и
раздел «Лицензия» ниже для подробностей.
Начало работы
Вот некоторая информация, чтобы вы могли начать:
- Обзор документации AFL++ и очень полезное графическое руководство см. на docs/README.md.
- Чтобы начать с обучающих материалов, перейдите к docs/tutorials.md.
- О релизах см.
вкладку Releases и
ветки. Лучшими ветками для использования, однако, являются
stableилиdev— в зависимости от вашей готовности к риску. Также ознакомьтесь со списком важных изменений в AFL++ и списком возможностей. - Если вы хотите использовать AFL++ в своей академической работе, ознакомьтесь со страницей статей на сайте.
- Чтобы цитировать нашу работу, см. раздел Цитирование.
- Для сравнений используйте конфигурацию fuzzbench
aflplusplusилиafl-clang-fastсAFL_LLVM_CMPLOG=1. Вы можете найти конфигурацию по умолчаниюaflplusplusв Google fuzzbench.
Сборка и установка AFL++
Чтобы иметь 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.
Быстрый старт: Фаззинг с AFL++
ПРИМЕЧАНИЕ: Прежде чем начать, пожалуйста, прочитайте о рисках фаззинга, связанных со здравым смыслом.
Это быстрый старт для фаззинга целей с доступным исходным кодом. Чтобы подробно прочитать о процессе, см. 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/в каталоге-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!
Контакты
Вопросы? Проблемы? Отчёты об ошибках?
- С участниками можно связаться через (например, создав issue — но только для дефектов AFL++!): https://github.com/AFLplusplus/AFLplusplus.
- Ознакомьтесь с нашим FAQ и лучшими практиками.
- Лучше всего: присоединяйтесь к Fuzzing Zulip server!
Ветки
Существуют следующие ветки:
- release: последний релиз
- stable: стабильное состояние AFL++ — она синхронизируется из dev время от времени, когда мы удовлетворены её стабильностью. Это ветка по умолчанию.
- dev: состояние разработки AFL++ — передний край, и вы можете получить версию, которая не компилируется или содержит ошибку. Мы принимаем только PR (pull request) для ветки 'dev'!
- (любая другая): экспериментальные ветки для работы над конкретными функциями или тестирования новых возможностей или изменений.
Требуется помощь
Ознакомьтесь с нашим списком issues с тегом "help wanted". Это может быть вашим способом поддержать и внести вклад в AFL++ — расширить его, чтобы сделать что-то крутое. Если у вас есть другие идеи — просто создайте issue и предложите их!
Для всех, кто хочет внести вклад (и отправлять pull request), пожалуйста, прочитайте наши руководящие принципы для участников перед отправкой.
Особая благодарность
Многие улучшения оригинального AFL и AFL++ были бы невозможны без отзывов, отчётов об ошибках или патчей от наших участников.
Спасибо! (Для людей, отправляющих pull request — пожалуйста, добавьте себя в этот список :-)
Список участников
Jann Horn Hanno Boeck
Felix Groebert Jakub Wilk
Richard W. M. Jones Alexander Cherepanov
Tom Ritter Hovik Manucharyan
Sebastian Roschke Eberhard Mattes
Padraig Brady Ben Laurie
@dronesec Luca Barbato
Tobias Ospelt Thomas Jarosch
Martin Carpenter Mudge Zatko
Joe Zbiciak Ryan Govostes
Michael Rash William Robinet
Jonathan Gray Filipe Cabecinhas
Nico Weber Jodie Cunningham
Andrew Griffiths Parker Thompson
Jonathan Neuschaefer Tyler Nighswander
Ben Nagy Samir Aguiar
Aidan Thornton Aleksandar Nikolich
Sam Hakim Laszlo Szekeres
David A. Wheeler Turo Lamminen
Andreas Stieger Richard Godbee
Louis Dassy teor2345
Alex Moneger Dmitry Vyukov
Keegan McAllister Kostya Serebryany
Richo Healey Martijn Bogaard
rc0r Jonathan Foote
Christian Holler Dominique Pelle
Jacek Wielemborek Leo Barnes
Jeremy Barnes Jeff Trull
Guillaume Endignoux ilovezfs
Daniel Godas-Lopez Franjo Ivancic
Austin Seipp Daniel Komaromy
Daniel Binderman Jonathan Metzman
Vegard Nossum Jan Kneschke
Kurt Roeckx Marcel Boehme
Van-Thuan Pham Abhik Roychoudhury
Joshua J. Drake Toby Hutton
Rene Freingruber Sergey Davidoff
Sami Liedes Craig Young
Andrzej Jackowski Daniel Hodson
Nathan Voss Dominik Maier
Andrea Biondo Vincent Le Garrec
Khaled Yakdan Kuang-che Wu
Josephine Calliotte Konrad Welc
Thomas Rooijakkers David Carlier
Ruben ten Hove Joey Jiao
fuzzah @intrigus-lgtm
Yaakov Saxon Sergej Schumilo
Ziqiao Kong Ryan Berger
Sangjun Park Scott Guest
Fabian Keil @Jay-1409
Gergely Nagy
Цитирование
Если вы используете AFL++ в научной работе, рассмотрите возможность цитирования нашей статьи, представленной на WOOT'20:
Andrea Fioraldi, Dominik Maier, Heiko Eißfeldt, and Marc Heuse. “AFL++: Combining incremental steps of fuzzing research”. In 14th USENIX Workshop on Offensive Technologies (WOOT 20). USENIX Association, Aug. 2020.
BibTeX
@inproceedings {AFLplusplus-Woot20,
author = {Andrea Fioraldi and Dominik Maier and Heiko Ei{\ss}feldt and Marc Heuse},
title = {{AFL++}: Combining Incremental Steps of Fuzzing Research},
booktitle = {14th {USENIX} Workshop on Offensive Technologies ({WOOT} 20)},
year = {2020},
publisher = {{USENIX} Association},
month = aug,
}
Лицензия
AFL++ распространяется под лицензией GNU AGPL-3.0-or-later. Короче говоря, вы можете использовать AFL++ тремя способами:
-
Бесплатно, под AGPL-3.0-or-later: по умолчанию. Используйте, изменяйте и делитесь AFL++; если вы запускаете модифицированную версию как сетевой сервис, AGPL требует, чтобы вы предлагали своим пользователям соответствующий исходный код. Полный текст: LICENSE.
-
Пофайлово, под лицензией в заголовке файла: проект содержит файлы как под
SPDX-License-Identifier: AGPL-3.0-or-later, так и подSPDX-License-Identifier: Apache-2.0. Всегда проверяйте заголовок используемого вами файла и соблюдайте указанную там лицензию; файлы, помеченные Apache-2.0, могут быть повторно использованы по отдельности под лицензией Apache-2.0. (Некоторые встроенные сторонние файлы имеют другие лицензии, например, плагин GCC под GPL-3.0-or-later и проходы LLVM SanitizerCoverage под Apache-2.0-WITH-LLVM-exception — каждый помечен своим собственным идентификатором SPDX.) Обратите внимание, что объединённый бинарный файлafl-fuzzвключает файлы AGPL, поэтому программа в целом является AGPL. -
Коммерческая лицензия: опционально, для организаций, которые не могут или не хотят соблюдать AGPL. Проект не получает денег. Вместо этого вы жертвуете EUR 20,000 (€20,000) либо EFF, либо CCC и отправляете по электронной почте подтверждение на [email protected]; ваша лицензия вступает в силу с даты пожертвования на один год (возобновляется путём повторного пожертвования). Полные условия: LICENSE.COMMERCIAL.
Встроенные сторонние компоненты (например, xxHash, t1ha, libFuzzer, подмодули) сохраняют собственные лицензии. Для полного обзора простым языком см. LICENSING.md.