Torna agli aggiornamenti
New releaseSep 4, 2026

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!

Condividi

American Fuzzy Lop plus plus (AFL++)

AFL++ logo

Versione di rilascio: 5.03c

Versione GitHub: 5.03c

Repository: https://github.com/AFLplusplus/AFLplusplus

AFL++ è mantenuto da:

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 stable o dev, 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 aflplusplus di fuzzbench, oppure usa afl-clang-fast con AFL_LLVM_CMPLOG=1. Puoi trovare la configurazione predefinita di aflplusplus su 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:

Avvio rapido passo dopo passo:

  1. 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
    
  2. 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.

  3. Se il programma legge da stdin, esegui afl-fuzz in 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.txt ad 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.

  4. Indaga su qualsiasi cosa mostrata in rosso nell'interfaccia del fuzzer consultando prontamente docs/afl-fuzz_approach.md#understanding-the-status-screen.

  5. Troverai i crash e gli hang rilevati nelle sottodirectory crashes/ e hangs/ 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.

  6. 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).

  7. 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?

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

zread Ask DeepWiki

Licenza

AFL++ è concesso in licenza GNU AGPL-3.0-or-later. In breve, puoi usare AFL++ in tre modi:

  1. 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.

  2. Per file, sotto la licenza nella sua intestazione: il progetto contiene file sia con SPDX-License-Identifier: AGPL-3.0-or-later che con SPDX-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 combinato afl-fuzz include file AGPL, quindi il programma nel suo insieme è AGPL.

  3. 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.

Categorie