honggfuzz - Fuzzer Guidato da Feedback Orientato alla Sicurezza Cheatsheet
honggfuzz è un fuzzer orientato alla sicurezza, guidato da feedback di Google. È noto per essere diretto di puntare a un target, per il solido fuzzing multi-processo e multi-thread fornito, e per supportare sia strumentazione del software che feedback di copertura basato su hardware (Intel BTS/PT) — quest”ultimo ti consente di fare fuzzing su binari che non puoi ricompilare. Ha un lungo track record di ricerca di vulnerabilità reali in software ampiamente utilizzato.
Il fuzzing può consumare grandi quantità di CPU e disco. Eseguilo su capacità dedicata e in un ambiente isolato.
Installazione
| Piattaforma | Comando |
|---|
| Debian/Ubuntu | sudo apt install honggfuzz |
| Dal sorgente | git clone https://github.com/google/honggfuzz && make |
| macOS | brew install honggfuzz |
| Verifica | honggfuzz --help |
Due Modalità
| Modalità | Usa |
|---|
| Basata su file | Il target legge un file/stdin; honggfuzz muta gli input |
| Persistente | Il target espone un punto di ingresso di fuzzing; molto più veloce |
Fuzzing Basato su File
# Fuzz un programma che accetta un argomento di file
honggfuzz -i ./input_corpus -W ./workspace -- ./target ___FILE___
| Flag | Scopo |
|---|
-i DIR | Directory di corpus di input |
-W DIR | Workspace (crash, statistiche) |
-o DIR | Corpus di output |
___FILE___ | Placeholder sostituito con il file di input |
-s | Alimenta input via stdin |
-t SECS | Timeout per esecuzione |
-n N | Numero di thread di fuzzing concorrenti |
Modalità Persistente (Veloce)
#include <stdint.h>
#include <stddef.h>
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
parse_input(data, size); // la tua funzione target
return 0;
}
# Compila con il wrapper clang di honggfuzz, poi fuzz
hfuzz-clang -fsanitize=address fuzz_target.c -o fuzz_target
honggfuzz -i corpus -P -- ./fuzz_target
| Elemento | Nota |
|---|
LLVMFuzzerTestOneInput | Stesso punto di ingresso di libFuzzer — i target sono portabili |
-P | Abilita modalità persistente |
hfuzz-clang / hfuzz-gcc | Wrapper del compilatore che aggiungono strumentazione |
La modalità persistente evita l”avvio del processo per input, spesso dando 10–100 volte più esecuzioni al secondo.
Opzioni di Feedback di Copertura
| Meccanismo | Flag / requisito |
|---|
| Strumentazione del software | Compila con hfuzz-clang (default, migliore) |
| Intel BTS | --linux_perf_bts_edge (senza ricompilazione) |
| Intel PT | --linux_perf_ipt_block (senza ricompilazione) |
| Conteggi di istruzione/branch | --linux_perf_instr, --linux_perf_branch |
Il feedback hardware è la via d”uscita per binari closed-source — ottieni guida di copertura senza accesso al codice sorgente.
Sanitizer
# Costruisci con ASan + UBSan per miglior rilevamento di crash
hfuzz-clang -fsanitize=address,undefined target.c -o target
| Sanitizer | Cattura |
|---|
| ASan | Buffer overflow, use-after-free |
| UBSan | Comportamento non definito |
| MSan | Letture non inizializzate |
| LeakSanitizer | Memory leak |
Monitoraggio e Output
| Voce | Dove |
|---|
| Statistiche live | UI del terminale (exec/sec, copertura, crash) |
| Crash | File WORKSPACE/*.fuzz |
| Report | HONGGFUZZ.REPORT.TXT |
| Naming di crash | Include segnale e indirizzo di fallo |
| Flag | Effetto |
|---|
-N N | Ferma dopo N iterazioni |
--exit_upon_crash | Ferma al primo crash |
-v | Verboso |
-Q | Silenzioso |
Workflow di Triage
# 1) Riproduci un crash
./target < WORKSPACE/SIGSEGV.PC.*.fuzz
# 2) Ottieni uno stack trace sotto un debugger
gdb --args ./target WORKSPACE/SIGSEGV.PC.*.fuzz
# 3) Minimizza l''input, poi archivia il bug con il reproducer
honggfuzz vs Altri Fuzzer
| Aspetto | honggfuzz | AFL++ | libFuzzer | LibAFL |
|---|
| Setup | Molto facile | Facile | Facile (in-process) | Costruisci il tuo |
| Target closed-source | Sì (Intel PT/BTS) | Modalità QEMU | No | Sì |
| Modalità persistente | Sì | Sì | Nativo | Sì |
| Migliore per | Inizio veloce, feedback hardware | Ecosistema ampio | API di libreria | Fuzzer custom |
Confronta con AFL++ per l”ecosistema più ampio e LibAFL quando hai bisogno di costruire un fuzzer custom.
Risorse