
LibAFL v0.16.0
Libreria di Fuzzing Avanzata - Incastra il tuo Fuzzer insieme in Rust! Scala su core e macchine. Per Windows, Android, MacOS, Linux, no_std, ...
LibAFL, la libreria per fuzzing
Libreria Avanzata per Fuzzing - Combina i tuoi fuzzer e estendi le loro funzionalità usando Rust.
LibAFL è una collezione di componenti riutilizzabili di fuzzer, scritta in Rust, che ti offre molti dei vantaggi di un fuzzer già pronto, pur essendo completamente personalizzabile.
Alcune delle caratteristiche principali attualmente includono:
fast: Facciamo tutto il possibile in fase di compilazione, mantenendo il sovraccarico a runtime minimo. Gli utenti raggiungono 120k esecuzioni/sec in modalità Frida su un telefono (usando tutti i core).scalable:Low Level Message Passing,LLMPin breve, consente aLibAFLdi scalare quasi linearmente su più core e, via TCP, su più macchine.adaptable: Puoi sostituire ogni parte diLibAFL. Ad esempio,BytesInputè solo una possibile forma di input: sentiti libero di aggiungere un input basato su AST per fuzzing strutturato e altro.multi platform:LibAFLfunziona su Windows, macOS, iOS, Linux e Android, e altro.LibAFLpuò essere compilato in modalitàno_stdper iniettareLibAFLin target oscuri come dispositivi embedded e hypervisor.bring your own target: Supportiamo modalità solo binario, come Frida-Mode, e anche molteplici passaggi di compilazione per strumentazione basata su codice sorgente. Ovviamente è facile aggiungere backend di strumentazione personalizzati.
Concetti principali
LibAFL è veloce, multipiattaforma, compatibile con no_std e scala su core e macchine. Offre un crate principale che fornisce componenti di base per fuzzer personalizzati, libafl, una libreria contenente codice comune che può essere usata per la strumentazione dei target, libafl_targets, e una libreria che fornisce strumenti per avvolgere compilatori, libafl_cc. Offre integrazioni con framework di strumentazione popolari. Al momento, i backend supportati sono:
SanitizerCoverage, in libafl_targetsFrida, in libafl_fridaQEMUuser-mode e system mode, inclusi hook per emulazione, in libafl_qemuTinyInst, in libafl_tinyinst by elbiazo
Compilazione e installazione
Installa le dipendenze
- Il linguaggio di sviluppo Rust
-
Ti consigliamo vivamente di non usare ad esempio il pacchetto della tua distribuzione Linux poiché probabilmente è obsoleto. Piuttosto installa Rust direttamente, le istruzioni si trovano qui.
-
La versione minima supportata di Rust è definita. Puoi sempre controllare la versione attualmente richiesta nel Cargo.toml di LibAFL:
Se la versione di Rust installata è più vecchia di quella elencata in Cargo.toml, aggiorna all'ultima toolchain stabile:
rustup update stable
-
- Strumenti LLVM
- Gli strumenti LLVM (inclusi clang, clang++) sono necessari (più recenti di LLVM 15.0.0 fino a LLVM 18.1.3). Se stai usando Debian/Ubuntu, ancora una volta, raccomandiamo vivamente di installare il pacchetto da qui
- Just:
- Usiamo just per compilare i fuzzer nella directory
fuzzers/. Puoi trovare le istruzioni per installarlo nel tuo ambiente nel Manuale del Programmatore di Just.
- Usiamo just per compilare i fuzzer nella directory
Clona il repository LibAFL con
git clone https://github.com/AFLplusplus/LibAFL
Compila la libreria usando
cargo build --release
Compila la documentazione API con
cargo doc
Sfoglia il libro LibAFL (WIP!) con (richiede mdbook)
cd docs && mdbook serve
Per iniziare
Raccogliamo tutti i fuzzer di esempio in ./fuzzers. Assicurati di leggere la loro documentazione (e il codice sorgente), questo è il modo naturale per iniziare!
just run
Puoi eseguire ogni fuzzer di esempio con questo comando, purché la directory del fuzzer abbia un file Justfile. Il fuzzer più testato è ./fuzzers/inprocess/libfuzzer_libpng, un fuzzer multicore simile a libfuzzer che usa LibAFL per un harness libpng.
Risorse
- Guida all'installazione
- Documentazione API online
- Il libro
LibAFL(WIP) online o nel repo - Il nostro articolo di ricerca
- Il nostro talk all'RC3 che spiega i concetti fondamentali
- Il nostro talk al Fuzzcon Europe con una discussione passo-passo (un po' ma non troppo obsoleta) su come costruire alcuni fuzzer di esempio
- Le soluzioni del Fuzzing101 e serie di post sul blog di epi
- Post sul blog sul fuzzing solo binario con la libreria
libaf_qemu, Hacking TMNF - Fuzzing the game server, di RickdeJager. - Un Workshop Introduttivo a LibAFL, di Jordan Whitehead
Collaboratori
LibAFL è scritto e mantenuto da
- Andrea Fioraldi [email protected]
- Dominik Maier [email protected]
- s1341 [email protected]
- Dongjia Zhang [email protected]
- Addison Crump [email protected]
- Romain Malmain [email protected]
Contribuire
Per favore consulta CONTRIBUTING.md per le linee guida su come contribuire.
Debug
Il tuo fuzzer non funziona come previsto? Prova a leggere DEBUGGING.md per capire come fare debug dei tuoi problemi.
Citazione
Se usi LibAFL per il tuo lavoro accademico, per favore cita il seguente articolo:
@inproceedings{libafl,
author = {Andrea Fioraldi and Dominik Maier and Dongjia Zhang and Davide Balzarotti},
title = {{LibAFL: A Framework to Build Modular and Reusable Fuzzers}},
booktitle = {Proceedings of the 29th ACM conference on Computer and communications security (CCS)},
series = {CCS '22},
year = {2022},
month = {November},
location = {Los Angeles, U.S.A.},
publisher = {ACM},
}
Licenza
Concesso in licenza secondo una delle seguenti: Apache License, Version 2.0 o licenza MIT a tua scelta.Salvo dichiarazione contraria esplicita, qualsiasi contributo inviato intenzionalmente per l'inclusione in questo crate da parte tua, come definito nella licenza Apache-2.0, sarà concesso in doppia licenza come sopra, senza termini o condizioni aggiuntivi.