
AFLplusplus v5.03c
Il fuzzer afl++ è afl con patch della comunità, aggiornamento a qemu 5.1, copertura senza collisioni, laf-intel & redqueen migliorati, pianificazioni di potenza AFLfast++, mutatori MOpt, unicorn_mode e molto altro!
American Fuzzy Lop plus plus (AFL++)
Versione di rilascio: 5.03c
Versione GitHub: 5.03c
Repository: https://github.com/AFLplusplus/AFLplusplus
AFL++ è mantenuto da:
- Marc "van Hauser" Heuse [email protected]
- Dominik Maier [email protected]
- Andrea Fioraldi [email protected]
- Heiko "hexcoder-" Eissfeldt [email protected]
- frida_mode è mantenuto da @Worksbutnottested
Originariamente sviluppato da Michal "lcamtuf" Zalewski.
AFL++ è un fork superiore rispetto ad AFL di Google: più velocità, più e migliori mutazioni, più e migliore strumentazione, supporto a moduli personalizzati, ecc.
AFL++ è concesso in licenza AGPL-3.0-or-later e contiene anche file sotto licenza Apache-2.0.
Tutto ciò che viene compilato in un harness di fuzzing è e resterà concesso in licenza Apache 2.0.
Ogni file dichiara la propria licenza nell'intestazione SPDX-License-Identifier: quella è
la licenza che devi seguire per quel file.
È disponibile una licenza commerciale opzionale per le organizzazioni che
non possono utilizzare l'AGPL (ottenuta donando a una buona causa: il progetto e i suoi
manutentori non ricevono denaro).
Consulta LICENSING.md per una panoramica in linguaggio semplice e la
sezione Licenza qui sotto per i dettagli.
Per iniziare
Ecco alcune informazioni per iniziare:
- Per una panoramica della documentazione di AFL++ e una guida grafica molto utile, visita docs/README.md.
- Per iniziare con i tutorial, vai su docs/tutorials.md.
- Per i rilasci, consulta la
scheda Releases e
branches. I branch migliori da usare sono comunque
stableodev, a seconda della tua propensione al rischio. Dai anche un'occhiata all'elenco delle modifiche importanti in AFL++ e all'elenco delle funzionalità. - Se vuoi usare AFL++ per il tuo lavoro accademico, consulta la pagina dei paper sul sito web.
- Per citare il nostro lavoro, guarda la sezione Cite.
- Per i confronti, usa la configurazione
aflplusplusdi fuzzbench, oppure usaafl-clang-fastconAFL_LLVM_CMPLOG=1. Puoi trovare la configurazione predefinita diaflplusplussu fuzzbench di Google.
Compilazione e installazione di AFL++
Per avere AFL++ facilmente disponibile con tutto compilato, estrai l'immagine direttamente da Docker Hub (disponibile sia per x86_64 che per arm64):
docker pull aflplusplus/aflplusplus
docker run -ti -v /location/of/your/target:/src aflplusplus/aflplusplus
Questa immagine viene pubblicata automaticamente quando viene effettuato un push al branch stable
(vedi branches). Se usi il comando sopra, troverai il codice sorgente del tuo
target in /src nel container.
Nota: puoi anche estrarre aflplusplus/aflplusplus:dev che è lo stato di sviluppo più recente
di AFL++.
Per compilare AFL++ da solo — cosa che raccomandiamo — continua su docs/INSTALL.md.
Avvio rapido: Fuzzing con AFL++
NOTA: prima di iniziare, leggi i rischi di buon senso del fuzzing.
Questa è una guida rapida per il fuzzing di target con codice sorgente disponibile. Per leggere il processo in dettaglio, vedi docs/fuzzing_in_depth.md.
Per saperne di più sul fuzzing di altri target, vedi:
- Target solo binari: docs/fuzzing_binary-only_targets.md
- Servizi di rete: docs/best_practices.md#fuzzing-a-network-service
- Programmi GUI: docs/best_practices.md#fuzzing-a-gui-program
Avvio rapido passo dopo passo:
-
Compila il programma o la libreria da sottoporre a fuzzing usando
afl-cc. Un modo comune per farlo sarebbe:CC=/path/to/afl-cc CXX=/path/to/afl-c++ ./configure --disable-shared make clean all -
Ottieni un piccolo ma valido file di input che abbia senso per il programma. Quando fai fuzzing su sintassi verbose (SQL, HTTP, ecc.), crea anche un dizionario come descritto in dictionaries/README.md.
-
Se il programma legge da stdin, esegui
afl-fuzzin questo modo:./afl-fuzz -i seeds_dir -o output_dir -- \ /path/to/tested/program [...program's cmdline...]Per aggiungere un dizionario, aggiungi
-x /path/to/dictionary.txtad afl-fuzz.Se il programma riceve input da un file, puoi inserire
@@nella riga di comando del programma; AFL++ inserirà automaticamente un nome di file generato al suo posto. -
Indaga su qualsiasi cosa mostrata in rosso nell'interfaccia del fuzzer consultando prontamente docs/afl-fuzz_approach.md#understanding-the-status-screen.
-
Troverai i crash e gli hang rilevati nelle sottodirectory
crashes/ehangs/nella directory-o output_dir. Puoi riprodurre i crash fornendoli al target, ad es. se il tuo target usa stdin:cat output_dir/crashes/id:000000,* | /path/to/tested/program [...program's cmdline...]Puoi generare core o usare gdb direttamente per dare seguito ai crash.
-
Per l'analisi di copertura del tuo fuzzing raccomandiamo i nostri strumenti partner cov-analysis (report di copertura basati sul codice sorgente da un corpus di fuzzing) e fuzz-reachability (analisi statica di quali funzioni un harness può raggiungere, per distinguere le lacune di copertura azionabili dal codice morto e per generare allowlist di strumentazione).
-
Non possiamo sottolinearlo abbastanza: se vuoi fare fuzzing in modo efficace, leggi il documento docs/fuzzing_in_depth.md!
Contatti
Domande? Preoccupazioni? Segnalazioni di bug?
- I contributori possono essere contattati tramite (ad es. creando un issue — ma solo per difetti di AFL++!): https://github.com/AFLplusplus/AFLplusplus.
- Dai un'occhiata alle nostre FAQ e alle Best Practices.
- Meglio: unisciti al server Zulip di Fuzzing!
Branches
Esistono i seguenti branch:
- release: l'ultimo rilascio
- stable: stato stabile di AFL++ — viene sincronizzato da dev di tanto in tanto quando siamo soddisfatti della sua stabilità. Questo è il branch predefinito.
- dev: stato di sviluppo di AFL++ — all'avanguardia e potresti ottenere un checkout che non compila o che ha un bug. Accettiamo PR (pull request) solo per il branch 'dev'!
- (qualsiasi altro): branch sperimentali per lavorare su funzionalità specifiche o testare nuove funzionalità o modifiche.
Cerchiamo aiuto
Consulta il nostro elenco di issue con il tag "help wanted". Questo può essere il tuo modo per supportare e contribuire ad AFL++: estendilo per fare qualcosa di interessante. Se hai altre idee, crea semplicemente un issue e proponila!
Per tutti coloro che vogliono contribuire (e inviare pull request), leggi le nostre linee guida per i contributi prima di inviare.
Ringraziamenti speciali
Molti dei miglioramenti all'AFL originale e ad AFL++ non sarebbero stati possibili senza feedback, segnalazioni di bug o patch dai nostri contributori.
Grazie! (Per le persone che inviano pull request — aggiungetevi a questo elenco :-)
Elenco dei contributori
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
Se usi AFL++ in lavori scientifici, considera di citare il nostro paper presentato a 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,
}
Licenza
AFL++ è concesso in licenza GNU AGPL-3.0-or-later. In breve, puoi usare AFL++ in tre modi:
-
Gratuito, sotto AGPL-3.0-or-later: l'opzione predefinita. Usa, modifica e condividi AFL++; se esegui una versione modificata come servizio di rete, l'AGPL richiede di offrire ai tuoi utenti il codice sorgente corrispondente. Testo completo: LICENSE.
-
Per file, sotto la licenza nella sua intestazione: il progetto contiene file sia con
SPDX-License-Identifier: AGPL-3.0-or-laterche conSPDX-License-Identifier: Apache-2.0. Controlla sempre l'intestazione del file che usi e rispetta la licenza ivi indicata; i file marcati Apache-2.0 possono essere riutilizzati singolarmente sotto la Licenza Apache-2.0. (Alcuni file di terze parti inclusi hanno altre licenze, ad es. il plugin GCC sotto GPL-3.0-or-later e i pass di LLVM SanitizerCoverage sotto Apache-2.0-WITH-LLVM-exception — ciascuno contrassegnato dal proprio identificatore SPDX.) Nota che il binario combinatoafl-fuzzinclude file AGPL, quindi il programma nel suo insieme è AGPL. -
Licenza commerciale: opzionale, per le organizzazioni che non possono o non vogliono conformarsi all'AGPL. Il progetto non riceve denaro. Invece devi donare EUR 20.000 (€20.000) a una tra EFF o CCC e inviare via email la prova a [email protected]; la tua licenza è quindi effettiva dalla data della donazione per un anno (rinnovabile donando di nuovo). Termini completi: LICENSE.COMMERCIAL.
I componenti di terze parti inclusi (ad es. xxHash, t1ha, libFuzzer, sottomoduli) mantengono le proprie licenze. Per la panoramica completa in linguaggio semplice, vedi LICENSING.md.