
Marco de fuzzing guiado por invariantes a nivel de registro para binarios de código cerrado, aprovechando violaciones de invariantes probables para descubrir fallos y errores en ejecutables binarios.
Este repositorio proporciona el código fuente de Binvariants: un framework prototipo de fuzzing que aprovecha las violaciones probables de invariantes a nivel de registro para hacer fuzzing de binarios.
Este trabajo se presenta en nuestro artículo Binvariants: Enhancing Fuzzing of Closed-source Binary Executables via Register-level Likely Invariants | Diapositivas, que aparece en la 2026 ACM International Conference on the Foundations of Software Engineering (FSE’26).

| Cómo citar este repositorio: |
@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.}}
|
| Desarrolladores: | Zao Yang ([email protected]) y Stefan Nagy ([email protected]) |
| Licencia: | Licencia MIT |
| Descargo de responsabilidad: | Este software se proporciona tal cual, sin garantía alguna. |
Binvariants está construido sobre AFL++ y QEMU-AFL. Instala las dependencias requeridas por estos proyectos antes de configurar 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 incluye dos componentes:
Para compilar cada uno, navegue al directorio correspondiente y ejecute los siguientes comandos:
./1_patch.sh
./2_build.sh
Example/ contiene los scripts de ejemplo y los casos de prueba para usar Binvariants para hacer fuzzing del binario nconvert. Puedes modificar los scripts para hacer fuzzing de otros binarios.
Antes de usar Binvariants, desactiva ASLR, ya que necesita direcciones de bloques básicos consistentes entre el aprendizaje de invariantes y el fuzzing:
sudo sysctl -w kernel.randomize_va_space=0
Para aprender invariantes, ejecute:
./Example/1-learn_invs.sh [Binvariants_Root]
Los RLI inferidos se guardarán en el directorio especificado por BINV_TRACES_DIR en 1-learn_invs.sh, con el nombre: [PROGRAM]_trace_qemu_invs.
Para comenzar el fuzzing con Binvariants, ejecute:
./Example/2-fuzz.sh [Binvariants_Root] [Fuzz_Time] [Trial_Number]
Por ejemplo, ejecute el primer ensayo de una campaña de fuzzing de 48 horas desde el directorio raíz de Binvariants:
./Example/2-fuzz.sh $PWD 48h 1
A continuación se presentan posibles mejoras para Binvariants.
Actualmente, Binvariants aprende invariantes antes del fuzzing y luego ejecuta el fuzzing por separado. Una posible mejora consiste en aprender invariantes durante el fuzzing y actualizarlos a medida que se producen violaciones, permitiendo que la retroalimentación evolucione con el tiempo.
Posibles consideraciones de diseño:
FSRV_RUN_OK).Binvariants actualmente se centra en invariantes de un solo bloque. Una posible mejora es admitir invariantes entre bloques. Esto requiere nuevas estructuras de datos para rastrear los valores de los registros a través de los límites de bloque, así como instrumentación adicional para comprobar violaciones cuando el control se transfiere entre bloques.