Zum Inhalt springen

LibAFL - Modulares Fuzzing-Framework Cheatsheet

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

SchrittBefehl
Neues Projektcargo new my_fuzzer && cd my_fuzzer
Füge LibAFL hinzucargo add libafl libafl_bolts
Ziel-Instrumentierungcargo add libafl_targets (oder libafl_qemu, libafl_frida)
Bauencargo build --release

Kernkonzepte

KomponenteRolle
InputWas wird genutzt (Bytes, Grammatik-Baum, Syscalls)
ObserverZeichnet Daten während eines Laufs auf (Coverage-Map, Timing)
FeedbackEntscheidet, ob ein Lauf “interessant” war
ObjectiveEntscheidet, ob ein Lauf eine Lösung ist (ein Crash)
CorpusSpeicherung für interessante Inputs
MutatorTransformiert Inputs
SchedulerWählt den nächsten zu laufenden Input
StageEine pro Input angewendete Phase (Mutiere, trimme, kalibriere)
ExecutorFührt das Ziel mit einem Input aus

Ein Minimal-Fuzzer (Form)

// 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)

ExecutorVerwendung
InProcessExecutorSchnellste; Harness im gleichen Prozess
ForkserverExecutorAFL-style Forkserver für externe Binärdateien
CommandExecutorFühre einen externen Befehl pro Input aus
libafl_qemuEmulierte Ziele / Binary-Only-Fuzzing
libafl_fridaDynamische Instrumentierung (Binary-Only)
libafl_nyxSnapshot-basiertes VM-Fuzzing

Rückmeldungen

RückmeldungInteressant wenn
MaxMapFeedbackNeue Coverage-Kanten getroffen
TimeFeedbackAusführungszeit ändert sich
CrashFeedbackZiel abstürzte (Objective)
TimeoutFeedbackZiel hing fest (Objective)
NewHashFeedbackNeuer einzigartiger Crash-Stack
Combinatorsfeedback_or!, feedback_and! zum Komponieren

Mutatoren

MutatorTut
havoc_mutations()Standard AFL-style zufällige Mutationen
tokens_mutations()Wörterbuch/Token-Einfügung
Grammar MutatorsStrukturbewusste Generierung
CustomImplementiere 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

MechanismusAnmerkung
LlmpRestartingEventManagerNiedriger Overhead Message Passing zwischen Cores
LauncherSpawne einen Fuzzer pro Core mit gemeinsamer Corpus
Corpus-SynchronisationInteressante Inputs propagieren über Instanzen
NeustartenÜbersteht Crashes des Fuzzer-Prozesses

LibAFL vs Fertige Fuzzer

AspektLibAFLAFL++honggfuzz
ModellBaue dein eigenesBereit zu laufenBereit zu laufen
AufwandHochNiedrigNiedrig
FlexibilitätTotalKonfigurierbarKonfigurierbar
Bestes fürUngewöhnliche Ziele, ForschungStandard-BinärdateienSchneller 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