本仓库提供 Binvariants 的源代码:一个原型模糊测试框架,利用寄存器级可能不变式违规来对二进制文件进行模糊测试。
本工作发表于我们的论文 Binvariants: Enhancing Fuzzing of Closed-source Binary Executables via Register-level Likely Invariants | 幻灯片,该论文发表于 2026 年 ACM 国际软件工程基础会议(FSE'26)。

| 引用本仓库: |
@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.}}
|
| 开发者: | Zao Yang([email protected])和 Stefan Nagy([email protected]) |
| 许可证: | MIT License |
| 免责声明: | 本软件按“原样”提供,不附带任何担保。 |
Binvariants 构建于 AFL++ 和 QEMU-AFL 之上。 在搭建 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 包含两个组件:
要构建每个组件,请导航到其对应的目录并运行以下命令:
./1_patch.sh
./2_build.sh
Example/ 包含用于使用 Binvariants 对 nconvert 二进制文件进行模糊测试的示例脚本和测试用例。你可以修改这些脚本以对其他二进制文件进行模糊测试。
在使用 Binvariants 之前,请禁用 ASLR,因为它需要在不变式学习和模糊测试之间保持一致的基本块地址:
sudo sysctl -w kernel.randomize_va_space=0
要学习不变量,请运行:
./Example/1-learn_invs.sh [Binvariants_Root]
推断出的 RLI 将保存在 1-learn_invs.sh 中由 BINV_TRACES_DIR 指定的目录下,命名为:[PROGRAM]_trace_qemu_invs。
要使用 Binvariants 开始模糊测试,请运行:
./Example/2-fuzz.sh [Binvariants_Root] [Fuzz_Time] [Trial_Number]
例如,从 Binvariants 的根目录运行一次为期 48 小时的模糊测试活动的第 1 次试验:
./Example/2-fuzz.sh $PWD 48h 1
以下是 Binvariants 可能的增强方向。
目前,Binvariants 在模糊测试之前学习不变量,然后单独运行模糊测试。一个可能的增强方向是在模糊测试过程中学习不变量,并在发生违反时更新它们,使反馈能够随时间演进。
可能的设计考量:
FSRV_RUN_OK)时才提交这些更新。Binvariants 目前专注于单块不变量。一个潜在的增强方向是支持跨块不变量。这需要新的数据结构来跨块边界跟踪寄存器值,以及额外的插桩来在控制流在块之间转移时检查违反情况。
如果您使用 Binvariants 发现了任何其他漏洞,请告诉我们!
本材料基于美国国家科学基金会(NSF)资助编号 2419798 以及美国国防高级研究计划局(DARPA)资助编号 FA8750-24-2-0002、子资助编号 GR105409-SUB00001384 所支持的工作。