Show HN: Autarkie - 使用 Rust Macros 实现即时语法模糊测试
Autarkie 是一个基于 Rust 的语法模糊测试器,利用过程宏实现自动化。它主要特点包括:作为 `arbitrary` 的替代品,进行真正的语法模糊测试,支持 AFL++ 和 cargo-fuzz,易于使用,并能与其他模糊测试器集成。Autarkie 具有无需语法维护、语法详尽、语料库可重用等独特优势。它提供两种使用方法:模糊测试 C/C++ 项目(如 `sqlite3`)和 Rust 项目(如 `sbpf` 解释器)。目前处于 Beta 阶段,存在静态生命周期和仅支持 `nightly` 版本等局限性。欢迎贡献和反馈。
Autarkie 是一个用 Rust 构建的原生语法模糊测试器。它使用过程宏(procedural macros),(几乎完全)自动地创建一个语法模糊测试器。Autarkie 很大程度上受到了 nautilus 的启发。
特性
- 本质上是 arbitrary 的直接替代品
- 真正的语法模糊测试 - 而不是“结构感知”
- 同时支持 AFL++ (Forkserver) 和 cargo-fuzz (Inprocess)。
- 只要语法是用 Rust 定义的,你也可以模糊测试 C/C++ (使用 AFL++ forkserver)
- 非常容易使用,复杂性被抽象掉了。
- 可以很容易地与其他模糊测试器集成。
小众特性
Autarkie 具有其他语法模糊测试器不具备的几个特性:
- 无需语法维护;因为语法是代码的一部分,如果项目更新,语法也会更新。
- 语法是完全详尽的;编译器将确保包含每个必要的类型。不再需要猜测。
- 语料库是可重用的。如果你停止模糊测试器,你可以重新启动它,它将能够重用语料库!
- 可以从其他模糊测试器学习!(待完成:几乎已实现)
- 具有原生 cmplog 支持(待完成:几乎已实现)
如何使用
这里有两个主要的演练:
-
模糊测试 AFL++ 仪器化的 C/C++ 项目
这个例子通过使用 datafusion-sqlparser-rs 中定义的语法来模糊测试
sqlite3
。我个人最喜欢这个例子,因为它展示了 Autarkie 的魔力:你可以在 5 分钟内构建一个高度复杂的语法模糊测试器,覆盖像 SQL 这样复杂的语言。这个例子还展示了如何将内部结构渲染成 harness 可以使用的不同格式。 -
使用 cargo-fuzz 模糊测试 Rust 项目
这个例子模糊测试了 Solana 的
sbpf
解释器,它是在 Rust 中实现的。Autarkie 具有cargo-fuzz
集成,因此可以很容易地模糊测试原生 Rust 项目。
局限性和注意事项
Beta
Autarkie 处于 Beta 阶段 - 预计会出现问题,请谨慎使用。
静态生命周期
类型必须拥有其所有数据;它不能使用生命周期。这是由于使用了 std::intrinsics::type_id
,它要求类型具有 'static
生命周期。
注意:你可以简单地编写一个包装器类型,它拥有所有数据并将其转换为原生类型。
仅限 Nightly
由于使用了 #![feature(compiler_intrinsics)]
特性,因此仅限于 nightly
版本。
贡献
欢迎贡献、提问和反馈。请积极参与!