
Framework de fuzzing guiado por invariantes a nível de registo para binários de código fechado, aproveitando prováveis violações de invariantes para descobrir crashes e bugs em executáveis binários.
Este repositório fornece o código-fonte para o Binvariants: um protótipo de framework de fuzzing que utiliza violações de invariantes prováveis em nível de registro para fuzzing de binários.
Este trabalho é apresentado em nosso artigo Binvariants: Enhancing Fuzzing of Closed-source Binary Executables via Register-level Likely Invariants, a ser publicado na ACM International Conference on the Foundations of Software Engineering (FSE’26) de 2026.

| Citação deste repositório: |
@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.}}
|
| Desenvolvedores: | Zao Yang ([email protected]) e Stefan Nagy ([email protected]) |
| Licença: | Licença MIT |
| Aviso legal: | Este software é fornecido "como está", sem nenhuma garantia. |
O Binvariants é construído sobre o AFL++ e o QEMU-AFL. Instale as dependências exigidas por esses projetos antes de configurar o 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
# tente instalar o llvm-18 e instale o padrão da distribuição se falhar
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 # para modo QEMU
O Binvariants inclui dois componentes:
Para compilar cada um, navegue até o diretório correspondente e execute os seguintes comandos:
./1_patch.sh
./2_build.sh
Example/ contém scripts de exemplo e casos de teste para usar o Binvariants no fuzzing do binário nconvert. Você pode modificar os scripts para fazer fuzzing em outros binários.
Antes de usar o Binvariants, desabilite o ASLR, pois ele precisa de endereços de blocos básicos consistentes entre o aprendizado de invariantes e o fuzzing:
sudo sysctl -w kernel.randomize_va_space=0
Para aprender invariantes, execute:
./Example/1-learn_invs.sh [Binvariants_Root]
Os RLIs inferidos serão salvos no diretório especificado por BINV_TRACES_DIR em 1-learn_invs.sh, com o nome: [PROGRAM]_trace_qemu_invs.
Para iniciar o fuzzing com o Binvariants, execute:
./Example/2-fuzz.sh [Binvariants_Root] [Fuzz_Time] [Trial_Number]
Por exemplo, execute a 1ª tentativa de uma campanha de fuzzing de 48 horas a partir do diretório raiz do Binvariants:
./Example/2-fuzz.sh $PWD 48h 1
Abaixo estão possíveis melhorias para o Binvariants.
Atualmente, o Binvariants aprende invariantes antes do fuzzing e depois executa o fuzzing separadamente. Uma melhoria possível é aprender invariantes durante o fuzzing e atualizá-los à medida que violações ocorrem, permitindo que o feedback evolua com o tempo.
Possíveis considerações de design:
FSRV_RUN_OK).O Binvariants atualmente foca em invariantes de bloco único. Uma melhoria potencial é suportar invariantes entre blocos. Isso exigiria novas estruturas de dados para rastrear valores de registros através dos limites dos blocos, bem como instrumentação adicional para verificar violações quando o controle é transferido entre blocos.
Se você encontrar outros bugs usando o Binvariants, por favor nos avise!
Este material é baseado em trabalho apoiado pela National Science Foundation (NSF) sob o Prêmio No. 2419798, e pela Defense Advanced Research Projects Agency (DARPA) sob o Prêmio No. FA8750-24-2-0002, Subprêmio No. GR105409-SUB00001384.
| Programas | Bugs Relatados |
|---|