codetestcode/asan-harness
GitHub: codetestcode/asan-harness
一个用于解析与分类 AddressSanitizer 崩溃事件并生成稳定 JSON 报告的 Rust 驱动逆向分析框架。
Stars: 0 | Forks: 0
# asan-harness
一个用于驱动 AddressSanitizer 插桩目标并将其输出转换为可分类崩溃报告的 Rust harness。
专为逆向工程工作而构建,目标可能是 Rust crate、FFI 边界后的 C/C++ 库、在 QEMU 下运行的剥离二进制文件,或在 Unicorn 或 QEMU 系统模式下托管的固件镜像。
[SPEC.md](./SPEC.md) 包含了设计、数学模型和操作模式。本 README 涵盖已实现的内容、构建方法和使用方式。
## 关于
`asan-harness` 位于内存安全 sanitizer 与人工分析员之间。
它读取目标输出的原始 sanitizer 事件,对每个事件进行分类(堆缓冲区溢出、释放后使用、双重释放等),在可用时附加分配与释放的溯源信息,并生成一个稳定的 JSON 报告,供下游工具(分类、最小化、重放)消费。
目标是构建一个适用于常见逆向工程模式的统一流水线:
- 使用 `-fsanitize=address` 重新编译的源码可用的 Rust 或 C/C++
- 通过 Frida 插桩的闭源共享库
- 在 QEMU 下运行的 QASan 剥离二进制文件
- 在 Unicorn 或 QEMU 系统模式下托管的固件镜像
Sanitizer 的数学模型、不变量以及该工具能或不能检测的内容边界均在 `SPEC.md` 中完整记录。本仓库即为实现。
## 状态
当前已实现:
- 编译器运行时 AddressSanitizer 标准错误输出的解析器(堆缓冲区溢出、栈缓冲区溢出、堆使用后释放、双重释放、无效释放、栈使用后返回/作用域)。支持传统的 `to the right of` 表述以及 LLVM 20+ 的 `N bytes after` 形式。
- 带稳定 JSON 模式(`schema_version = 1`)的崩溃报告类型,基于前 N 个符号化帧的 FNV-1a-64 哈希去重,并按 SPEC §12.2 进行严重性排名。
- CLI:`doctor`、`ingest`、`triage`、`replay`、`minify`。
- 差分调试最小化器(`ddmin`),可对任意用户提供的谓词收缩输入。
- 带 Shannon 熵加权的语料库内存选择(SPEC §8.4)。
- 端到端演示:Rust 二进制文件使用 nightly `-Zsanitizer=address` **或** 使用 `clang -fsanitize=address` 编译的 C 库 → harness 摄入、聚类、重放。
尚未实现(存根):
- `asan-re-frida`(模式 B)、`asan-re-qemu`(模式 C)、`asan-re-firmware`(模式 D)。`Sanitizer` 特性的实现会返回 `SanError::Runtime("not yet implemented")`,因此配置错误的 harness 会明确失败。
- `asan-harness run` 和 `cov` 子命令。与 `libafl_libfuzzer` 的连接尚未就绪;`fuzz_target!` 宏会发出 libFuzzer ABI,但目前尚未驱动。
## 构建
用于 harness 自身的稳定工具链:
```
cargo build --workspace
cargo test --workspace
```
两个演示 crate(`rust-asan`、`c-ffi-asan`)需要 nightly,因为它们依赖 `-Zsanitizer=address`:
```
RUSTFLAGS="-Zsanitizer=address" \
cargo +nightly build \
--target x86_64-unknown-linux-gnu \
-p rust-asan -p c-ffi-asan
```
`c-ffi-asan` 还需要 PATH 中有 `clang`;其 `build.rs` 会针对 `c/buggy.c` 调用 `clang -fsanitize=address -O0`。
## 使用
针对真实 ASan 输出的端到端示例:
```
./target/x86_64-unknown-linux-gnu/debug/rust-asan-demo hbo 2>asan.log
cargo run -q --bin asan-harness -- ingest --file asan.log --out-dir crashes/
cargo run -q --bin asan-harness -- triage --dir crashes/
```
机器可读输出:
```
asan-harness --format json ingest --file asan.log
asan-harness --format json triage --dir crashes/
```
针对合成谓词的最小化崩溃报告(独立运行,无需目标):
```
asan-harness minify crash.json --keep-byte 0x41 --out crash.min.json
```
完整流水线(构建两个演示程序,运行所有错误模式,断言产生六个不同的聚类):
```
./scripts/verify-asan.sh
```
## 目录结构
```
crates/
asan-core Sanitizer trait; shadow-memory math and invariants (§2).
asan-alloc GlobalAlloc wrapper routing allocator events through a Sanitizer.
asan-oracle CrashReport/CrashKind/Severity; FNV-1a dedup; ASan log parser.
asan-driver Target/Oracle traits; fuzz_target! macro; replay runner; ddmin.
asan-corpus Seed corpus with Shannon-entropy weighted selection (§8.4).
asan-re-frida Mode B stub (closed-source .so via Frida).
asan-re-qemu Mode C stub (stripped binary via QEMU/QASan).
asan-re-firmware Mode D stub (firmware re-hosting).
asan-cli `asan-harness` binary.
examples/
demo Canned ASan fixtures → CrashReport → triage.
rust-asan Rust binary with planted bugs; requires nightly ASan.
c-ffi-asan C library (ASan-instrumented) + Rust FFI harness.
scripts/
verify-asan.sh End-to-end pipeline verification.
```
## 测试
```
asan-oracle 20 tests (CrashReport, dedup, log parser, schema)
asan-core 15 tests ( 9 proptest properties for shadow invariants)
asan-driver 7 tests (Target/Oracle, replay, ddmin)
asan-corpus 4 tests (entropy, rare-edge dominance, determinism)
asan-alloc 2 tests
─────────────────────
48 tests passing
```
`cargo clippy --workspace --all-targets -- -D warnings` 通过无警告。
## 范围
该 harness 报告 AddressSanitizer 观察到的内存安全事实。
它不会发现未初始化读(MemorySanitizer)、数据竞争(ThreadSanitizer)、整数溢出 UB(UBSan)或对象内溢出。也不会预测可利用性。详见 SPEC §14 本工具无法识别的完整列表。
## 许可证
Apache-2.0 或 MIT(双重许可)。
标签:AddressSanitizer, asan-harness, corpus, crash report, ddmin, Delta调试, Docker支持, Double-Free, Frida, JSON报告, parser, QEMU, reverse engineering, Rust, Sanitizer, schema_version, Triage, Use-After-Free, 云资产清单, 内存安全, 内联执行, 可视化界面, 固件分析, 堆溢出, 崩溃分析, 无符号二进制, 熵权重选择, 网络流量审计, 身份验证强制, 逆向工程, 通知系统