LibAFL - Modulares Fuzzing-Framework Cheatsheet
LibAFL ist ein Fuzzing-Framework, kein Fuzzer. Geschrieben in Rust vom AFL++-Team, bietet es zusammensetzbare Bausteine — Beobachter, Rückmeldungen, Mutatoren, Scheduler, Stufen, Executors — die Sie zu einem Fuzzer zusammentragen, der auf dein Ziel zugeschnitten ist. Die Motivation ist, dass monolithische Fuzzer bei konventionellen Zielen gut funktionieren und bei ungewöhnlichen schlecht (benutzerdefinierte Protokolle, emulierte Firmware, Kernel, Grammatiken), wo du das Tool bekämpfst. Mit LibAFL baust du genau den Fuzzer, den dein Ziel braucht, und erhältst Multi-Core-Skalierung kostenlos.
Einen Fuzzer zu bauen ist mehr Arbeit als einen zu laufen. Greifen Sie auf LibAFL zurück, wenn Standardtools wirklich nicht passen.
Setup
| Schritt | Befehl |
|---|
| Neues Projekt | cargo new my_fuzzer && cd my_fuzzer |
| Füge LibAFL hinzu | cargo add libafl libafl_bolts |
| Ziel-Instrumentierung | cargo add libafl_targets (oder libafl_qemu, libafl_frida) |
| Bauen | cargo build --release |
Kernkonzepte
| Komponente | Rolle |
|---|
| Input | Was wird genutzt (Bytes, Grammatik-Baum, Syscalls) |
| Observer | Zeichnet Daten während eines Laufs auf (Coverage-Map, Timing) |
| Feedback | Entscheidet, ob ein Lauf “interessant” war |
| Objective | Entscheidet, ob ein Lauf eine Lösung ist (ein Crash) |
| Corpus | Speicherung für interessante Inputs |
| Mutator | Transformiert Inputs |
| Scheduler | Wählt den nächsten zu laufenden Input |
| Stage | Eine pro Input angewendete Phase (Mutiere, trimme, kalibriere) |
| Executor | Führt das Ziel mit einem Input aus |
// Konzeptionelle Struktur — siehe LibAFL-Beispiele für vollständigen Code
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)?;
Executors (Wie das Ziel läuft)
| Executor | Verwendung |
|---|
InProcessExecutor | Schnellste; Harness im gleichen Prozess |
ForkserverExecutor | AFL-style Forkserver für externe Binärdateien |
CommandExecutor | Führe einen externen Befehl pro Input aus |
libafl_qemu | Emulierte Ziele / Binary-Only-Fuzzing |
libafl_frida | Dynamische Instrumentierung (Binary-Only) |
libafl_nyx | Snapshot-basiertes VM-Fuzzing |
Rückmeldungen
| Rückmeldung | Interessant wenn |
|---|
MaxMapFeedback | Neue Coverage-Kanten getroffen |
TimeFeedback | Ausführungszeit ändert sich |
CrashFeedback | Ziel abstürzte (Objective) |
TimeoutFeedback | Ziel hing fest (Objective) |
NewHashFeedback | Neuer einzigartiger Crash-Stack |
| Combinators | feedback_or!, feedback_and! zum Komponieren |
Mutatoren
| Mutator | Tut |
|---|
havoc_mutations() | Standard AFL-style zufällige Mutationen |
tokens_mutations() | Wörterbuch/Token-Einfügung |
| Grammar Mutators | Strukturbewusste Generierung |
| Custom | Implementiere das Mutator Trait für deinen Input-Typ |
Benutzerdefinierte Input-Typen plus benutzerdefinierte Mutatoren sind der Hauptgrund, LibAFL zu wählen — ein Protokoll oder AST intelligent fuzzen anstatt Bytes zu flippen.
Multi-Core-Skalierung
| Mechanismus | Anmerkung |
|---|
LlmpRestartingEventManager | Niedriger Overhead Message Passing zwischen Cores |
Launcher | Spawne einen Fuzzer pro Core mit gemeinsamer Corpus |
| Corpus-Synchronisation | Interessante Inputs propagieren über Instanzen |
| Neustarten | Übersteht Crashes des Fuzzer-Prozesses |
LibAFL vs Fertige Fuzzer
| Aspekt | LibAFL | AFL++ | honggfuzz |
|---|
| Modell | Baue dein eigenes | Bereit zu laufen | Bereit zu laufen |
| Aufwand | Hoch | Niedrig | Niedrig |
| Flexibilität | Total | Konfigurierbar | Konfigurierbar |
| Bestes für | Ungewöhnliche Ziele, Forschung | Standard-Binärdateien | Schneller Start, Hardware-Rückmeldung |
Starten Sie mit AFL++ oder honggfuzz; wechseln Sie zu LibAFL wenn das Ziel Input-Struktur oder Ausführungsmodell sie besiegt.
Ressourcen