Pular para o conteúdo

honggfuzz - Cheatsheet de Fuzzer Orientado para Segurança e Guiado por Feedback

honggfuzz - Cheatsheet de Fuzzer Orientado para Segurança e Guiado por Feedback

honggfuzz é um fuzzer orientado para segurança e feedback-driven do Google. É conhecido por ser direto para apontar para um alvo, por fuzzing multi-processo e multi-thread sólido pronto para usar, e por suportar tanto instrumentação de software quanto feedback de cobertura baseado em hardware (Intel BTS/PT) — este último permitindo que você fuzz binários que você não pode recompilar. Tem um longo histórico de encontrar vulnerabilidades reais em software amplamente utilizado.

Fuzzing pode consumir grandes quantidades de CPU e disco. Execute-o em capacidade dedicada e em um ambiente isolado.

Instalação

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

Dois Modos

ModoUse
Baseado em arquivoAlvo lê um arquivo/stdin; honggfuzz muta inputs
PersistenteAlvo expõe um ponto de entrada de fuzz; muito mais rápido

Fuzzing Baseado em Arquivo

# Fuzz um programa que leva um argumento de arquivo
honggfuzz -i ./input_corpus -W ./workspace -- ./target ___FILE___
FlagPropósito
-i DIRDiretório de corpus de entrada
-W DIRWorkspace (crashes, stats)
-o DIRCorpus de saída
___FILE___Placeholder substituído pelo arquivo de entrada
-sAlimenta entrada via stdin em vez disso
-t SECSTimeout por execução
-n NNúmero de threads de fuzzing concorrentes

Modo Persistente (Rápido)

#include <stdint.h>
#include <stddef.h>

int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
    parse_input(data, size);   // sua função alvo
    return 0;
}
# Compila com wrapper clang de honggfuzz, depois fuzz
hfuzz-clang -fsanitize=address fuzz_target.c -o fuzz_target
honggfuzz -i corpus -P -- ./fuzz_target
ElementoNota
LLVMFuzzerTestOneInputMesmo ponto de entrada que libFuzzer — alvo portável
-PHabilita modo persistente
hfuzz-clang / hfuzz-gccWrappers de compilador que adicionam instrumentação

O modo persistente evita inicialização de processo por entrada, frequentemente dando 10-100x mais execuções por segundo.

Opções de Feedback de Cobertura

MecanismoFlag / requisito
Instrumentação de softwareCompila com hfuzz-clang (padrão, melhor)
Intel BTS--linux_perf_bts_edge (sem recompile)
Intel PT--linux_perf_ipt_block (sem recompile)
Contagens de instrução/branch--linux_perf_instr, --linux_perf_branch

Feedback de hardware é a saída de escape para binários de código fechado — você obtém orientação de cobertura sem acesso ao código-fonte.

Sanitizers

# Construa com ASan + UBSan para melhor detecção de crash
hfuzz-clang -fsanitize=address,undefined target.c -o target
SanitizerCaptura
ASanBuffer overflows, use-after-free
UBSanComportamento indefinido
MSanLeituras não inicializadas
LeakSanitizerVazamentos de memória

Monitoramento e Saída

ItemOnde
Stats ativoTerminal UI (execs/sec, cobertura, crashes)
CrashesArquivos WORKSPACE/*.fuzz
RelatórioHONGGFUZZ.REPORT.TXT
Nomenclatura de crashInclui sinal e endereço de falha
FlagEfeito
-N NParar após N iterações
--exit_upon_crashParar no primeiro crash
-vVerbose
-QQuiet

Fluxo de Trabalho de Triagem

# 1) Reproduz um crash
./target < WORKSPACE/SIGSEGV.PC.*.fuzz

# 2) Obtém um stack trace sob um debugger
gdb --args ./target WORKSPACE/SIGSEGV.PC.*.fuzz

# 3) Minimiza a entrada, depois arquivo o bug com o reprodutor

honggfuzz vs Outros Fuzzers

AspectohonggfuzzAFL++libFuzzerLibAFL
SetupMuito fácilFácilFácil (in-process)Construa o seu
Alvos de código fechadoSim (Intel PT/BTS)Modo QEMUNãoSim
Modo persistenteSimSimNativoSim
Melhor paraInício rápido, feedback de hardwareEcossistema amploAPIs de bibliotecaFuzzers customizados

Compare com AFL++ para o ecossistema mais amplo e LibAFL quando você precisa construir um fuzzer customizado.

Recursos