Aller au contenu

honggfuzz - Testeur Guidé par Retour Orienté Sécurité

honggfuzz - Testeur Guidé par Retour Orienté Sécurité

honggfuzz est un testeur orienté sécurité et guidé par retour de Google. Il est connu pour sa facilité à cibler un objectif, pour son fuzzing multi-processus et multi-thread solide prêt à l’emploi, et pour supporter à la fois l’instrumentation logicielle et le retour de couverture matériel (Intel BTS/PT) — ce dernier vous permettant de tester les binaires que vous ne pouvez pas recompiler. Il a un long historique de découverte de vraies vulnérabilités dans les logiciels largement utilisés.

Le fuzzing peut consommer de grandes quantités de CPU et de disque. L’exécuter sur une capacité dédiée et dans un environnement isolé.

Installation

PlateformeCommande
Debian/Ubuntusudo apt install honggfuzz
De sourcegit clone https://github.com/google/honggfuzz && make
macOSbrew install honggfuzz
Vérifierhonggfuzz --help

Deux Modes

ModeUtilisation
Basé sur fichierCible lit un fichier/stdin ; honggfuzz mute les entrées
PersistantCible expose un point d’entrée de fuzzing ; beaucoup plus rapide

Fuzzing Basé sur Fichier

# Tester un programme qui prend un argument de fichier
honggfuzz -i ./input_corpus -W ./workspace -- ./target ___FILE___
DrapeauObjectif
-i DIRRépertoire du corpus d’entrée
-W DIREspace de travail (plantages, statistiques)
-o DIRCorpus de sortie
___FILE___Espace réservé remplacé par le fichier d’entrée
-sAlimenter l’entrée via stdin à la place
-t SECSDélai d’attente par exécution
-n NNombre de threads de fuzzing simultanés

Mode Persistant (Rapide)

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

int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
    parse_input(data, size);   // votre fonction cible
    return 0;
}
# Compiler avec le wrapper clang de honggfuzz, puis tester
hfuzz-clang -fsanitize=address fuzz_target.c -o fuzz_target
honggfuzz -i corpus -P -- ./fuzz_target
ÉlémentNote
LLVMFuzzerTestOneInputMême point d’entrée que libFuzzer — les cibles sont portables
-PActiver le mode persistant
hfuzz-clang / hfuzz-gccWrappers de compilateur qui ajoutent l’instrumentation

Le mode persistant évite le démarrage du processus par entrée, donnant souvent 10–100x plus d’exécutions par seconde.

Options de Retour de Couverture

MécanismeDrapeau / exigence
Instrumentation logicielleCompiler avec hfuzz-clang (par défaut, meilleur)
Intel BTS--linux_perf_bts_edge (pas de recompilation)
Intel PT--linux_perf_ipt_block (pas de recompilation)
Comptages d’instructions/branche--linux_perf_instr, --linux_perf_branch

Le retour matériel est la solution de secours pour les binaires à source fermée — vous obtenez une couverture sans accès à la source.

Sanitizers

# Construire avec ASan + UBSan pour une meilleure détection de plantage
hfuzz-clang -fsanitize=address,undefined target.c -o target
SanitizerCapture
ASanDébordements de buffer, use-after-free
UBSanComportement indéfini
MSanLectures non initialisées
LeakSanitizerFuites mémoire

Surveillance et Sortie

Élément
Statistiques en directInterface utilisateur du terminal (execs/sec, couverture, plantages)
PlantagesFichiers WORKSPACE/*.fuzz
RapportHONGGFUZZ.REPORT.TXT
Nommage de plantageInclut le signal et l’adresse de défaut
DrapeauEffet
-N NS’arrêter après N itérations
--exit_upon_crashArrêter au premier plantage
-vVerbeux
-QSilencieux

Flux de Travail de Triage

# 1) Reproduire un plantage
./target < WORKSPACE/SIGSEGV.PC.*.fuzz

# 2) Obtenir une trace de pile sous un débogueur
gdb --args ./target WORKSPACE/SIGSEGV.PC.*.fuzz

# 3) Minimiser l'entrée, puis classer le bug avec le reproducteur

honggfuzz vs Autres Testeurs

AspecthonggfuzzAFL++libFuzzerLibAFL
ConfigurationTrès facileFacileFacile (in-process)Construire votre propre
Cibles à source ferméeOui (Intel PT/BTS)Mode QEMUNonOui
Mode persistantOuiOuiNatifOui
Meilleur pourDémarrage rapide, retour matérielÉcosystème largeAPI de bibliothèqueTesteurs personnalisés

Comparer avec AFL++ pour l’écosystème le plus large et LibAFL quand vous avez besoin de construire un testeur personnalisé.

Ressources