honggfuzz - Sicherheitsorientierter Coverage-Guided Fuzzer Cheatsheet
honggfuzz ist ein sicherheitsorientierter, Feedback-getriebener Fuzzer von Google. Er ist bekannt dafür, dass er einfach auf ein Ziel gerichtet ist, für solide Multi-Process- und Multi-Threaded-Fuzzing direkt aus der Box, und für die Unterstützung sowohl Software-Instrumentierung als auch Hardware-basierter Coverage-Rückmeldung (Intel BTS/PT) — letztere ermöglicht es dir, Binärdateien zu fuzzen, die du nicht neu kompilieren kannst. Es hat eine lange Geschichte, echte Sicherheitslücken in weit verbreiteter Software zu finden.
Fuzzing kann große CPU- und Disk-Mengen verbrauchen. Führe es auf dedizierter Kapazität in einer isolierten Umgebung aus.
Installation
| Plattform | Befehl |
|---|
| Debian/Ubuntu | sudo apt install honggfuzz |
| Aus Quelle | git clone https://github.com/google/honggfuzz && make |
| macOS | brew install honggfuzz |
| Überprüfung | honggfuzz --help |
Zwei Modi
| Modus | Verwendung |
|---|
| Datei-basiert | Ziel liest eine Datei/stdin; honggfuzz mutiert Inputs |
| Persistent | Ziel stellt einen Fuzz-Einstiegspunkt zur Verfügung; viel schneller |
Datei-basiertes Fuzzing
# Fuzz ein Programm, das ein Datei-Argument annimmt
honggfuzz -i ./input_corpus -W ./workspace -- ./target ___FILE___
| Flag | Zweck |
|---|
-i DIR | Input-Corpus-Verzeichnis |
-W DIR | Workspace (Crashes, Stats) |
-o DIR | Output-Corpus |
___FILE___ | Platzhalter, ersetzt durch die Input-Datei |
-s | Gib Input via stdin statt |
-t SECS | Timeout pro Lauf |
-n N | Anzahl gleichzeitiger Fuzzing-Threads |
Persistent-Modus (Schnell)
#include <stdint.h>
#include <stddef.h>
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
parse_input(data, size); // deine Zielfunktion
return 0;
}
# Kompiliere mit honggfuzz Clang-Wrapper, dann fuzz
hfuzz-clang -fsanitize=address fuzz_target.c -o fuzz_target
honggfuzz -i corpus -P -- ./fuzz_target
| Element | Anmerkung |
|---|
LLVMFuzzerTestOneInput | Gleicher Einstiegspunkt wie libFuzzer — Ziele sind portierbar |
-P | Aktiviere Persistent-Modus |
hfuzz-clang / hfuzz-gcc | Compiler-Wrapper, die Instrumentierung hinzufügen |
Persistent-Modus vermeidet Prozess-Startup pro Input, oft 10–100x mehr Ausführungen pro Sekunde.
Coverage-Rückmeldungs-Optionen
| Mechanismus | Flag / Anforderung |
|---|
| Software-Instrumentierung | Kompiliere mit hfuzz-clang (Standard, beste) |
| Intel BTS | --linux_perf_bts_edge (Keine Neukompilierung) |
| Intel PT | --linux_perf_ipt_block (Keine Neukompilierung) |
| Anweisungs-/Branch-Zähler | --linux_perf_instr, --linux_perf_branch |
Hardware-Rückmeldung ist die Escape-Luke für Closed-Source-Binärdateien — Sie bekommen Coverage-Lenkung ohne Quellzugriff.
Sanitizer
# Baue mit ASan + UBSan für bessere Crash-Erkennung
hfuzz-clang -fsanitize=address,undefined target.c -o target
| Sanitizer | Erfasst |
|---|
| ASan | Pufferspeicherüberläufe, Use-After-Free |
| UBSan | Undefined Behavior |
| MSan | Uninitialisierte Lesevorgänge |
| LeakSanitizer | Speicherlecks |
Überwachung und Ausgabe
| Item | Wo |
|---|
| Live-Stats | Terminal UI (Execs/sec, Coverage, Crashes) |
| Crashes | WORKSPACE/*.fuzz Dateien |
| Report | HONGGFUZZ.REPORT.TXT |
| Crash-Benennung | Umfasst Signal und Faulting-Adresse |
| Flag | Effekt |
|---|
-N N | Stoppt nach N Iterationen |
--exit_upon_crash | Stoppt beim ersten Crash |
-v | Verbose |
-Q | Ruhig |
Triage-Workflow
# 1) Reproduziere einen Crash
./target < WORKSPACE/SIGSEGV.PC.*.fuzz
# 2) Erhalte einen Stack-Trace unter einem Debugger
gdb --args ./target WORKSPACE/SIGSEGV.PC.*.fuzz
# 3) Minimiere den Input, dann file den Bug mit dem Reproducer
honggfuzz vs andere Fuzzer
| Aspekt | honggfuzz | AFL++ | libFuzzer | LibAFL |
|---|
| Setup | Sehr einfach | Einfach | Einfach (In-Process) | Baue dein eigenes |
| Closed-Source-Ziele | Ja (Intel PT/BTS) | QEMU-Modus | Nein | Ja |
| Persistent-Modus | Ja | Ja | Nativ | Ja |
| Bestes für | Schneller Start, Hardware-Rückmeldung | Breites Ökosystem | Library-APIs | Benutzerdefinierte Fuzzer |
Vergleiche mit AFL++ für das breiteste Ökosystem und LibAFL wenn du einen benutzerdefinierten Fuzzer bauen musst.
Ressourcen