Ledger-Donjon/absolution
GitHub: Ledger-Donjon/absolution
Absolution 是一款 C 程序模糊测试代码生成工具,通过 invariant 约束和全局状态采样来发现复杂调用交错中的深层 bug。
Stars: 0 | Forks: 0
# Absolution
Absolution 允许你为程序的全局状态指定一个 invariant,并从均匀采样的 invariant 状态中对其 entrypoint 进行 fuzz 测试。这有助于暴露任何调用交错中的 bug,前提是 fuzzer 能够充分探索该状态空间。
## 工作原理
1. 使用 [aro](https://github.com/Vexu/aro) 从你的 C 翻译单元中解析全局变量。
2. 构建包含字段、padding 和 domains 的扁平化全局变量。
3. 可选地应用 `.zon` invariant 来约束字段值(每个元素的 `.values` / `.pointers`,或对数组类型字段使用带有 `.whole_values` 的整个字段 blob;参见 [USAGE.md](USAGE.md))。
4. 生成包含采样、invariant 检查和 libFuzzer entrypoint 的 `fuzzer.c`。
5. 生成用于 `objcopy` 的符号重定义文件(处理跨翻译单元的 `static` 全局变量)。
6. 写入一个大小符合所需随机字节的可选 seed 文件。
## 环境要求
- **Zig 0.16.0**(依据 `build.zig.zon`)
- **C 工具链**,需支持 libFuzzer(例如 `clang -fsanitize=fuzzer`)
- **objcopy**(GNU binutils 或 `llvm-objcopy`)—— 用于静态符号重定义
## 快速开始
```
# 构建 absolution
zig build -Doptimize=ReleaseFast
# 显示 CLI 帮助
./zig-out/bin/absolution -h
# 从一个或多个 translation units 生成 fuzzer 源码
./zig-out/bin/absolution \
-t path/to/module_a.c \
-t path/to/module_b.c \
--entry MyTestOneInput \
--out fuzzer.c \
--redef fuzzer.redef \
--seed fuzzer.seed \
-- -I path/to/include -DMY_DEFINE=42
# 编译 targets,应用 objcopy,链接并运行
clang -g -c module_a.c -o module_a.o
clang -g -c module_b.c -o module_b.o
# (对每个 fuzzer.redef 应用 objcopy --redefine-sym / --globalize-symbol)
clang -g -fsanitize=fuzzer,address fuzzer.c harness.c module_a.o module_b.o -o fuzzer
mkdir -p corpus && cp fuzzer.seed corpus/
./fuzzer corpus/
```
## CMake 集成
Absolution 提供了用于 `find_package(Absolution)` 的 CMake 模块。安装完成后,
只需调用单个函数即可将 fuzz 测试添加到现有的 CMake 项目中:
```
find_package(Absolution REQUIRED)
absolution_add_fuzzer(
NAME fuzz_my_target
TARGETS src/module_a.c src/module_b.c
HARNESS fuzz/my_harness.c
ENTRY MyTestOneInput
INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/include"
COMPILE_DEFINITIONS "MY_DEFINE=42"
)
```
这会创建一个 CMake target,用于处理整个 pipeline:运行 absolution、
编译目标文件、应用 `objcopy` 符号重定义,并链接带有 sanitizers 的最终 fuzzer
二进制文件。
请参阅 **[example/protocol_parser/](example/protocol_parser/)** 以获取包含多个翻译单元的完整工作示例。
## 测试
```
zig build test # Run unit tests
zig run scripts/integration.zig # Integration tests
zig run scripts/integration.zig -- foo # Run only tests matching "foo"
```
## 文档
- **[USAGE.md](USAGE.md)** — 包含示例和行为参考的详细使用指南
- **[CONTRIBUTING.md](CONTRIBUTING.md)** — 代码组织和开发工作流
- **[example/protocol_parser/](example/protocol_parser/)** — 完整的 CMake 集成示例
标签:Bash脚本, libFuzzer, SOC Prime, Zig, 代码安全审计, 开发工具