Salta ai contenuti

LibAFL - Framework di Fuzzing Modulare

LibAFL - Framework di Fuzzing Modulare Cheatsheet

LibAFL è un framework di fuzzing, non un fuzzer. Scritto in Rust dal team AFL++, fornisce blocchi costruttivi componibili — observer, feedback, mutatori, scheduler, stage, executor — che assembli in un fuzzer adatto al tuo target. La motivazione è che i fuzzer monolitici funzionano bene su target convenzionali e male su quelli insoliti (protocolli custom, firmware emulato, kernel, grammatiche), dove finisci per combattere il tool. Con LibAFL costruisci esattamente il fuzzer di cui il target ha bisogno, e ottieni scaling multi-core gratuitamente.

Costruire un fuzzer è più lavoro che eseguirne uno. Ricorri a LibAFL quando i tool out-of-the-box genuinamente non si adattano.

Setup

PassoComando
Nuovo progettocargo new my_fuzzer && cd my_fuzzer
Aggiungi LibAFLcargo add libafl libafl_bolts
Strumentazione del targetcargo add libafl_targets (o libafl_qemu, libafl_frida)
Costruiscicargo build --release

Concetti Principali

ComponenteRuolo
InputQuello che viene fuzzato (byte, albero di grammatica, syscall)
ObserverRegistra dati durante un”esecuzione (mappa di copertura, timing)
FeedbackDecide se un”esecuzione è stata “interessante”
ObjectiveDecide se un”esecuzione è una soluzione (un crash)
CorpusArchiviazione per input interessanti
MutatorTrasforma gli input
SchedulerSceglie il prossimo input da eseguire
StageUna fase applicata per input (muta, taglia, calibra)
ExecutorEsegue il target con un input

Un Fuzzer Minimo (forma)

// Struttura concettuale — vedi esempi di LibAFL per codice completo
let mut feedback = MaxMapFeedback::new(&edges_observer);
let mut objective = CrashFeedback::new();

let mut state = StdState::new(
    StdRand::with_seed(current_nanos()),
    InMemoryCorpus::new(),
    OnDiskCorpus::new("./crashes")?,
    &mut feedback,
    &mut objective,
)?;

let scheduler = QueueScheduler::new();
let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective);

let mut executor = InProcessExecutor::new(
    &mut harness, tuple_list!(edges_observer), &mut fuzzer, &mut state, &mut mgr,
)?;

let mutator = StdScheduledMutator::new(havoc_mutations());
let mut stages = tuple_list!(StdMutationalStage::new(mutator));

fuzzer.fuzz_loop(&mut stages, &mut executor, &mut state, &mut mgr)?;

Executor (Come il Target Viene Eseguito)

ExecutorUsa
InProcessExecutorPiù veloce; harness nello stesso processo
ForkserverExecutorStile AFL forkserver per binari esterni
CommandExecutorEsegui un comando esterno per input
libafl_qemuTarget emulati / fuzzing binary-only
libafl_fridaStrumentazione dinamica (binary-only)
libafl_nyxFuzzing di VM basato su snapshot

Feedback

FeedbackInteressante quando
MaxMapFeedbackNuovi edge di copertura colpiti
TimeFeedbackIl tempo di esecuzione cambia
CrashFeedbackIl target è crashato (objective)
TimeoutFeedbackIl target si è bloccato (objective)
NewHashFeedbackNuovo hash di stack di crash unico
Combinatorifeedback_or!, feedback_and! per comporre

Mutatori

MutatorFa
havoc_mutations()Mutazioni random standard di stile AFL
tokens_mutations()Inserimento di dictionary/token
Mutatori di grammaticaGenerazione consapevole di struttura
CustomImplementa il trait Mutator per il tuo tipo di input

I tipi di input custom più i mutatori custom sono la ragione principale per scegliere LibAFL — fuzzare un protocollo o un AST intelligentemente piuttosto che capovolgere byte.

Scaling Multi-Core

MeccanismoNota
LlmpRestartingEventManagerPassaggio di messaggi a basso overhead tra core
LauncherGenera un fuzzer per core con corpus condiviso
Sincronizzazione corpusGli input interessanti si propagano tra istanze
RiavvioSopravvive ai crash del processo fuzzer

LibAFL vs Fuzzer Pronti

AspettoLibAFLAFL++honggfuzz
ModelloCostruisci il tuoPronto per eseguirePronto per eseguire
SforzoAltoBassoBasso
FlessibilitàTotaleConfigurabileConfigurabile
Migliore perTarget insoliti, ricercaBinari standardInizio veloce, feedback hardware

Inizia con AFL++ o honggfuzz; passa a LibAFL quando lo scopo di input o il modello di esecuzione li sconfigge.

Risorse