
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 prototipo de framework de fuzzing que aprovecha las violaciones de invariantes probables a nivel de registro para el fuzzing de binarios.
Este trabajo se presenta en nuestro artículo Binvariants: Enhancing Fuzzing of Closed-source Binary Executables via Register-level Likely Invariants, que aparecerá en la Conferencia Internacional ACM de 2026 sobre Fundamentos de Ingeniería de Software (FSE’26).

| Citando este repositorio: |
@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.}}
|
| Desarrolladores: | Zao Yang ([email protected]) y Stefan Nagy ([email protected]) |
| Licencia: | Licencia MIT |
| Aviso legal: | Este software se proporciona tal cual, sin garantía. |
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 construir cada uno, navega a su directorio correspondiente y ejecuta los siguientes comandos:
./1_patch.sh
./2_build.sh
Example/ contiene los scripts de ejemplo y casos de prueba para usar Binvariants para fuzzear el binario nconvert. Puedes modificar los scripts para fuzzear otros binarios.
Antes de usar Binvariants, deshabilita 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, ejecuta:
./Example/1-learn_invs.sh [Binvariants_Root]
Los RLIs 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 iniciar el fuzzing con Binvariants, ejecuta:
./Example/2-fuzz.sh [Binvariants_Root] [Fuzz_Time] [Trial_Number]
Por ejemplo, ejecuta la primera prueba 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 es aprender invariantes durante el fuzzing y actualizarlos a medida que ocurren 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 los bloques, así como instrumentación adicional para verificar violaciones cuando el control se transfiere entre bloques.
Si encuentras algún otro error usando Binvariants, ¡por favor notifícanos!
Este material se basa en trabajo apoyado por la National Science Foundation (NSF) bajo el Premio No. 2419798, y por la Defense Advanced Research Projects Agency (DARPA) bajo el Premio No. FA8750-24-2-0002, Sub-premio No. GR105409-SUB00001384.
| Programas | Errores Reportados |
|---|