copyleftdev/asan-harness
GitHub: copyleftdev/asan-harness
一个用于驱动 AddressSanitizer 并将输出转化为结构化崩溃报告的 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 stderr 的解析器(堆缓冲区溢出、栈缓冲区溢出、堆使用后释放、双重释放、无效释放、栈使用后释放(返回/作用域))。支持传统的 `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`),可对任意用户提供的谓词进行输入缩减。
- 内存中的语料库,采用香农熵加权选择(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")`,以确保配置错误时明显失败。
- `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` 还需要系统路径中有 `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)、整数溢出未定义行为(UBSan)或对象内溢出,也不会预测可利用性。详见 SPEC §14,了解本工具无法识别的完整列表。
## 许可证
Apache-2.0 或 MIT(双重许可)。
标签:AddressSanitizer, ASan, ddmin, Docker支持, double-free, Frida, Fuzzing, invalid-free, JSON, libFuzzer, QASan, QEMU, RE, Rust, sanitizer, use-after-free, Waymore结果处理, 二进制分析, 云安全运维, 内存安全, 内存审计, 内存损坏, 内联执行, 反向工程, 可视化界面, 固件审计, 堆溢出, 崩溃报告, 情报收集, 栈溢出, 漏洞研究, 编译器, 网络流量审计, 自动化分析, 跨站脚本, 身份验证强制, 通知系统