
Ein auf Registerebene invarianzgeführtes Fuzzing-Framework für Closed-Source-Binärdateien, das wahrscheinliche Invariantenverletzungen nutzt, um Abstürze und Fehler in Binärausführungsdateien zu entdecken.
Dieses Repository stellt den Quellcode für Binvariants bereit: ein Prototyp-Fuzzing-Framework, das registerbasierte wahrscheinliche Invariantenverletzungen für das Fuzzing von Binaries nutzt.
Diese Arbeit wird in unserem Paper Binvariants: Enhancing Fuzzing of Closed-source Binary Executables via Register-level Likely Invariants | Folien vorgestellt, das auf der 2026 ACM International Conference on the Foundations of Software Engineering (FSE’26) erscheint.

| Dieses Repository zitieren: |
@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.}}
|
| Entwickler: | Zao Yang ([email protected]) und Stefan Nagy ([email protected]) |
| Lizenz: | MIT-Lizenz |
| Haftungsausschluss: | Diese Software wird ohne jegliche Gewährleistung bereitgestellt. |
Binvariants baut auf AFL++ und QEMU-AFL auf. Installieren Sie die von diesen Projekten benötigten Abhängigkeiten, bevor Sie Binvariants einrichten:
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 umfassen zwei Komponenten:
Um jede zu erstellen, navigieren Sie in das entsprechende Verzeichnis und führen Sie die folgenden Befehle aus:
./1_patch.sh
./2_build.sh
Example/ enthält die Beispielskripte und Testfälle für die Verwendung von Binvariants zum Fuzzing der nconvert-Binärdatei. Sie können die Skripte anpassen, um andere Binärdateien zu fuzzen.
Bevor Sie Binvariants verwenden, deaktivieren Sie ASLR, da es konsistente Basisblockadressen zwischen dem Erlernen der Invarianten und dem Fuzzing benötigt:
sudo sysctl -w kernel.randomize_va_space=0
Um Invarianten zu erlernen, führen Sie aus:
./Example/1-learn_invs.sh [Binvariants_Root]
Die abgeleiteten RLIs werden in dem Verzeichnis gespeichert, das durch BINV_TRACES_DIR in 1-learn_invs.sh angegeben wird, benannt als: [PROGRAM]_trace_qemu_invs.
Um mit dem Fuzzing mit Binvariants zu beginnen, führen Sie aus:
./Example/2-fuzz.sh [Binvariants_Root] [Fuzz_Time] [Trial_Number]
Führen Sie zum Beispiel den 1. Durchlauf einer 48-stündigen Fuzzing-Kampagne aus dem Stammverzeichnis von Binvariants aus:
./Example/2-fuzz.sh $PWD 48h 1
Im Folgenden finden Sie mögliche Erweiterungen für Binvariants.
Derzeit lernt Binvariants Invarianten vor dem Fuzzing und führt das Fuzzing anschließend separat aus. Eine mögliche Erweiterung besteht darin, Invarianten während des Fuzzings zu lernen und sie bei Verletzungen zu aktualisieren, sodass sich das Feedback im Laufe der Zeit weiterentwickeln kann.
Mögliche Designüberlegungen:
FSRV_RUN_OK).Binvariants konzentriert sich derzeit auf Invarianten innerhalb einzelner Blöcke. Eine mögliche Erweiterung ist die Unterstützung blockübergreifender Invarianten. Dies erfordert neue Datenstrukturen zur Verfolgung von Registerwerten über Blockgrenzen hinweg sowie zusätzliche Instrumentierung, um Verletzungen zu prüfen, wenn die Kontrolle zwischen Blöcken übergeht.