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, 代码安全审计, 开发工具