langston-barrett/tree-crasher
GitHub: langston-barrett/tree-crasher
这是一个无需插桩的基于语法的黑盒模糊测试工具,利用 tree-sitter 解析语料库并通过 AST 拼接生成新样本。
Stars: 82 | Forks: 12
# tree-crasher
tree-crasher 是一个易于使用的基于语法的黑盒模糊测试工具。它使用 [tree-sitter][tree-sitter] 语法解析多个输入文件,并通过拼接它们的 AST 来生成新文件。
tree-crasher 旨在与更高级的基于语法的模糊测试工具(如 Gramatron、Nautilus 和 Grammarinator)占据不同的细分领域。与通过完整的手写语法和基于覆盖率的反馈等复杂技术来实现最大覆盖率和漏洞发现不同,tree-crasher 旨在通过使用现成的 tree-sitter 语法且不需要对目标进行任何插桩(甚至不需要源代码)来实现最大的易用性。简而言之,tree-crasher 想要成为基于语法的模糊测试领域的 [Radamsa][radamsa]。
tree-crasher 使用 [treereduce][treereduce] 自动最小化生成的测试用例。
欲了解更多信息,请参阅[文档][doc]。
## 示例
在阅读这些示例时,请记住模糊测试可能会导致不可预测的行为。请始终在具有内存限制、无网络访问且无重要文件的 VM 或 Docker 容器中进行模糊测试。
### JavaScript 解释器
获取一组 JavaScript 文件并将它们放入 `corpus/` 中(例如,使用[此脚本](./scripts/corpora/js.sh))。然后,以下是如何对 [JerryScript][jerryscript] 和 [Boa][boa] 进行模糊测试的方法:
```
tree-crasher-javascript corpus/ jerry
tree-crasher-javascript corpus/ boa
```
(默认情况下,tree-crasher 通过 stdin 将输入传递给目标。)
### Python 的 regex 引擎
编写 `rx.py` 如下:
```
import re
import sys
try:
s = sys.stdin.read()
r = re.compile(s)
print(r.match(s))
except:
pass
```
将一些示例正则表达式放入 `corpus/` 中。然后运行:
```
tree-crasher-regex corpus/ -- python3 $PWD/rx.py
```
### rustc
tree-crasher 在 rustc 中发现了许多错误。以下是操作方法!命令行中的特殊 `@@` 符号会被 tree-crasher 生成的文件替换。
```
tree-crasher-rust \
--interesting-stderr "(?m)^error: internal compiler error:" \
corpus \
-- \
rustc +nightly --crate-type=lib --emit=mir -Zmir-opt-level=4 @@.rs
```
(正则表达式语法是 [regex crate](https://docs.rs/regex/latest/regex/) 的语法。)
### 更多示例
有关更多示例,请参阅[文档][doc]。
## 发现的错误
tree-crasher 使用 [tree-splicer][tree-splicer] 生成测试用例,请参阅该项目 README 中发现的错误列表。
如果您使用 tree-crasher 发现了错误,请告诉我!一个很好的方法是向 tree-splicer 提交 PR,将其添加到 README 中。
## 支持的语言
tree-crasher 支持 9+ 种语言,详情请参阅[文档][doc]。
## 文档
文档可在[线上][doc]或 `./doc` 中获取。
标签:Boa, Clang, CMS安全, Crash, Deno, JavaScript, JerryScript, odt, pocsuite3, Python, Radamsa, Rust, rustc, Tree-sitter, 二进制发布, 代码覆盖率, 变异测试, 可视化界面, 安全测试, 开源工具, 抽象语法树, 攻击性安全, 无后门, 测试用例生成, 灰盒测试, 白盒测试, 网络流量审计, 自动化payload嵌入, 语法分析, 软件测试, 通知系统, 黑盒测试