nautilus-fuzz/nautilus

GitHub: nautilus-fuzz/nautilus

基于文法规则和覆盖率引导的智能模糊测试工具,通过语法树变异高效生成结构化输入以发现深层漏洞。

Stars: 473 | Forks: 67

# Nautilus 2.0 Nautilus 是一个基于覆盖率引导和基于文法的 fuzzer。你可以使用它来提高测试覆盖率并发现更多 bug。通过指定半有效输入的文法,Nautilus 能够执行复杂的变异并 uncover 更多有趣的测试用例。这个 fuzzer 背后的许多思想都记录在 2019 年 NDSS 发表的一篇论文中。

版本 2.0 在这个早期原型的基础上进行了许多改进,现在已 100% 兼容 AFL++。除了常规的可用性改进外,版本 2.0 还包含了许多亮眼的新功能: * 支持 AFL-Qemu 模式 * 支持使用 python 指定文法 * 支持使用 python 脚本从结构生成输入的非上下文无关文法 * 支持指定二进制协议/格式 * 支持指定不参与定向变异的基于正则表达式的终结符 * 更好地避免重复生成相同的极短输入 * 大量清理代码库 * 针对无效文法提供有用的错误输出 * 修复了超时代码中偶尔会导致 fuzzer 死锁的 bug ## Nautilus 是如何工作的? 你可以使用诸如 `EXPR -> EXPR + EXPR` 或 `EXPR -> NUM` 和 `NUM -> 1` 这样的规则来指定文法。根据这些规则,fuzzer 会构建一棵树。这种内部表示形式允许应用比原始字节复杂得多的变异。然后将这棵树转换为目标应用程序的真实输入。在常规的上下文无关文法中,这个过程非常直接:所有叶子节点被拼接在一起。下例中左侧的树将解解析为输入 `a=1+2`,右侧的树将解解析为 `a=1+1+1+2`。为了提高文法的表达能力,使用 Nautilus 时你可以为解解析过程提供 python 函数,以允许更复杂的规范。

## 设置 ``` # checkout the git git clone 'git@github.com:nautilus-fuzz/nautilus.git' cd nautilus /path/to/AFLplusplus/afl-clang-fast test.c -o test #afl-clang-fast as provided by AFL # 所有参数也可以使用 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 @@ ``` ## 示例 在这里,我们使用 python 来生成用于有效类 xml 输入的文法。请注意使用了脚本规则来确保开始 和结束标签匹配。 ``` #ctx.rule(NONTERM: string, RHS: string|bytes) adds a rule NONTERM->RHS. We can use {NONTERM} in the RHS to request a recursion. ctx.rule("START","{XML_CONTENT}") ctx.rule("XML_CONTENT","{XML}{XML_CONTENT}") ctx.rule("XML_CONTENT","") #ctx.script(NONTERM:string, RHS: [string]], func) adds a rule NONTERM->func(*RHS). # 与普通的 `rule` 不同,RHS 是一个 nonterminals 数组。 # 由函数负责将 NONTERMINALS 返回的值与所使用的任何固定内容组合起来。 ctx.script("XML",["TAG","ATTR","XML_CONTENT"], lambda tag,attr,body: b"<%s %s>%s"%(tag,attr,body,tag) ) ctx.rule("ATTR","foo=bar") ctx.rule("TAG","some_tag") ctx.rule("TAG","other_tag") #sometimes we don't want to explore the set of possible inputs in more detail. For example, if we fuzz a script #interpreter, we don't want to spend time on fuzzing all different variable names. In such cases we can use Regex #terminals. Regex terminals are only mutated during generation, but not during normal mutation stages, saving a lot of time. #The fuzzer still explores different values for the regex, but it won't be able to learn interesting values incrementally. #Use this when incremantal exploration would most likely waste time. ctx.regex("TAG","[a-z]+") ``` 你可以使用生成器来测试你的文法: ``` $ cargo run --bin generator -- -g grammars/grammar_py_exmaple.py -t 100 ``` 你也可以将 Nautilus 与 AFL 结合使用。只需将 AFL 的 `-o` 参数指向同一个工作目录,AFL 就会与 Nautilus 同步。请注意,这是单向的。AFL 导入 Nautilus 的输入,但反之则不行。 ``` #Terminal/Screen 1 ./afl-fuzz -Safl -i /tmp/seeds -o /tmp/workdir/ ./test @@ #Terminal/Screen 2 cargo run --release -- -o /tmp/workdir -- ./test @@ ``` ## 战利品 * https://github.com/Microsoft/ChakraCore/issues/5503 * https://github.com/mruby/mruby/issues/3995 (**CVE-2018-10191**) * https://github.com/mruby/mruby/issues/4001 (**CVE-2018-10199**) * https://github.com/mruby/mruby/issues/4038 (**CVE-2018-12248**) * https://github.com/mruby/mruby/issues/4027 (**CVE-2018-11743**) * https://github.com/mruby/mruby/issues/4036 (**CVE-2018-12247**) * https://github.com/mruby/mruby/issues/4037 (**CVE-2018-12249**) * https://bugs.php.net/bug.php?id=76410 * https://bugs.php.net/bug.php?id=76244
标签:AFL++, Fuzzing, Nautilus, Python, TLS抓取, 上下文无关文法, 二进制协议, 变异测试, 可视化界面, 基于语法, 安全测试, 攻击性安全, 无后门, 模糊测试工具, 测试用例生成, 网络安全, 覆盖率引导, 身份验证强制, 软件安全, 逆向工具, 隐私保护