Nautilus:一款基于语法的反馈式模糊测试工具
字数 973 2025-08-15 21:31:44
Nautilus模糊测试工具详细教学文档
1. Nautilus概述
Nautilus是一款基于覆盖指引和语法的反馈式模糊测试工具,旨在通过指定半有效的输入语法来提升测试覆盖率,从而发现更多安全漏洞。
主要特点
- 结合覆盖引导和语法引导的模糊测试方法
- 支持构建复杂的树状结构变异操作
- 100%支持AFL++
- 支持Python格式语法定义
- 支持结构化输入生成
- 避免生成相似的短输入
版本演进
- 原型版本:基础功能
- 2.0版本:重大功能升级,完全支持AFL++
2. 核心工作机制
语法规则系统
Nautilus使用类似BNF的语法规则定义输入结构:
EXPR -> EXPR + EXPR
EXPR -> NUM
NUM -> 1
树状结构构建
- 根据语法规则构建抽象语法树
- 执行复杂变异操作
- 将树结构转换为实际测试用例(拼接叶子节点)
Python脚本扩展
允许使用Python脚本解析树状结构,支持更复杂的操作和变异。
3. 安装与配置
基础安装
git clone 'git@github.com:nautilus-fuzz/nautilus.git'
cd nautilus
/path/to/AFLplusplus/afl-clang-fast test.c -o test
配置文件
编辑config.ron设置参数:
cargo run --release -- -g grammars/grammar_py_example.py -o /tmp/workdir -- ./test @@
QEMU模式支持
cargo run /path/to/AFLplusplus/afl-qemu-trace -- ./test_bin @@
4. 语法定义详解
基础语法规则
使用Python脚本定义语法结构:
# 添加规则 NONTERM->RHS,可使用{NONTERM}实现递归
ctx.rule("START","<document>{XML_CONTENT}</document>")
ctx.rule("XML_CONTENT","{XML}{XML_CONTENT}")
ctx.rule("XML_CONTENT","") # 空规则
脚本规则
ctx.script("XML",["TAG","ATTR","XML_CONTENT"],
lambda tag,attr,body: b"<%s %s>%s</%s>"%(tag,attr,body,tag))
属性与标签定义
ctx.rule("ATTR","foo=bar")
ctx.rule("TAG","some_tag")
ctx.rule("TAG","other_tag")
正则表达式终端
ctx.regex("TAG","[a-z]+") # 用于不需要增量探索的场景
5. 使用示例
生成测试用例
cargo run --bin generator -- -g grammars/grammar_py_exmaple.py -t 100
示例输出:
<document>
<some_tag foo=bar>
<other_tag foo=bar>
<other_tag foo=bar>
<some_tag foo=bar></some_tag>
</other_tag>
<some_tag foo=bar>
<other_tag foo=bar></other_tag>
</some_tag>
<other_tag foo=bar></other_tag>
<some_tag foo=bar></some_tag>
</other_tag>
<other_tag foo=bar></other_tag>
<some_tag foo=bar></some_tag>
</some_tag>
</document>
与AFL集成
终端1(AFL):
./afl-fuzz -Safl -i /tmp/seeds -o /tmp/workdir/ ./test @@
终端2(Nautilus):
cargo run --release -- -o /tmp/workdir -- ./test @@
6. 实际应用案例
Nautilus已发现多个重要漏洞:
- ChakraCore问题 #5503
- mruby多个CVE:
- CVE-2018-10191
- CVE-2018-10199
- CVE-2018-12248
- CVE-2018-11743
- CVE-2018-12247
- CVE-2018-12249
7. 项目资源
GitHub仓库: Nautilus
8. 高级技巧
性能优化
- 对不需要深入探索的部分使用正则表达式终端
- 合理设计语法规则避免过度递归
- 结合AFL的覆盖引导提高效率
复杂结构处理
- 使用脚本规则处理嵌套结构
- 为不同协议/格式设计专用语法
- 利用Python的灵活性处理边界情况
9. 故障排除
常见问题
- 构建失败:确保AFL++路径正确
- QEMU模式问题:检查目标二进制兼容性
- 语法无效:验证Python脚本语法规则
- 变异效率低:优化语法规则设计
调试建议
- 使用
--release标志提高性能 - 检查
/tmp/workdir中的日志文件 - 从简单语法开始逐步增加复杂度