
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 enthält den Quellcode für Binvariants: ein prototypisches Fuzzing-Framework, das Verletzungen von wahrscheinlichen Invarianten auf Registerebene für das Fuzzing von Binärdateien nutzt.
Diese Arbeit wird in unserem Paper Binvariants: Enhancing Fuzzing of Closed-source Binary Executables via Register-level Likely Invariants vorgestellt, das auf der ACM International Conference on the Foundations of Software Engineering (FSE’26) 2026 erscheint.

| Zitieren dieses Repository: |
@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.}}
|
| Entwickler: | Zao Yang ([email protected]) und Stefan Nagy ([email protected]) |
| Lizenz: | MIT-Lizenz |
| Haftungsausschluss: | Diese Software wird ohne Gewährleistung bereitgestellt. |
Binvariants basiert auf AFL++ und QEMU-AFL. Installieren Sie die Abhängigkeiten, die von diesen Projekten benötigt werden, 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 umfasst 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 zur Verwendung von Binvariants zum Fuzzing der Binärdatei nconvert. Sie können die Skripte ändern, um andere Binärdateien zu fuzzen.
Vor der Verwendung von Binvariants deaktivieren Sie ASLR, da es konsistente Basisblockadressen zwischen Invariantenlernen und Fuzzing benötigt:
sudo sysctl -w kernel.randomize_va_space=0
Um Invarianten zu lernen, führen Sie aus:
./Example/1-learn_invs.sh [Binvariants_Root]
Die abgeleiteten RLIs werden in dem in 1-learn_invs.sh angegebenen Verzeichnis BINV_TRACES_DIR gespeichert, mit dem Namen: [PROGRAM]_trace_qemu_invs.
Um das Fuzzing mit Binvariants zu starten, 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 Verbesserungen von Binvariants.
Derzeit lernt Binvariants Invarianten vor dem Fuzzing und führt dann das Fuzzing getrennt durch. Eine mögliche Verbesserung besteht darin, Invarianten während des Fuzzings zu lernen und sie bei Verstößen 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 eines einzelnen Blocks. Eine mögliche Verbesserung ist die Unterstützung blockübergreifender Invarianten. Dies erfordert neue Datenstrukturen zur Verfolgung von Registerwerten über Blockgrenzen hinweg sowie zusätzliche Instrumentierung, um Verstöße zu überprüfen, wenn die Kontrolle zwischen Blöcken wechselt.
Wenn Sie mit Binvariants weitere Fehler finden, teilen Sie uns dies bitte mit!
Dieses Material basiert auf Arbeiten, die von der National Science Foundation (NSF) unter der Fördernummer 2419798 und von der Defense Advanced Research Projects Agency (DARPA) unter der Fördernummer FA8750-24-2-0002, Unterauftragsnummer GR105409-SUB00001384, unterstützt wurden.
| Programme | Gemeldete Fehler |
|---|