honggfuzz - Cheatsheet de Fuzzer Orientado para Segurança e Guiado por Feedback
honggfuzz é um fuzzer orientado para segurança e feedback-driven do Google. É conhecido por ser direto para apontar para um alvo, por fuzzing multi-processo e multi-thread sólido pronto para usar, e por suportar tanto instrumentação de software quanto feedback de cobertura baseado em hardware (Intel BTS/PT) — este último permitindo que você fuzz binários que você não pode recompilar. Tem um longo histórico de encontrar vulnerabilidades reais em software amplamente utilizado.
Fuzzing pode consumir grandes quantidades de CPU e disco. Execute-o em capacidade dedicada e em um ambiente isolado.
Instalação
| Plataforma | Comando |
|---|
| Debian/Ubuntu | sudo apt install honggfuzz |
| Do fonte | git clone https://github.com/google/honggfuzz && make |
| macOS | brew install honggfuzz |
| Verificar | honggfuzz --help |
Dois Modos
| Modo | Use |
|---|
| Baseado em arquivo | Alvo lê um arquivo/stdin; honggfuzz muta inputs |
| Persistente | Alvo expõe um ponto de entrada de fuzz; muito mais rápido |
Fuzzing Baseado em Arquivo
# Fuzz um programa que leva um argumento de arquivo
honggfuzz -i ./input_corpus -W ./workspace -- ./target ___FILE___
| Flag | Propósito |
|---|
-i DIR | Diretório de corpus de entrada |
-W DIR | Workspace (crashes, stats) |
-o DIR | Corpus de saída |
___FILE___ | Placeholder substituído pelo arquivo de entrada |
-s | Alimenta entrada via stdin em vez disso |
-t SECS | Timeout por execução |
-n N | Número de threads de fuzzing concorrentes |
Modo Persistente (Rápido)
#include <stdint.h>
#include <stddef.h>
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
parse_input(data, size); // sua função alvo
return 0;
}
# Compila com wrapper clang de honggfuzz, depois fuzz
hfuzz-clang -fsanitize=address fuzz_target.c -o fuzz_target
honggfuzz -i corpus -P -- ./fuzz_target
| Elemento | Nota |
|---|
LLVMFuzzerTestOneInput | Mesmo ponto de entrada que libFuzzer — alvo portável |
-P | Habilita modo persistente |
hfuzz-clang / hfuzz-gcc | Wrappers de compilador que adicionam instrumentação |
O modo persistente evita inicialização de processo por entrada, frequentemente dando 10-100x mais execuções por segundo.
Opções de Feedback de Cobertura
| Mecanismo | Flag / requisito |
|---|
| Instrumentação de software | Compila com hfuzz-clang (padrão, melhor) |
| Intel BTS | --linux_perf_bts_edge (sem recompile) |
| Intel PT | --linux_perf_ipt_block (sem recompile) |
| Contagens de instrução/branch | --linux_perf_instr, --linux_perf_branch |
Feedback de hardware é a saída de escape para binários de código fechado — você obtém orientação de cobertura sem acesso ao código-fonte.
Sanitizers
# Construa com ASan + UBSan para melhor detecção de crash
hfuzz-clang -fsanitize=address,undefined target.c -o target
| Sanitizer | Captura |
|---|
| ASan | Buffer overflows, use-after-free |
| UBSan | Comportamento indefinido |
| MSan | Leituras não inicializadas |
| LeakSanitizer | Vazamentos de memória |
Monitoramento e Saída
| Item | Onde |
|---|
| Stats ativo | Terminal UI (execs/sec, cobertura, crashes) |
| Crashes | Arquivos WORKSPACE/*.fuzz |
| Relatório | HONGGFUZZ.REPORT.TXT |
| Nomenclatura de crash | Inclui sinal e endereço de falha |
| Flag | Efeito |
|---|
-N N | Parar após N iterações |
--exit_upon_crash | Parar no primeiro crash |
-v | Verbose |
-Q | Quiet |
Fluxo de Trabalho de Triagem
# 1) Reproduz um crash
./target < WORKSPACE/SIGSEGV.PC.*.fuzz
# 2) Obtém um stack trace sob um debugger
gdb --args ./target WORKSPACE/SIGSEGV.PC.*.fuzz
# 3) Minimiza a entrada, depois arquivo o bug com o reprodutor
honggfuzz vs Outros Fuzzers
| Aspecto | honggfuzz | AFL++ | libFuzzer | LibAFL |
|---|
| Setup | Muito fácil | Fácil | Fácil (in-process) | Construa o seu |
| Alvos de código fechado | Sim (Intel PT/BTS) | Modo QEMU | Não | Sim |
| Modo persistente | Sim | Sim | Nativo | Sim |
| Melhor para | Início rápido, feedback de hardware | Ecossistema amplo | APIs de biblioteca | Fuzzers customizados |
Compare com AFL++ para o ecossistema mais amplo e LibAFL quando você precisa construir um fuzzer customizado.
Recursos