
Cadre de fuzzing guidé par des invariants au niveau des registres pour les binaires à source fermée, exploitant des violations d'invariants probables pour découvrir des plantages et des bogues dans les exécutables binaires.
Ce dépôt fournit le code source de Binvariants : un prototype de framework de fuzzing qui exploite les violations probables d'invariants au niveau des registres pour le fuzzing de binaires.
Ce travail est présenté dans notre article Binvariants: Enhancing Fuzzing of Closed-source Binary Executables via Register-level Likely Invariants | Diapositives, publié à la 2026 ACM International Conference on the Foundations of Software Engineering (FSE'26).

| Citer ce dépôt : |
@article{yang:binvariants, title = {Binvariants: Enhancing Fuzzing of Closed-source Binary Executables via Register-level Likely Invariants}, author = {Zao Yang and Stefan Nagy}, year = {2026}, issue_date = {July 2026}, publisher = {Association for Computing Machinery}, address = {New York, NY, USA}, volume = {3}, number = {FSE}, journal = {Proc. ACM Softw. Eng.}}
|
| Développeurs : | Zao Yang ([email protected]) et Stefan Nagy ([email protected]) |
| Licence : | Licence MIT |
| Avertissement : | Ce logiciel est fourni tel quel, sans aucune garantie. |
Binvariants est construit sur AFL++ et QEMU-AFL. Installez les dépendances requises par ces projets avant de configurer Binvariants :
sudo apt-get update
sudo apt-get install -y build-essential python3-dev automake cmake git flex bison libglib2.0-dev libpixman-1-dev python3-setuptools cargo libgtk-3-dev
# try to install llvm-18 and install the distro default if that fails
sudo apt-get install -y lld-18 llvm-18 llvm-18-dev clang-18 || sudo apt-get install -y lld llvm llvm-dev clang
sudo apt-get install -y gcc-$(gcc --version|head -n1|sed 's/\..*//'|sed 's/.* //')-plugin-dev libstdc++-$(gcc --version|head -n1|sed 's/\..*//'|sed 's/.* //')-dev
sudo apt-get install -y meson ninja-build # for QEMU mode
Les binvariants comprennent deux composants :
Pour construire chacun d'eux, naviguez vers leur répertoire correspondant et exécutez les commandes suivantes :
./1_patch.sh
./2_build.sh
Example/ contient les scripts d'exemple et les cas de test pour utiliser Binvariants afin de fuzzer le binaire nconvert. Vous pouvez modifier les scripts pour fuzzer d'autres binaires.
Avant d'utiliser Binvariants, désactivez ASLR, car il nécessite des adresses de blocs de base cohérentes entre l'apprentissage des invariants et le fuzzing :
sudo sysctl -w kernel.randomize_va_space=0
Pour apprendre les invariants, exécutez :
./Example/1-learn_invs.sh [Binvariants_Root]
Les RLI inférés seront enregistrés dans le répertoire spécifié par BINV_TRACES_DIR dans 1-learn_invs.sh, nommé : [PROGRAM]_trace_qemu_invs.
Pour commencer le fuzzing avec Binvariants, exécutez :
./Example/2-fuzz.sh [Binvariants_Root] [Fuzz_Time] [Trial_Number]
Par exemple, exécutez le 1er essai d'une campagne de fuzzing de 48 heures depuis le répertoire racine de Binvariants :
./Example/2-fuzz.sh $PWD 48h 1
Voici des améliorations potentielles pour Binvariants.
Actuellement, Binvariants apprend les invariants avant le fuzzing, puis exécute le fuzzing séparément. Une amélioration possible consiste à apprendre les invariants pendant le fuzzing et à les mettre à jour au fur et à mesure des violations, permettant ainsi au retour d'information d'évoluer au fil du temps.
Considérations de conception possibles :
FSRV_RUN_OK).Binvariants se concentre actuellement sur les invariants à bloc unique. Une amélioration potentielle consiste à prendre en charge les invariants inter-blocs. Cela nécessite de nouvelles structures de données pour suivre les valeurs des registres à travers les frontières de blocs, ainsi qu'une instrumentation supplémentaire pour vérifier les violations lorsque le contrôle est transféré entre blocs.