Nyx: Greybox Hypervisor Fuzzing using Fast Snapshots and Affine Types

管理程序(VMM)在虚拟机和物理机之间提供了一个安全边界。VMM暴露了很多攻击面,一个恶意用户可以通过恶意内核进行攻击,获得权限之后就可以获得同一宿主机上的所有虚拟机,因此有效检测VMM漏洞对于云基础设施来说是至关重要的。由于高吞吐量,最近的研究展示模糊测试是比较有效的方法。

本文提出了NYX,一个优化的、覆盖率导向的fuzzer.一个快速的快照恢复机制是性能的关键,它允许一秒之内重新加载几千次系统。本文还介绍了一种基于自定义字节码的新的变换引擎,编码为有向无环图(DAG)和仿射类型,有表达复杂交互的能力。结果显示,虽然和最先进的VMM fuzzer相比吞吐量更低,但是很有竞争力。简单目标:只需要多一点时间就可以达到相同代码覆盖率;复杂目标:大幅度超越已有方法。找到了44个新bug,其中22个赋予了新CVE.结果显示覆盖率导向是非常有价值的,相比盲fuzzer也可以明显更快。

Motivation

最先进的VMM fuzzer是VDF和Hyber Cube,但是现有的方法没有覆盖率反馈。

已有的方法存在以下缺点

  • 隔离独立的设备模拟器需要很多工作,并且无法扩展到其他种类的VMM.而且还会导致假阳性和假阴性。为了避免这些,在复现原来的环境时必须小心。另外,也无法测试难以解析的部分。
  • 如果给定一个精确的生成器,盲fuzzer是非常高效的,但是难以在复杂程序中找到感兴趣的行为和攻击面。
  • 覆盖率导向能极大地提升找到软件崩溃的能力,现代覆盖率导向fuzzer都可以学习如何生成种子来到达感兴趣的区域。

Methodology

本文提出了NYX,能够使用覆盖率导向fuzz测试VMM的漏洞。覆盖率导向和盲fuzz相比有巨大优势,即使吞吐率稍微降低。

挑战:无法通过自定义编译器编译所有组件获取覆盖率;即使是内存错误时,也需要运行目标程序;需要和很多接口交互

运行目标VMM在自定义的VMM内,具体来说,以下组件同时运行:宿主OS,上面运行宿主VMM,上面运行目标OS,上面运行目标VMM,里面运行agent OS。即启动时包含三个不同的OS和两个不同的VMM。这会导致一些不确定性,例如时间中断。

为了解决以上挑战,本文提出了一种心得设计,和KAFL类似,通过使用Intel-PT获取运行在宿主VM上的代码覆盖率。使用一个改动的Hyber-CUBE用户OS运行在目标VMM内。基于这种设计,设计了NYX,依赖于两种特性。

  1. 为了处理复杂栈的状态问题和不确定性问题,作者开发了快速快照恢复机制,可以在一秒内重置宿主VMM中的VM镜像几千次。
  2. 为了快速生成用于各个接口的输入,设计了一种使用用户提供特征的新的变换引擎,该引擎生成的输入有效表达了多重交互的高度优化的测试脚本。输入是编码成DAG的自定义字节码程序,用户可以提供一种描述字节码语义限制和产生图形状的规格。还使用了仿射类型的概念,可以保证每个值只使用一次。这允许规格处理已经释放和关闭的资源。

依赖这些特性,本文实现了fuzzer,测试了很多目标。而且为更多目标建立了规则,以便展示可扩展性和灵活性。

Result

结果显示超出了已有的代码覆盖率导向测试和盲fuzz,找到了44个新bug,其中22个赋予了CVE

贡献

  • 设计实现了NYX,覆盖率导向的VMM fuzzer
  • 展示了高速快照重置机制对于加速fuzz的作用
  • 介绍了仿射类型的概念,结构化变换引擎和这种变换的好处、灵活性