honggfuzz - Fuzzer guiado por feedback orientado a seguridad
honggfuzz es un fuzzer orientado a seguridad feedback-driven de Google. Es conocido por ser directo de apuntar a un objetivo, por sólido soporte multiproceso y multihilo out of the box, y por soportar tanto instrumentación de software como feedback de cobertura basada en hardware (Intel BTS/PT) — esto último permitiendo hacer fuzzing de binarios que no puedes recompilar. Tiene un largo historial de encontrar vulnerabilidades reales en software ampliamente usado.
El fuzzing puede consumir grandes cantidades de CPU y disco. Ejecutalo en capacidad dedicada y en un entorno aislado.
Instalación
| Plataforma | Comando |
|---|
| Debian/Ubuntu | sudo apt install honggfuzz |
| Desde source | git clone https://github.com/google/honggfuzz && make |
| macOS | brew install honggfuzz |
| Verificar | honggfuzz --help |
Dos modos
| Modo | Usar |
|---|
| Basado en archivos | El objetivo lee un archivo/stdin; honggfuzz muta entradas |
| Persistente | El objetivo expone un punto de entrada fuzz; mucho más rápido |
Fuzzing basado en archivos
# Fuzz un programa que toma un argumento de archivo
honggfuzz -i ./input_corpus -W ./workspace -- ./target ___FILE___
| Flag | Propósito |
|---|
-i DIR | Directorio de corpus de entrada |
-W DIR | Workspace (crashes, stats) |
-o DIR | Corpus de salida |
___FILE___ | Placeholder reemplazado con el archivo de entrada |
-s | Alimentar entrada vía stdin en su lugar |
-t SECS | Timeout por ejecución |
-n N | Número de threads de fuzzing concurrentes |
Modo persistente (rápido)
#include <stdint.h>
#include <stddef.h>
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
parse_input(data, size); // tu función objetivo
return 0;
}
# Compilar con el wrapper clang de honggfuzz, luego hacer fuzzing
hfuzz-clang -fsanitize=address fuzz_target.c -o fuzz_target
honggfuzz -i corpus -P -- ./fuzz_target
| Elemento | Nota |
|---|
LLVMFuzzerTestOneInput | Mismo punto de entrada que libFuzzer — los objetivos son portables |
-P | Habilitar modo persistente |
hfuzz-clang / hfuzz-gcc | Wrappers de compilador que añaden instrumentación |
El modo persistente evita startup de proceso por entrada, frecuentemente dando 10–100x más ejecuciones por segundo.
Opciones de feedback de cobertura
| Mecanismo | Flag / requisito |
|---|
| Instrumentación de software | Compilar con hfuzz-clang (por defecto, mejor) |
| Intel BTS | --linux_perf_bts_edge (sin recompilación) |
| Intel PT | --linux_perf_ipt_block (sin recompilación) |
| Conteos de instrucción/branch | --linux_perf_instr, --linux_perf_branch |
El feedback por hardware es la válvula de escape para binarios de código cerrado — obtienes feedback de cobertura sin acceso a fuente.
Sanitizers
# Compilar con ASan + UBSan para mejor detección de crash
hfuzz-clang -fsanitize=address,undefined target.c -o target
| Sanitizer | Captura |
|---|
| ASan | Buffer overflows, use-after-free |
| UBSan | Undefined behavior |
| MSan | Lecturas no inicializadas |
| LeakSanitizer | Memory leaks |
Monitoreo y salida
| Elemento | Dónde |
|---|
| Stats en vivo | UI terminal (execs/sec, cobertura, crashes) |
| Crashes | Archivos WORKSPACE/*.fuzz |
| Reporte | HONGGFUZZ.REPORT.TXT |
| Naming de crash | Incluye señal y dirección fallida |
| Flag | Efecto |
|---|
-N N | Parar después de N iteraciones |
--exit_upon_crash | Parar en el primer crash |
-v | Verboso |
-Q | Silencioso |
Workflow de triage
# 1) Reproducir un crash
./target < WORKSPACE/SIGSEGV.PC.*.fuzz
# 2) Obtener un stack trace bajo un debugger
gdb --args ./target WORKSPACE/SIGSEGV.PC.*.fuzz
# 3) Minimizar la entrada, luego reportar el bug con el reproductor
honggfuzz vs otros fuzzers
| Aspecto | honggfuzz | AFL++ | libFuzzer | LibAFL |
|---|
| Setup | Muy fácil | Fácil | Fácil (in-process) | Construye el tuyo |
| Objetivos de código cerrado | Sí (Intel PT/BTS) | Modo QEMU | No | Sí |
| Modo persistente | Sí | Sí | Nativo | Sí |
| Mejor para | Inicio rápido, feedback por hardware | Ecosistema amplio | APIs de librería | Fuzzers personalizados |
Compara con AFL++ por el ecosistema más amplio y LibAFL cuando necesitas construir un fuzzer personalizado.
Recursos