Zum Inhalt springen

honggfuzz - Sicherheitsorientierter Coverage-Guided Fuzzer Cheatsheet

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

PlattformBefehl
Debian/Ubuntusudo apt install honggfuzz
Aus Quellegit clone https://github.com/google/honggfuzz && make
macOSbrew install honggfuzz
Überprüfunghonggfuzz --help

Zwei Modi

ModusVerwendung
Datei-basiertZiel liest eine Datei/stdin; honggfuzz mutiert Inputs
PersistentZiel 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___
FlagZweck
-i DIRInput-Corpus-Verzeichnis
-W DIRWorkspace (Crashes, Stats)
-o DIROutput-Corpus
___FILE___Platzhalter, ersetzt durch die Input-Datei
-sGib Input via stdin statt
-t SECSTimeout pro Lauf
-n NAnzahl 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
ElementAnmerkung
LLVMFuzzerTestOneInputGleicher Einstiegspunkt wie libFuzzer — Ziele sind portierbar
-PAktiviere Persistent-Modus
hfuzz-clang / hfuzz-gccCompiler-Wrapper, die Instrumentierung hinzufügen

Persistent-Modus vermeidet Prozess-Startup pro Input, oft 10–100x mehr Ausführungen pro Sekunde.

Coverage-Rückmeldungs-Optionen

MechanismusFlag / Anforderung
Software-InstrumentierungKompiliere 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
SanitizerErfasst
ASanPufferspeicherüberläufe, Use-After-Free
UBSanUndefined Behavior
MSanUninitialisierte Lesevorgänge
LeakSanitizerSpeicherlecks

Überwachung und Ausgabe

ItemWo
Live-StatsTerminal UI (Execs/sec, Coverage, Crashes)
CrashesWORKSPACE/*.fuzz Dateien
ReportHONGGFUZZ.REPORT.TXT
Crash-BenennungUmfasst Signal und Faulting-Adresse
FlagEffekt
-N NStoppt nach N Iterationen
--exit_upon_crashStoppt beim ersten Crash
-vVerbose
-QRuhig

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

AspekthonggfuzzAFL++libFuzzerLibAFL
SetupSehr einfachEinfachEinfach (In-Process)Baue dein eigenes
Closed-Source-ZieleJa (Intel PT/BTS)QEMU-ModusNeinJa
Persistent-ModusJaJaNativJa
Bestes fürSchneller Start, Hardware-RückmeldungBreites ÖkosystemLibrary-APIsBenutzerdefinierte Fuzzer

Vergleiche mit AFL++ für das breiteste Ökosystem und LibAFL wenn du einen benutzerdefinierten Fuzzer bauen musst.

Ressourcen