
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 cadriciel de fuzzing qui exploite les violations probables d'invariants au niveau des registres pour fuzzer des binaires.
Ce travail est présenté dans notre article Binvariants: Enhancing Fuzzing of Closed-source Binary Executables via Register-level Likely Invariants, à paraître à la conférence 2026 de l'ACM International Conference on the Foundations of Software Engineering (FSE’26).

| Citation de ce dépôt : |
@inproceedings{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
Binvariants comprend deux composants :
Pour construire chacun d'eux, accédez à 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 sauvegardés dans le répertoire spécifié par BINV_TRACES_DIR dans 1-learn_invs.sh, nommé : [PROGRAM]_trace_qemu_invs.
Pour démarrer le fuzzing avec Binvariants, exécutez :
./Example/2-fuzz.sh [Binvariants_Root] [Fuzz_Time] [Trial_Number]
Par exemple, lancez 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 quelques améliorations potentielles de Binvariants.
Actuellement, Binvariants apprend les invariants avant le fuzzing, puis exécute le fuzzing séparément. Une amélioration possible serait d'apprendre les invariants pendant le fuzzing et de les mettre à jour au fur et à mesure que des violations se produisent, permettant ainsi à la rétroaction d'évoluer dans le temps.
Considérations possibles pour la conception :
FSRV_RUN_OK).Binvariants se concentre actuellement sur les invariants de bloc unique. Une amélioration potentielle serait de prendre en charge les invariants inter-blocs. Cela nécessite de nouvelles structures de données pour suivre les valeurs des registres à travers les limites des blocs, ainsi qu'une instrumentation supplémentaire pour vérifier les violations lors des transferts de contrôle entre blocs.
Si vous trouvez d'autres bugs en utilisant Binvariants, veuillez nous en informer !
Ce travail a été soutenu par la National Science Foundation (NSF) sous le numéro de projet n° 2419798, et par la Defense Advanced Research Projects Agency (DARPA) sous le numéro de projet n° FA8750-24-2-0002, sous-projet n° GR105409-SUB00001384.
| Programmes | Bugs rapportés |
|---|