FuturesLab/Binvariants
GitHub: FuturesLab/Binvariants
Binvariants 是一个基于寄存器级可能不变量违例来增强闭源二进制文件模糊测试效果的研究型 Fuzzing 框架。
Stars: 4 | Forks: 1
# Binvariants:针对二进制文件的寄存器级不变量引导 Fuzzing
本仓库提供了 **Binvariants** 的源代码:这是一个利用寄存器级可能不变量违例对二进制文件进行 Fuzzing 的原型 fuzzing 框架。
本研究成果已在我们的论文 [**Binvariants: Enhancing Fuzzing of Closed-source Binary Executables via Register-level Likely Invariants**](https://futures.cs.utah.edu/papers/26FSE-c.pdf) | [幻灯片](https://futures.cs.utah.edu/papers/26FSE-c_slides.pdf) 中发表,并将在 2026 年 ACM 软件工程基础国际会议 (FSE’26) 上展示。
* [安装 Binvariants](#installing-binvariants)
* [使用 Binvariants](#using-binvariants)
* [补充说明](#additional-notes)
* [Bug 荣誉堂](#bug-trophy-case)
# 安装 Binvariants
Binvariants 构建于 [**AFL++**](https://github.com/AFLplusplus/AFLplusplus/releases/tag/v4.21c) 和 [**QEMU-AFL**](https://github.com/AFLplusplus/qemuafl/tree/a6f0632a65e101e680dd72643a6128dd180dff72) 之上。
在设置 Binvariants 之前,请先安装这些项目所需的[依赖项](https://github.com/AFLplusplus/AFLplusplus/blob/stable/docs/INSTALL.md):
```
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
# 尝试安装 llvm-18,如果失败则安装发行版默认版本
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-Invariant_Learner/](1-Invariant_Learner/README.md)
* [2-Fuzzer/](1-Fuzzer/README.md)
要构建每个组件,请导航到它们各自的目录并运行以下命令:
```
./1_patch.sh
./2_build.sh
```
# 使用 Binvariants
[Example/](Example/README.md) 包含了使用 `Binvariants` 对 [nconvert](https://www.xnview.com/en/nconvert/) 二进制文件进行 Fuzzing 的示例脚本和测试用例。您可以修改这些脚本来 fuzz 其他的二进制文件。
## 设置
在使用 Binvariants 之前,请禁用 `ASLR`,因为在不变量学习和 Fuzzing 过程中需要保持一致的基本块地址:
```
sudo sysctl -w kernel.randomize_va_space=0
```
## 学习寄存器级可能不变量
要学习不变量,请运行:
```
./Example/1-learn_invs.sh [Binvariants_Root]
```
推断出的 RLI 将保存在 [1-learn_invs.sh](./Example/1-learn_invs.sh) 中由 `BINV_TRACES_DIR` 指定的目录下,命名为:`[PROGRAM]_trace_qemu_invs`。
## 使用 RLI 进行 Fuzzing
要开始使用 `Binvariants` 进行 Fuzzing,请运行:
```
./Example/2-fuzz.sh [Binvariants_Root] [Fuzz_Time] [Trial_Number]
```
例如,从 Binvariants 的根目录下运行为期 48 小时的 Fuzzing 活动的第 1 次试验:
```
./Example/2-fuzz.sh $PWD 48h 1
```
# 补充说明
以下是 Binvariants 潜在的改进方向。
### 自适应学习不变量
目前,Binvariants 会在 Fuzzing 之前学习不变量,然后单独运行 Fuzzing。一种可能的改进方案是在 Fuzzing 过程中学习不变量,并在发生违例时对其进行更新,从而让反馈随时间不断演进。
可能的设计考量:
1. 如果在执行某个随后发生崩溃或超时的测试用例期间更新了不变量,则可能需要回滚这些更新。一种实用的解决方案是将更新应用于不变量的副本中,并且仅当测试用例正常完成(即 `FSRV_RUN_OK`)时才提交它们。
2. 随着 Fuzzing 的进行和不变量的更新,违例自然变得越来越少。这可能会导致 AFL++ 反复选择早期的测试用例(这些用例会触发更多违例,但代表的程序状态不够演进)。可能需要在 AFL++ 端进行 [weight/perf_score/top_rated](https://github.com/AFLplusplus/AFLplusplus/blob/stable/src/afl-fuzz-queue.c) 调整,以确保后续更具代表性的测试用例被选中。
### 跨基本块不变量
Binvariants 目前主要关注单块不变量。一个潜在的改进方向是支持跨块不变量。这需要新的数据结构来跟踪跨越基本块边界的寄存器值,以及额外的 instrumentation 来在控制流于基本块之间转移时检查违例。
# Bug 荣誉堂
| 程序 | 报告的 Bug |
| ---- | ---- |
| nconvert | https://newsgroup.xnview.com/viewtopic.php?t=49598 |
| xls2csv | https://github.com/vbwagner/catdoc/issues/6, https://github.com/vbwagner/catdoc/issues/7, https://github.com/vbwagner/catdoc/issues/8, https://github.com/vbwagner/catdoc/issues/9, https://github.com/vbwagner/catdoc/issues/10, https://github.com/vbwagner/catdoc/issues/11, https://github.com/vbwagner/catdoc/issues/12, https://github.com/vbwagner/catdoc/issues/13 |
| gpmf | https://github.com/gopro/gpmf-parser/issues/201, https://github.com/gopro/gpmf-parser/issues/202, https://github.com/gopro/gpmf-parser/issues/203 |
| hdf5 | https://github.com/HDFGroup/hdf5/issues/5831, https://github.com/HDFGroup/hdf5/issues/5832, https://github.com/HDFGroup/hdf5/issues/5834 |
| storm | https://github.com/ladislav-zezula/StormLib/issues/397, https://github.com/ladislav-zezula/StormLib/issues/398 |
| mp4split | https://github.com/axiomatic-systems/Bento4/issues/1038, https://github.com/axiomatic-systems/Bento4/issues/1039 |
| cpdf | https://github.com/johnwhitington/camlpdf/issues/75 |
| sfconvert | https://github.com/mpruett/audiofile/issues/73 |
如果您在使用 Binvariants 时发现了任何其他 Bug,请告诉我们!
# 致谢
本材料基于美国国家科学基金会 (NSF) 奖项编号 2419798 以及美国国防高级研究计划局 (DARPA) 奖项编号 FA8750-24-2-0002、分包合同编号 GR105409-SUB00001384 所支持的工作。
本仓库提供了 **Binvariants** 的源代码:这是一个利用寄存器级可能不变量违例对二进制文件进行 Fuzzing 的原型 fuzzing 框架。
本研究成果已在我们的论文 [**Binvariants: Enhancing Fuzzing of Closed-source Binary Executables via Register-level Likely Invariants**](https://futures.cs.utah.edu/papers/26FSE-c.pdf) | [幻灯片](https://futures.cs.utah.edu/papers/26FSE-c_slides.pdf) 中发表,并将在 2026 年 ACM 软件工程基础国际会议 (FSE’26) 上展示。
* [安装 Binvariants](#installing-binvariants)
* [使用 Binvariants](#using-binvariants)
* [补充说明](#additional-notes)
* [Bug 荣誉堂](#bug-trophy-case)
| 引用本仓库: |
@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 (zao.yang@utah.edu) 和 Stefan Nagy (snagy@cs.utah.edu) |
| 许可证: | MIT 许可证 |
| 免责声明: | 本软件按“原样”提供,不提供任何担保。 |
标签:二进制分析, 云安全运维, 安全测试, 客户端加密, 攻击性安全, 逆向工具, 闭源软件分析, 预握手