
AFLplusplus v5.03c
Le fuzzer afl++ est afl avec des correctifs communautaires, une mise à niveau vers qemu 5.1, une couverture sans collision, une laf-intel et redqueen améliorés, les plannings de puissance AFLfast++, les mutateurs MOpt, unicorn_mode, et bien plus encore !
American Fuzzy Lop plus plus (AFL++)
Version de la release : 5.03c
Version GitHub : 5.03c
Dépôt : https://github.com/AFLplusplus/AFLplusplus
AFL++ est maintenu par :
- Marc "van Hauser" Heuse [email protected]
- Dominik Maier [email protected]
- Andrea Fioraldi [email protected]
- Heiko "hexcoder-" Eissfeldt [email protected]
- frida_mode est maintenu par @Worksbutnottested
Développé à l'origine par Michal "lcamtuf" Zalewski.
AFL++ est un fork supérieur à l'AFL de Google - plus de vitesse, plus et de meilleures mutations, plus et une meilleure instrumentation, prise en charge de modules personnalisés, etc.
AFL++ est sous licence AGPL-3.0-or-later, et contient également des fichiers
sous licence Apache-2.0.
Tout ce qui est compilé dans un harnais de fuzzing est et restera sous licence
Apache 2.0.
Chaque fichier indique sa propre licence dans son en-tête SPDX-License-Identifier
— c'est la licence que vous devez respecter pour ce fichier.
Une licence commerciale optionnelle est disponible pour les organisations
qui ne peuvent pas utiliser l'AGPL (obtenue en faisant un don à une bonne cause —
le projet et ses mainteneurs ne reçoivent aucun argent).
Voir LICENSING.md pour un aperçu en langage clair et la
section Licence ci-dessous pour plus de détails.
Pour commencer
Voici quelques informations pour vous aider à démarrer :
- Pour un aperçu de la documentation d'AFL++ et un guide graphique très utile, veuillez consulter docs/README.md.
- Pour commencer avec des tutoriels, allez sur docs/tutorials.md.
- Pour les releases, voir l'
onglet Releases et
branches. Les meilleures branches à utiliser sont cependant
stableoudev— selon votre appétit pour le risque. Jetez également un œil à la liste des changements importants dans AFL++ et à la liste des fonctionnalités. - Si vous souhaitez utiliser AFL++ pour vos travaux académiques, consultez la page des publications sur le site web.
- Pour citer nos travaux, regardez la section Cite.
- Pour les comparaisons, utilisez la configuration
aflplusplusde fuzzbench, ou utilisezafl-clang-fastavecAFL_LLVM_CMPLOG=1. Vous pouvez trouver la configuration par défaut d'aflplusplussur le fuzzbench de Google.
Compilation et installation d'AFL++
Pour avoir AFL++ facilement disponible avec tout compilé, tirez l'image directement depuis Docker Hub (disponible pour x86_64 et arm64) :
docker pull aflplusplus/aflplusplus
docker run -ti -v /location/of/your/target:/src aflplusplus/aflplusplus
Cette image est automatiquement publiée lorsqu'un push est effectué sur la
branche stable (voir branches). Si vous utilisez la commande
ci-dessus, vous trouverez votre code source cible dans /src dans le conteneur.
Remarque : vous pouvez également tirer aflplusplus/aflplusplus:dev qui
correspond à l'état de développement le plus récent d'AFL++.
Pour compiler AFL++ vous-même — ce que nous recommandons — continuez sur docs/INSTALL.md.
Démarrage rapide : Fuzzing avec AFL++
REMARQUE : Avant de commencer, veuillez lire les risques de bon sens liés au fuzzing.
Ceci est un démarrage rapide pour fuzzer des cibles dont le code source est disponible. Pour lire le processus en détail, voir docs/fuzzing_in_depth.md.
Pour apprendre à fuzzer d'autres types de cibles, voir :
- Cibles binaires uniquement : docs/fuzzing_binary-only_targets.md
- Services réseau : docs/best_practices.md#fuzzing-a-network-service
- Programmes GUI : docs/best_practices.md#fuzzing-a-gui-program
Démarrage rapide étape par étape :
-
Compilez le programme ou la bibliothèque à fuzzer en utilisant
afl-cc. Une façon courante de faire cela serait :CC=/path/to/afl-cc CXX=/path/to/afl-c++ ./configure --disable-shared make clean all -
Obtenez un petit fichier d'entrée valide mais qui a du sens pour le programme. Lorsque vous fuzzez une syntaxe verbeuse (SQL, HTTP, etc.), créez également un dictionnaire comme décrit dans dictionaries/README.md.
-
Si le programme lit depuis stdin, exécutez
afl-fuzzcomme ceci :./afl-fuzz -i seeds_dir -o output_dir -- \ /path/to/tested/program [...program's cmdline...]Pour ajouter un dictionnaire, ajoutez
-x /path/to/dictionary.txtà afl-fuzz.Si le programme prend l'entrée depuis un fichier, vous pouvez mettre
@@dans la ligne de commande du programme ; AFL++ y placera un nom de fichier auto-généré pour vous. -
Examinez tout ce qui est affiché en rouge dans l'interface du fuzzer en consultant rapidement docs/afl-fuzz_approach.md#understanding-the-status-screen.
-
Vous trouverez les crashes et les blocages détectés dans les sous-répertoires
crashes/ethangs/dans le répertoire-o output_dir. Vous pouvez rejouer les crashes en les fournissant à la cible, par exemple si votre cible utilise stdin :cat output_dir/crashes/id:000000,* | /path/to/tested/program [...program's cmdline...]Vous pouvez générer des core dumps ou utiliser gdb directement pour suivre les crashes.
-
Pour l'analyse de couverture de votre fuzzing, nous recommandons nos outils partenaires cov-analysis (rapports de couverture basés sur le code source à partir d'un corpus de fuzzing) et fuzz-reachability (analyse statique des fonctions qu'un harnais peut atteindre, pour distinguer les lacunes de couverture exploitables du code mort et pour générer des listes blanches d'instrumentation)
-
Nous ne saurions trop insister — si vous voulez fuzzer efficacement, lisez le document docs/fuzzing_in_depth.md !
Contact
Des questions ? Des préoccupations ? Des rapports de bugs ?
- Les contributeurs peuvent être joints via (par exemple, en créant une issue — mais uniquement pour les défauts d'AFL++ !) : https://github.com/AFLplusplus/AFLplusplus.
- Jetez un œil à notre FAQ et à nos Bonnes pratiques.
- Le mieux : rejoignez le serveur Zulip Fuzzing !
Branches
Les branches suivantes existent :
- release : la dernière release
- stable : état stable d'AFL++ — elle est synchronisée depuis dev de temps en temps lorsque nous sommes satisfaits de sa stabilité. C'est la branche par défaut.
- dev : état de développement d'AFL++ — à la pointe de la technologie et vous pourriez obtenir une version qui ne compile pas ou qui contient un bug. Nous n'acceptons les PR (pull requests) que pour la branche 'dev' !
- (toute autre) : branches expérimentales pour travailler sur des fonctionnalités spécifiques ou tester de nouvelles fonctionnalités ou modifications.
Aide recherchée
Consultez notre liste d'issues avec le tag "help wanted". Cela peut être votre façon de soutenir et de contribuer à AFL++ — étendez-le pour faire quelque chose de cool. Si vous avez d'autres idées — créez simplement une issue et proposez-la !
Pour tous ceux qui souhaitent contribuer (et envoyer des pull requests), veuillez lire nos directives de contribution avant de soumettre.
Remerciements particuliers
Beaucoup des améliorations apportées à l'AFL original et à AFL++ n'auraient pas été possibles sans les retours, les rapports de bugs ou les correctifs de nos contributeurs.
Merci ! (Pour les personnes envoyant des pull requests — veuillez vous ajouter à cette liste :-)
Liste des contributeurs
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
Cite
Si vous utilisez AFL++ dans des travaux scientifiques, envisagez de citer notre article présenté à 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,
}
Licence
AFL++ est sous licence GNU AGPL-3.0-or-later. En bref, vous pouvez utiliser AFL++ de trois manières :
-
Gratuitement, sous AGPL-3.0-or-later : le mode par défaut. Utilisez, modifiez et partagez AFL++ ; si vous exécutez une version modifiée comme service réseau, l'AGPL vous oblige à offrir à vos utilisateurs le code source correspondant. Texte complet : LICENSE.
-
Par fichier, sous la licence indiquée dans son en-tête : le projet contient des fichiers sous
SPDX-License-Identifier: AGPL-3.0-or-lateret sousSPDX-License-Identifier: Apache-2.0. Vérifiez toujours l'en-tête du fichier que vous utilisez et respectez la licence qui y est indiquée ; les fichiers marqués Apache-2.0 peuvent être réutilisés individuellement sous la licence Apache-2.0. (Quelques fichiers tiers inclus portent d'autres licences, par exemple le plugin GCC sous GPL-3.0-or-later et les passes LLVM SanitizerCoverage sous Apache-2.0-WITH-LLVM-exception — chacune marquée par son propre identifiant SPDX.) Notez que le binaire combinéafl-fuzzinclut des fichiers AGPL, donc le programme dans son ensemble est AGPL. -
Licence commerciale : optionnelle, pour les organisations qui ne peuvent pas ou ne veulent pas se conformer à l'AGPL. Le projet ne reçoit aucun argent. À la place, vous faites un don de 20 000 EUR (20 000 €) à l'EFF ou au CCC et envoyez une preuve par e-mail à [email protected] ; votre licence est alors effective à partir de la date du don pour un an (renouvelable en refaisant un don). Conditions complètes : LICENSE.COMMERCIAL.
Les composants tiers inclus (par exemple xxHash, t1ha, libFuzzer, sous-modules) conservent leurs propres licences. Pour l'aperçu complet en langage clair, voir LICENSING.md.