Shin GRR:让模糊测试再次提速
我们之前提到过GRR——这是我们用于模糊测试程序二进制文件的高速全系统仿真器。我们为DARPA的网络大挑战(CGC)开发了GRR,现在将其作为开源项目发布!快去看看吧。
恐惧GRR
漏洞不惧怕缓慢的模糊测试器,这就是为什么GRR设计了独特而创新的功能,使其运行速度快得惊人。
GRR使用动态二进制翻译(DBT)在64位地址空间内仿真x86二进制文件。作为一个64位程序,GRR可以使用比原始程序更多的硬件寄存器和内存。这使得无需复杂的寄存器重调度或内存重映射逻辑即可轻松实现完美隔离。被翻译的程序永远察觉不到GRR的存在。
GRR速度极快。现有的DBT在每次执行时都会重新翻译相同的程序。它们擅长翻译长时间运行的程序,其中翻译成本随时间摊销,并且“热”代码被重新组织以提高性能。模糊测试活动反复执行相同的程序,因此所有代码都是热代码,重新翻译相同代码是浪费的。GRR通过将代码缓存到磁盘来避免重新翻译,并在模糊测试活动的生命周期内优化其缓存代码。
GRR轻松处理JIT编译器和自修改代码。GRR一次翻译一个基本块,并使用“版本号”在其缓存中索引翻译后的块。块的版本号是可执行内存内容的Merkle哈希。修改内存中可执行页面的内容会使其哈希失效,从而在下次执行时触发其代码的重新翻译。
GRR高效。GRR使用程序快照技术跳过在读取第一个输入字节之前执行的不相关设置代码。这在具有数百万或数十亿程序执行的模糊测试活动中节省了大量周期。GRR还通过仿真系统调用并在内存中执行所有I/O来避免内核往返。
GRR可扩展。GRR支持可插拔的输入变异器(包括Radamsa)和代码覆盖率度量,使您能够根据被模糊测试的程序调整GRR的行为。在CGC中,我们事先不知道会得到哪些二进制文件。没有一种适用于所有情况的代码覆盖率测量方法。GRR的灵活性使我们能够随时间改变代码覆盖率的测量方式。这使得我们的模糊测试器对不同类型的程序更具弹性。
双拳出击
看看GRR如何摧毁这个CGC挑战,其中有六个通过IPC通信的二进制文件。GRR在第三个二进制文件中检测到崩溃。
这个演示展示了GRR的两个巧妙功能:
- GRR可以打印出被翻译二进制文件执行的系统调用跟踪。
- GRR可以打印出每个执行的基本块入口处的寄存器状态。当最大基本块大小设置为一条指令时,可以提供指令粒度的寄存器跟踪。
深入探索
我喜欢将GRR视为漏洞的挖掘机。它是一个精简、高效的漏洞发现机器。它现在也是开源的,并采用宽松许可证。您应该去看看,我们欢迎贡献。
如果您喜欢这篇文章,请分享: Twitter LinkedIn GitHub Mastodon Hacker News