让模糊测试再次提速:Shin GRR 的技术革新

本文介绍了GRR高速全系统仿真器,通过动态二进制翻译、代码缓存和版本控制等创新技术,显著提升模糊测试效率,支持可插拔输入变异器和代码覆盖率度量,现已开源。

Shin 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

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计