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
| Plateforme | Commande |
|---|
| Debian/Ubuntu | sudo apt install honggfuzz |
| De source | git clone https://github.com/google/honggfuzz && make |
| macOS | brew install honggfuzz |
| Vérifier | honggfuzz --help |
Deux Modes
| Mode | Utilisation |
|---|
| Basé sur fichier | Cible lit un fichier/stdin ; honggfuzz mute les entrées |
| Persistant | Cible 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___
| Drapeau | Objectif |
|---|
-i DIR | Répertoire du corpus d’entrée |
-W DIR | Espace de travail (plantages, statistiques) |
-o DIR | Corpus de sortie |
___FILE___ | Espace réservé remplacé par le fichier d’entrée |
-s | Alimenter l’entrée via stdin à la place |
-t SECS | Délai d’attente par exécution |
-n N | Nombre 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ément | Note |
|---|
LLVMFuzzerTestOneInput | Même point d’entrée que libFuzzer — les cibles sont portables |
-P | Activer le mode persistant |
hfuzz-clang / hfuzz-gcc | Wrappers 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écanisme | Drapeau / exigence |
|---|
| Instrumentation logicielle | Compiler 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
| Sanitizer | Capture |
|---|
| ASan | Débordements de buffer, use-after-free |
| UBSan | Comportement indéfini |
| MSan | Lectures non initialisées |
| LeakSanitizer | Fuites mémoire |
Surveillance et Sortie
| Élément | Où |
|---|
| Statistiques en direct | Interface utilisateur du terminal (execs/sec, couverture, plantages) |
| Plantages | Fichiers WORKSPACE/*.fuzz |
| Rapport | HONGGFUZZ.REPORT.TXT |
| Nommage de plantage | Inclut le signal et l’adresse de défaut |
| Drapeau | Effet |
|---|
-N N | S’arrêter après N itérations |
--exit_upon_crash | Arrêter au premier plantage |
-v | Verbeux |
-Q | Silencieux |
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
| Aspect | honggfuzz | AFL++ | libFuzzer | LibAFL |
|---|
| Configuration | Très facile | Facile | Facile (in-process) | Construire votre propre |
| Cibles à source fermée | Oui (Intel PT/BTS) | Mode QEMU | Non | Oui |
| Mode persistant | Oui | Oui | Natif | Oui |
| Meilleur pour | Démarrage rapide, retour matériel | Écosystème large | API de bibliothèque | Testeurs personnalisés |
Comparer avec AFL++ pour l’écosystème le plus large et LibAFL quand vous avez besoin de construire un testeur personnalisé.
Ressources