Shin GRR:让模糊测试再次提速 - 突破性全系统仿真技术解析

本文详细介绍GRR——一种革命性的高速全系统仿真器,它通过动态二进制翻译、代码块缓存和内存哈希版本控制等创新技术,将模糊测试效率提升至新高度。该系统最初为DARPA网络大挑战赛开发,现已开源。

恐惧GRR

漏洞从不畏惧缓慢的模糊测试工具,这正是GRR被设计成具备独特创新功能的原因——它以惊人的速度运行。

GRR采用动态二进制翻译(DBT)技术在64位地址空间中仿真x86二进制程序。作为64位程序,GRR能比原始程序使用更多硬件寄存器和内存。这使得完美隔离的实现变得简单,无需复杂的寄存器重调度或内存重映射逻辑。被翻译的程序完全察觉不到GRR的存在。

GRR速度极快。现有DBT技术每次执行都会重新翻译相同程序,它们擅长处理长期运行的程序(翻译成本会随时间分摊),并通过重组"热点代码"提升性能。而模糊测试需要反复执行相同程序,导致所有代码都成为热点,重复翻译造成浪费。GRR通过将代码缓存至磁盘避免重复翻译,并在整个模糊测试周期内持续优化缓存代码。

GRR能轻松应对JIT编译器和自修改代码。它逐块翻译基本代码块,并使用"版本号"索引缓存中的翻译块——该版本号是可执行内存内容的Merkle哈希值。当可执行页面内容被修改时,其哈希值失效,从而触发下次执行时的重新翻译。

高效设计

GRR采用程序快照技术跳过读取首个输入字节前的无关初始化代码,这在需要执行数百万甚至数十亿次程序的模糊测试中节省大量周期。同时通过仿真系统调用和在内存中完成所有I/O操作,避免内核往返开销。

可扩展架构

GRR支持可插拔的输入变异器(包括Radamsa)和代码覆盖率度量,允许根据被测程序调整行为。在CGC比赛中,我们无法预知将获得哪些二进制文件,没有通用的代码覆盖率测量方法。GRR的灵活性让我们能动态调整覆盖率测量方式,使模糊测试器能适应不同类型的程序。

实战演示

观看GRR如何摧毁这个包含六个通过IPC通信的二进制文件的CGC挑战赛题目。GRR成功在第三个二进制文件中检测到崩溃。

该演示突出GRR两项精妙功能:

  1. 可打印被翻译二进制程序执行的系统调用轨迹
  2. 可输出每个执行基本块入口的寄存器状态(当最大基本块大小设置为单指令时,还能提供指令级寄存器轨迹)

深入探索

GRR就像漏洞挖掘的挖掘机——这是一台精简高效的漏洞发现机器。它现已开源并采用宽松许可证,欢迎贡献代码。

(原文社交媒体分享提示部分未翻译,因不含技术内容)

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