LibAFL - Cheatsheet de Framework de Fuzzing Modular
LibAFL é um framework de fuzzing, não um fuzzer. Escrito em Rust pela equipe AFL++, fornece blocos de construção compostos — observers, feedbacks, mutators, schedulers, stages, executors — que você monta em um fuzzer adaptado ao seu alvo. A motivação é que fuzzers monolíticos funcionam bem em alvos convencionais e mal em incomuns (protocolos customizados, firmware emulado, kernels, gramáticas), onde você termina lutando contra a ferramenta. Com LibAFL você construa exatamente o fuzzer que o alvo precisa, e obtém escalamento multi-core gratuitamente.
Construir um fuzzer é mais trabalho que executar um. Alcance LibAFL quando ferramentas prontas genuinamente não se encaixam.
Setup
| Passo | Comando |
|---|
| Novo projeto | cargo new my_fuzzer && cd my_fuzzer |
| Adiciona LibAFL | cargo add libafl libafl_bolts |
| Instrumentação de alvo | cargo add libafl_targets (ou libafl_qemu, libafl_frida) |
| Build | cargo build --release |
Conceitos Centrais
| Componente | Papel |
|---|
| Input | O que é fuzzed (bytes, árvore de gramática, syscalls) |
| Observer | Registra dados durante uma execução (mapa de cobertura, timing) |
| Feedback | Decide se uma execução foi “interessante” |
| Objective | Decide se uma execução é uma solução (um crash) |
| Corpus | Armazenamento para inputs interessantes |
| Mutator | Transforma inputs |
| Scheduler | Escolhe o próximo input para executar |
| Stage | Uma fase aplicada por input (mutar, trim, calibrar) |
| Executor | Executa o alvo com um input |
// Estrutura conceitual — veja exemplos LibAFL para código 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)?;
Executors (Como o Alvo Executa)
| Executor | Use |
|---|
InProcessExecutor | Mais rápido; harness no mesmo processo |
ForkserverExecutor | Estilo AFL forkserver para binários externos |
CommandExecutor | Executa um comando externo por input |
libafl_qemu | Alvos emulados / fuzzing binário-only |
libafl_frida | Instrumentação dinâmica (binário-only) |
libafl_nyx | Fuzzing de VM baseado em snapshot |
Feedbacks
| Feedback | Interessante quando |
|---|
MaxMapFeedback | Novas bordas de cobertura alcançadas |
TimeFeedback | Tempo de execução muda |
CrashFeedback | Alvo travou (objetivo) |
TimeoutFeedback | Alvo pendurou (objetivo) |
NewHashFeedback | Stack de crash único novo |
| Combinadores | feedback_or!, feedback_and! para compor |
Mutators
| Mutator | Faz |
|---|
havoc_mutations() | Mutações aleatórias padrão de estilo AFL |
tokens_mutations() | Inserção de dicionário/token |
| Mutadores de gramática | Geração ciente de estrutura |
| Custom | Implementa o trait Mutator para seu tipo de entrada |
Tipos de entrada customizados mais mutadores customizados são a razão principal para escolher LibAFL — fuzz um protocolo ou AST inteligentemente em vez de virar bits.
Escalamento Multi-Core
| Mecanismo | Nota |
|---|
LlmpRestartingEventManager | Passagem de mensagem de baixa sobrecarga entre cores |
Launcher | Spawna um fuzzer por core com corpus compartilhado |
| Sincronização de corpus | Inputs interessantes propagam entre instâncias |
| Restarting | Sobrevive crashes do processo fuzzer |
LibAFL vs Fuzzers Prontos
| Aspecto | LibAFL | AFL++ | honggfuzz |
|---|
| Modelo | Construa o seu | Pronto para executar | Pronto para executar |
| Esforço | Alto | Baixo | Baixo |
| Flexibilidade | Total | Configurável | Configurável |
| Melhor para | Alvos incomuns, pesquisa | Binários padrão | Início rápido, feedback de hardware |
Comece com AFL++ ou honggfuzz; mude para LibAFL quando a estrutura de entrada do alvo ou modelo de execução os derrota.
Recursos