
AFLplusplus v5.03c
Der Fuzzer afl++ ist afl mit Community-Patches, QEMU 5.1 Upgrade, kollisionsfreier Coverage, verbessertem laf-intel & redqueen, AFLfast++-Power-Schedules, MOpt-Mutatoren, unicorn_mode und vielem mehr!
American Fuzzy Lop plus plus (AFL++)
Release-Version: 5.03c
GitHub-Version: 5.03c
Repository: https://github.com/AFLplusplus/AFLplusplus
AFL++ wird gepflegt von:
- Marc "van Hauser" Heuse [email protected]
- Dominik Maier [email protected]
- Andrea Fioraldi [email protected]
- Heiko "hexcoder-" Eissfeldt [email protected]
- frida_mode wird gepflegt von @Worksbutnottested
Ursprünglich entwickelt von Michal "lcamtuf" Zalewski.
AFL++ ist ein überlegener Fork von Googles AFL - mehr Geschwindigkeit, mehr und bessere Mutationen, mehr und bessere Instrumentierung, Unterstützung für benutzerdefinierte Module usw.
AFL++ ist unter der AGPL-3.0-or-later lizenziert und enthält außerdem
Dateien unter der Apache-2.0-Lizenz.
Alles, was in eine Fuzzing-Harness kompiliert wird, ist und bleibt unter der
Apache-2.0-Lizenz lizenziert.
Jede Datei gibt ihre eigene Lizenz in ihrem SPDX-License-Identifier-Header an
- das ist die Lizenz, die Sie für diese Datei befolgen müssen. Eine optionale kommerzielle Lizenz ist für Organisationen verfügbar, die die AGPL nicht nutzen können (erhältlich durch eine Spende für einen guten Zweck - das Projekt und seine Betreuer erhalten kein Geld). Siehe LICENSING.md für einen Überblick in einfacher Sprache und den Abschnitt Lizenz unten für Details.
Erste Schritte
Hier sind einige Informationen für den Einstieg:
- Für einen Überblick über die AFL++-Dokumentation und eine sehr hilfreiche grafische Anleitung besuchen Sie bitte docs/README.md.
- Für den Einstieg mit Tutorials gehen Sie zu docs/tutorials.md.
- Für Releases siehe den
Releases-Tab und
Branches. Die besten Branches sind jedoch
stableoderdev- je nach Ihrer Risikobereitschaft. Werfen Sie auch einen Blick auf die Liste der wichtigen Änderungen in AFL++ und die Liste der Funktionen. - Wenn Sie AFL++ für Ihre akademische Arbeit verwenden möchten, schauen Sie auf die Papers-Seite auf der Website.
- Um unsere Arbeit zu zitieren, sehen Sie sich den Abschnitt Zitieren an.
- Für Vergleiche verwenden Sie das fuzzbench-
aflplusplus-Setup oderafl-clang-fastmitAFL_LLVM_CMPLOG=1. Sie finden dieaflplusplus-Standardkonfiguration auf Googles fuzzbench.
AFL++ erstellen und installieren
Um AFL++ einfach mit allem kompiliert verfügbar zu haben, ziehen Sie das Image direkt vom Docker Hub (verfügbar für x86_64 und arm64):
docker pull aflplusplus/aflplusplus
docker run -ti -v /location/of/your/target:/src aflplusplus/aflplusplus
Dieses Image wird automatisch veröffentlicht, wenn ein Push auf den
stable-Branch erfolgt (siehe Branches). Wenn Sie den obigen Befehl
verwenden, finden Sie Ihren Ziel-Quellcode im Container unter /src.
Hinweis: Sie können auch aflplusplus/aflplusplus:dev ziehen, das den
aktuellsten Entwicklungsstand von AFL++ darstellt.
Um AFL++ selbst zu erstellen - was wir empfehlen - fahren Sie fort bei docs/INSTALL.md.
Schnellstart: Fuzzing mit AFL++
HINWEIS: Bevor Sie beginnen, lesen Sie bitte über die Risiken des gesunden Menschenverstands beim Fuzzing.
Dies ist ein Schnellstart zum Fuzzing von Zielen, deren Quellcode verfügbar ist. Um den Prozess im Detail zu lesen, siehe docs/fuzzing_in_depth.md.
Um mehr über das Fuzzing anderer Ziele zu erfahren, siehe:
- Nur-Binär-Ziele: docs/fuzzing_binary-only_targets.md
- Netzwerkdienste: docs/best_practices.md#fuzzing-a-network-service
- GUI-Programme: docs/best_practices.md#fuzzing-a-gui-program
Schritt-für-Schritt-Schnellstart:
-
Kompilieren Sie das zu fuzzingende Programm oder die Bibliothek mit
afl-cc. Ein üblicher Weg wäre:CC=/path/to/afl-cc CXX=/path/to/afl-c++ ./configure --disable-shared make clean all -
Besorgen Sie sich eine kleine, aber gültige Eingabedatei, die für das Programm sinnvoll ist. Beim Fuzzing von ausführlicher Syntax (SQL, HTTP usw.) erstellen Sie zusätzlich ein Wörterbuch, wie in dictionaries/README.md beschrieben.
-
Wenn das Programm von stdin liest, führen Sie
afl-fuzzwie folgt aus:./afl-fuzz -i seeds_dir -o output_dir -- \ /path/to/tested/program [...program's cmdline...]Um ein Wörterbuch hinzuzufügen, fügen Sie
-x /path/to/dictionary.txtzu afl-fuzz hinzu.Wenn das Programm Eingaben aus einer Datei liest, können Sie
@@in die Befehlszeile des Programms setzen; AFL++ fügt dort einen automatisch generierten Dateinamen für Sie ein. -
Untersuchen Sie alles, was in der Fuzzer-Oberfläche rot angezeigt wird, indem Sie umgehend docs/afl-fuzz_approach.md#understanding-the-status-screen konsultieren.
-
Sie finden gefundene Abstürze und Hänger in den Unterverzeichnissen
crashes/undhangs/im-o output_dir-Verzeichnis. Sie können die Abstürze wiedergeben, indem Sie sie dem Ziel zuführen, z. B. wenn Ihr Ziel stdin verwendet:cat output_dir/crashes/id:000000,* | /path/to/tested/program [...program's cmdline...]Sie können Cores erzeugen oder gdb direkt verwenden, um die Abstürze zu verfolgen.
-
Für die Coverage-Analyse Ihres Fuzzings empfehlen wir unsere Partner-Tools cov-analysis (quellbasierte Coverage-Berichte aus einem Fuzzing-Korpus) und fuzz-reachability (statische Analyse, welche Funktionen eine Harness erreichen kann, um umsetzbare Coverage-Lücken von totem Code zu unterscheiden und Instrumentierungs-Allowlists zu generieren)
-
Wir können es nicht genug betonen - wenn Sie effektiv fuzzen möchten, lesen Sie das Dokument docs/fuzzing_in_depth.md!
Kontakt
Fragen? Bedenken? Fehlerberichte?
- Die Mitwirkenden sind erreichbar über (z. B. durch das Erstellen eines Issues
- aber nur für AFL++-Fehler!): https://github.com/AFLplusplus/AFLplusplus.
- Werfen Sie einen Blick auf unsere FAQ und Best Practices.
- Am besten: Treten Sie dem Fuzzing-Zulip-Server bei!
Branches
Die folgenden Branches existieren:
- release: das neueste Release
- stable: stabiler Stand von AFL++ - er wird von Zeit zu Zeit von dev synchronisiert, wenn wir mit seiner Stabilität zufrieden sind. Dies ist der Standard-Branch.
- dev: Entwicklungsstand von AFL++ - absolut aktuell und Sie könnten einen Checkout erwischen, der nicht kompiliert oder einen Fehler hat. Wir akzeptieren nur PRs (Pull Requests) für den 'dev'-Branch!
- (jeder andere): experimentelle Branches zur Arbeit an bestimmten Funktionen oder zum Testen neuer Funktionalitäten oder Änderungen.
Hilfe gesucht
Schauen Sie sich unsere Issues-Liste mit dem Tag "help wanted" an. Dies kann Ihr Weg sein, AFL++ zu unterstützen und dazu beizutragen - erweitern Sie es, um etwas Cooles zu tun. Wenn Sie andere Ideen haben - erstellen Sie einfach ein Issue und schlagen Sie es vor!
Für alle, die beitragen möchten (und Pull Requests senden), lesen Sie bitte unsere Beitragsrichtlinien, bevor Sie einreichen.
Besonderer Dank
Viele der Verbesserungen am ursprünglichen AFL und AFL++ wären ohne Feedback, Fehlerberichte oder Patches unserer Mitwirkenden nicht möglich gewesen.
Danke! (Für Personen, die Pull Requests senden - bitte fügen Sie sich selbst zu dieser Liste hinzu :-)
Liste der Mitwirkenden
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
Zitieren
Wenn Sie AFL++ in wissenschaftlichen Arbeiten verwenden, ziehen Sie in Betracht, unsere Arbeit zu zitieren, die auf der WOOT'20 präsentiert wurde:
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,
}
Lizenz
AFL++ ist unter der GNU AGPL-3.0-or-later lizenziert. Kurz gesagt können Sie AFL++ auf drei Arten verwenden:
-
Kostenlos, unter der AGPL-3.0-or-later: die Standardoption. Verwenden, modifizieren und teilen Sie AFL++; wenn Sie eine modifizierte Version als Netzwerkdienst ausführen, verlangt die AGPL, dass Sie Ihren Benutzern den entsprechenden Quellcode anbieten. Vollständiger Text: LICENSE.
-
Pro Datei, unter der Lizenz in ihrem Header: das Projekt enthält Dateien sowohl unter
SPDX-License-Identifier: AGPL-3.0-or-laterals auch unterSPDX-License-Identifier: Apache-2.0. Überprüfen Sie immer den Header der Datei, die Sie verwenden, und befolgen Sie die dort angegebene Lizenz; Dateien, die als Apache-2.0 gekennzeichnet sind, können einzeln unter der Apache-2.0-Lizenz wiederverwendet werden. (Einige gebündelte Drittanbieter-Dateien tragen andere Lizenzen, z. B. das GCC-Plugin unter GPL-3.0-or-later und die LLVM-SanitizerCoverage-Passes unter Apache-2.0-WITH-LLVM-exception - jede durch ihren eigenen SPDX-Bezeichner gekennzeichnet.) Beachten Sie, dass die kombinierteafl-fuzz-Binärdatei AGPL-Dateien enthält, sodass das Programm als Ganzes AGPL ist. -
Kommerzielle Lizenz: optional, für Organisationen, die die AGPL nicht einhalten können oder wollen. Das Projekt erhält kein Geld. Stattdessen spenden Sie EUR 20.000 (€20.000) an entweder die EFF oder den CCC und senden den Nachweis per E-Mail an [email protected]; Ihre Lizenz ist dann ab dem Spendedatum für ein Jahr wirksam (verlängerbar durch erneute Spende). Vollständige Bedingungen: LICENSE.COMMERCIAL.
Gebündelte Drittanbieter-Komponenten (z. B. xxHash, t1ha, libFuzzer, Submodule) behalten ihre eigenen Lizenzen. Für den vollständigen Überblick in einfacher Sprache siehe LICENSING.md.