
AFLplusplus v5.03c
AFL++ è un fuzzer all'avanguardia, e #1 nei benchmark. Originariamente era basato su AFL. Oggi viene fornito con qemu 5.1, copertura collision-free, laf-intel & redqueen migliorati, power schedules 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: