Назад к обновлениям
New releaseSep 4, 2026

AFLplusplus v5.03c

Фаззер afl++ — это afl с патчами сообщества, обновлением qemu 5.1, покрытием без коллизий, улучшенными laf-intel & redqueen, планировщиками мощности AFLfast++, мутаторами MOpt, unicorn_mode и многим другим!

Поделиться

American Fuzzy Lop plus plus (AFL++)

AFL++ logo

Версия релиза: 5.03c

Версия GitHub: 5.03c

Репозиторий: https://github.com/AFLplusplus/AFLplusplus

AFL++ поддерживается:

Изначально разработан 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.

Чтобы узнать о фаззинге других целей, см.:

Пошаговый быстрый старт:

  1. Скомпилируйте программу или библиотеку для фаззинга с помощью afl-cc. Обычный способ сделать это:

    CC=/path/to/afl-cc CXX=/path/to/afl-c++ ./configure --disable-shared
    make clean all
    
  2. Получите небольшой, но валидный входной файл, который имеет смысл для программы. При фаззинге многословного синтаксиса (SQL, HTTP и т.д.) также создайте словарь, как описано в dictionaries/README.md.

  3. Если программа читает из stdin, запустите afl-fuzz следующим образом:

    ./afl-fuzz -i seeds_dir -o output_dir -- \
    /path/to/tested/program [...аргументы командной строки программы...]
    

    Чтобы добавить словарь, добавьте -x /path/to/dictionary.txt к afl-fuzz.

    Если программа принимает входные данные из файла, вы можете поместить @@ в командную строку программы; AFL++ автоматически подставит туда сгенерированное имя файла.

  4. Исследуйте всё, что показано красным в интерфейсе фаззера, незамедлительно обратившись к docs/afl-fuzz_approach.md#understanding-the-status-screen.

  5. Вы найдёте обнаруженные краши и зависания в подкаталогах crashes/ и hangs/ в каталоге -o output_dir. Вы можете воспроизвести краши, передав их цели, например, если ваша цель использует stdin:

    cat output_dir/crashes/id:000000,* | /path/to/tested/program [...аргументы командной строки программы...]
    

    Вы можете генерировать core-файлы или использовать gdb напрямую для анализа крашей.

  6. Для анализа покрытия вашего фаззинга мы рекомендуем наши партнёрские инструменты cov-analysis (отчёты о покрытии на основе исходного кода из корпуса фаззинга) и fuzz-reachability (статический анализ того, какие функции может достичь харнесс, чтобы отличить действенные пробелы в покрытии от мёртвого кода и генерировать списки разрешений для инструментирования)

  7. Мы не можем подчеркнуть это достаточно — если вы хотите эффективно фаззить, прочитайте документ docs/fuzzing_in_depth.md!

Контакты

Вопросы? Проблемы? Отчёты об ошибках?

Ветки

Существуют следующие ветки:

  • 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,
}

zread Ask DeepWiki

Лицензия

AFL++ распространяется под лицензией GNU AGPL-3.0-or-later. Короче говоря, вы можете использовать AFL++ тремя способами:

  1. Бесплатно, под AGPL-3.0-or-later: по умолчанию. Используйте, изменяйте и делитесь AFL++; если вы запускаете модифицированную версию как сетевой сервис, AGPL требует, чтобы вы предлагали своим пользователям соответствующий исходный код. Полный текст: LICENSE.

  2. Пофайлово, под лицензией в заголовке файла: проект содержит файлы как под 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.

  3. Коммерческая лицензия: опционально, для организаций, которые не могут или не хотят соблюдать AGPL. Проект не получает денег. Вместо этого вы жертвуете EUR 20,000 (€20,000) либо EFF, либо CCC и отправляете по электронной почте подтверждение на [email protected]; ваша лицензия вступает в силу с даты пожертвования на один год (возобновляется путём повторного пожертвования). Полные условия: LICENSE.COMMERCIAL.

Встроенные сторонние компоненты (например, xxHash, t1ha, libFuzzer, подмодули) сохраняют собственные лицензии. Для полного обзора простым языком см. LICENSING.md.

Категории