
Quadro di fuzzing guidato da invarianti a livello di registro per binari closed-source, sfruttando probabili violazioni di invarianti per scoprire crash e bug in eseguibili binari.
Questo repository fornisce il codice sorgente per Binvariants: un framework di fuzzing prototipo che sfrutta le violazioni di invarianti probabili a livello di registro per il fuzzing di binari.
Questo lavoro è presentato nel nostro articolo Binvariants: Migliorare il Fuzzing di Eseguibili Binari Closed-source tramite Invarianti Probabili a Livello di Registro, in pubblicazione alla ACM International Conference on the Foundations of Software Engineering (FSE’26) del 2026.

| Citare questo 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.}}
|
| Sviluppatori: | Zao Yang ([email protected]) e Stefan Nagy ([email protected]) |
| Licenza: | Licenza MIT |
| Disclaimer: | Questo software è fornito così com'è senza garanzia. |
Binvariants è costruito su AFL++ e QEMU-AFL. Installare le dipendenze richieste da questi progetti prima di configurare 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 include due componenti:
Per costruire ciascuno, navigare nella loro directory corrispondente ed eseguire i seguenti comandi:
./1_patch.sh
./2_build.sh
Example/ contiene gli script di esempio e i casi di test per utilizzare Binvariants per il fuzzing del binario nconvert. È possibile modificare gli script per eseguire il fuzzing di altri binari.
Prima di utilizzare Binvariants, disabilitare ASLR, poiché ha bisogno di indirizzi di blocchi di base consistenti tra l'apprendimento degli invarianti e il fuzzing:
sudo sysctl -w kernel.randomize_va_space=0
Per apprendere gli invarianti, eseguire:
./Example/1-learn_invs.sh [Binvariants_Root]
Gli RLI inferiti verranno salvati nella directory specificata da BINV_TRACES_DIR in 1-learn_invs.sh, denominata: [PROGRAM]_trace_qemu_invs.
Per avviare il fuzzing con Binvariants, eseguire:
./Example/2-fuzz.sh [Binvariants_Root] [Fuzz_Time] [Trial_Number]
Ad esempio, eseguire la prima prova di una campagna di fuzzing di 48 ore dalla directory radice di Binvariants:
./Example/2-fuzz.sh $PWD 48h 1
Di seguito sono riportati potenziali miglioramenti a Binvariants.
Attualmente, Binvariants apprende gli invarianti prima del fuzzing e poi esegue il fuzzing separatamente. Un possibile miglioramento è apprendere gli invarianti durante il fuzzing e aggiornarli man mano che si verificano violazioni, consentendo al feedback di evolversi nel tempo.
Possibili considerazioni progettuali:
FSRV_RUN_OK).Binvariants si concentra attualmente su invarianti di singolo blocco. Un potenziale miglioramento è supportare invarianti tra blocchi. Richiede nuove strutture dati per tracciare i valori dei registri attraverso i confini dei blocchi, oltre a strumentazione aggiuntiva per verificare le violazioni quando il controllo viene trasferito tra blocchi.
Se trovi altri bug utilizzando Binvariants, faccelo sapere!
Questo materiale si basa su lavoro supportato dalla National Science Foundation (NSF) con Award No. 2419798, e dalla Defense Advanced Research Projects Agency (DARPA) con Award No. FA8750-24-2-0002, Subaward No. GR105409-SUB00001384.
| Programmi | Bug Segnalati |
|---|