
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 di Binvariants: un framework di fuzzing prototipale che sfrutta le violazioni probabili di invarianti a livello di registro per il fuzzing di binari.
Questo lavoro è presentato nel nostro articolo Binvariants: Enhancing Fuzzing of Closed-source Binary Executables via Register-level Likely Invariants | Slide, che compare nel 2026 ACM International Conference on the Foundations of Software Engineering (FSE'26).

| Citare questo repository: |
@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.}}
|
| Sviluppatori: | Zao Yang ([email protected]) e Stefan Nagy ([email protected]) |
| Licenza: | MIT License |
| Dichiarazione di non responsabilità: | Questo software è fornito così com'è, senza alcuna 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 compilare ciascuno, navigare nella 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é necessita di indirizzi di blocco base coerenti 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, con il nome: [PROGRAM]_trace_qemu_invs.
Per avviare il fuzzing con Binvariants, eseguire:
./Example/2-fuzz.sh [Binvariants_Root] [Fuzz_Time] [Trial_Number]
Ad esempio, esegui la prima prova di una campagna di fuzzing di 48 ore dalla directory principale 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 consiste nell'apprendere gli invarianti durante il fuzzing e nell'aggiornarli man mano che si verificano violazioni, consentendo al feedback di evolversi nel tempo.
Possibili considerazioni di progettazione:
FSRV_RUN_OK).Binvariants attualmente si concentra sugli invarianti a singolo blocco. Un potenziale miglioramento è il supporto agli invarianti tra blocchi. Ciò richiede nuove strutture dati per tracciare i valori dei registri attraverso i confini dei blocchi, nonché strumentazione aggiuntiva per verificare le violazioni quando il controllo passa tra i blocchi.