Ir al contenido

honggfuzz - Fuzzer guiado por feedback orientado a seguridad

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

PlataformaComando
Debian/Ubuntusudo apt install honggfuzz
Desde sourcegit clone https://github.com/google/honggfuzz && make
macOSbrew install honggfuzz
Verificarhonggfuzz --help

Dos modos

ModoUsar
Basado en archivosEl objetivo lee un archivo/stdin; honggfuzz muta entradas
PersistenteEl 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___
FlagPropósito
-i DIRDirectorio de corpus de entrada
-W DIRWorkspace (crashes, stats)
-o DIRCorpus de salida
___FILE___Placeholder reemplazado con el archivo de entrada
-sAlimentar entrada vía stdin en su lugar
-t SECSTimeout por ejecución
-n NNú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
ElementoNota
LLVMFuzzerTestOneInputMismo punto de entrada que libFuzzer — los objetivos son portables
-PHabilitar modo persistente
hfuzz-clang / hfuzz-gccWrappers 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

MecanismoFlag / requisito
Instrumentación de softwareCompilar 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
SanitizerCaptura
ASanBuffer overflows, use-after-free
UBSanUndefined behavior
MSanLecturas no inicializadas
LeakSanitizerMemory leaks

Monitoreo y salida

ElementoDónde
Stats en vivoUI terminal (execs/sec, cobertura, crashes)
CrashesArchivos WORKSPACE/*.fuzz
ReporteHONGGFUZZ.REPORT.TXT
Naming de crashIncluye señal y dirección fallida
FlagEfecto
-N NParar después de N iteraciones
--exit_upon_crashParar en el primer crash
-vVerboso
-QSilencioso

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

AspectohonggfuzzAFL++libFuzzerLibAFL
SetupMuy fácilFácilFácil (in-process)Construye el tuyo
Objetivos de código cerradoSí (Intel PT/BTS)Modo QEMUNo
Modo persistenteNativo
Mejor paraInicio rápido, feedback por hardwareEcosistema amplioAPIs de libreríaFuzzers personalizados

Compara con AFL++ por el ecosistema más amplio y LibAFL cuando necesitas construir un fuzzer personalizado.

Recursos