软件系统的安全是建立在正确执行的硬件/软件协议的基础上的。违反这些协议会带来严重的安全漏洞。例如操作系统的安全建立在内存中的数据和代码无法在缺乏操作系统授权的情况下被修改的假设上。然而,近来出现的Row Hammer攻击却能破坏这种假设,并带来一系列安全问题。这种攻击可以在不访问目标内存区域的前提下使其产生数据错误。
Row Hammer攻击利用了内存设计中的缺陷。现代大容量内存有着很高的内存单元密度。这使得单元间的相互电磁作用变得更为显著。电磁影响会加速电容电压的变化,带来潜在的数据丢失威胁。这种被称作“Disturbance Error”的漏洞多年前就已被发现,但是它直到最近才被发现能够被软件人为触发。尤其值得注意的是,快速并且重复地激活同一个内存行(DRAM Row)的访问模式能大大提高相邻行出现干扰错误的可能性。
Row Hammer漏洞被发现后的短时间内,利用它进行的安全攻击就陆续出现,例如,Google的软件工程师Seaborn展示的两种权限提升攻击(Google的NaCl沙盒逃脱以及在Linux中的用户态程序获取内核态内存访问权限)。其他的研究以用高级程序设计语言(如JavaScript)触发Row Hammer为目标。这样一个攻击者就可以通过网络中注入的恶意代码,远程地引发内存错误并实现权限提升。
对于服务器端的攻击研究要远少于对客户端攻击的研究,而Row Hammer的服务器端攻击在多用户的云环境中尤其值得注意。互不信任的用户在云中可能共享一台物理机器,分享一些硬件资源,这就包括内存。尽管服务器级的处理器和更昂贵的内存对于Row Hammer的防御更好,研究表明即使配备了带有自动纠错(ECC)功能的内存,服务器仍然可能受到Row Hammer攻击的影响。
在研究中,我们着重探索了Row Hammer攻击在跨虚拟机环境中的应用,并提出了在云环境中的威胁。我们的目标并不是攻击云服务器,进而探究其在这种攻击面前有多脆弱,而是探索在硬件存在这种错误的情况下,云系统中基于虚拟化的隔离是否可以被破坏。
图1 基于图模型的XOR scheme分析算法强化的Row Hammer攻击
在本文中提出了一种高可靠度且高确定性的double-sided Row Hammer攻击。 这种攻击通过攻击目标内存行的两个相邻行来提高攻击效果。但是这就需要我们了解物理地址是如何被分配到内存中的,比如物理地址中的哪些位决定了内存的channel、bank、row等。这使得我们可以找到同一个bank中的相邻行(row)。然而,Intel拒绝公布这些相关信息。另外,即使使用同样的处理器和同样的内存控制器,这种分配方法还会因为内存(DRAM module)的区别而不同。
为了解决这个问题,我们提出了一种算法来破解物理地址的动态分配机制。内存芯片(chip)中的每个bank都有一个行缓冲器(row buffer)来缓存最近使用的行。因此,如果交替访问同一个bank中两个不同的行,由于行缓冲器的冲突,会观察到一个高延迟。这种访问延迟的增加形成了一个时延通道(timing channel)。可以通过这个通道来确定两个物理地址是否被分配到了同一个bank的不同行。通过交替访问两个只有特定bit不同的物理地址,可以利用它们是否在同一个bank的不同行中。基于这个事实,能够推断出物理地址中这些特定bit的功能, 例如是否决定了bank,row, column等等。
在这个时延通道的基础上,我们提出了一种新的基于图模型的算法来破解物理地址中存在的XOR scheme。为了提高内存性能,物理地址分配时会将某些决定行的bit和一些其他bit进行XOR操作,并用这个XOR的结果决定bank或channel等。在图模型算法中,每个物理地址的bit是一个节点,通过内存访问延迟我们可以得到节点间是否存在XOR关系。如图1所示就是一个我们的图模型算法的例子,图中上半部分是通过测试四个bit(15,16,18和20)所建立的图模型,而下半部分是则是它对应的XOR scheme 。这种算法能在一到两分钟内分析出我们的各个测试机器的内存分配机制。
在了解物理地址的分配机制后,就可以从Xen虚拟机中进行double-sided Row Hammer攻击。首先通过实验分析了哪种Row Hammer攻击的方法最为有效(例如是否引入mfence指令)。接着,我们通过从虚拟机中攻击所有可访问内存行的方法找到足够多的可攻击bit。它们需要在特定的位置,并且可以被重复触发错误。由于每个虚拟机仅仅被分配到一小部分物理内存,我们也设计了能够测试多于初始分配内存的方法。另外,还设计了一个安全模式来减少可能使得系统崩溃的内存错误。
图2 页面表替换攻击(Page Table Replacement Attack)跨虚拟机环境下的Row Hammer权限提升
以往的研究都寄希望于随机的Row Hammer攻击能恰好在page table中产生内存错误。不同于这些方法,我们设计了一种确定性的攻击来获得跨虚拟机环境下的任意内存位置读写权限。图2展示了整个权限提升攻击的过程。攻击者是一个没有特殊权限的普通虚拟机,在发起攻击前能对自己的内存空间进行读写操作。虽然攻击者所拥有的page table 都被维护在攻击者自己的内存空间中,攻击者并不能直接修改page table。所有的修改必须通过hypercall被hypervisor审核 。在攻击前,通过Row Hammer攻击在攻击者的内存空间里找到一个可用的flippable bit,并且它在page中的相对位置需要满足一定条件。我们要求在将一个page(4K字节)均分成64个64 bit长的段后,flippable bit在这个64 bit段中的位置对应一个page table entry中的page frame number部分。
首先,找到一个last-level page table(即PT)和一个攻击者控制的普通page。这两个page的物理地址只有一个bit不同,并且这个不同bit的位置就是flippable bit所对应的位置。在这个普通page中伪造一个page table。这个伪造的page table中的entry指向任意的攻击者想要访问的内存物理地址,不论是否受攻击者的控制。
第二步是将选定的PT所属的secondlevel page table( 即 PMD) 复 制 到 包含flippable bit的page中。由于没有修改PMD和PT的内容,我们可以直接通过hypercall来把原来的PMD替换成含有flippable bit的page。我们称这个新的PMD为shadow PMD。需要注意的是,之前所选定的PT在PMD中对应的entry应该包含这个flippable bit。
接下来,通过Row Hammer来在shadow PMD的这个entry中产生bit flip,使得原本指向PT的条目转而指向伪造的PT,证明了这个攻击方法可以使得一个Xen PV虚拟机对于机器上的任意page拥有读写权限。并且此时hypervisor和攻击者的kernel仍然认为这个伪造的PT是一个普通page,因此攻击者仍然可以通过直接写入的方式来修改伪造的PT中的entry。
另外,我们还展示了两个基于这种攻击的实例。 一个例子是HTTPS网络服务器中的私钥窃取。我们利用对任意物理内存的读权限判断某一内存地址是否储存的数据结构是否符合一个有效密钥的结构。
第二个例子展示了如何利用Row Hammer攻击,在不知道目标密码的情况下登录一个OpenSSH服务器。被攻击服务器和攻击者各是一个虚拟机。它们共享同一台物理机器。我们的主要目标是通过修改内存中SSH服务器进程的代码来绕过密码验证。在进行攻击前,通过对OpenSSH的汇编和机器代码的分析,找到跳转到密码验证函数的代码。首先,利用前面描述的Row Hammer攻击获得物理机上的任意读写权限。然后在内存中搜索这句跳转到密码验证函数的机器代码。一旦找到了对应代码,将其改为把验证通过的返回值直接写入对应寄存器(如图3所示)。这样,一旦有接入请求发送到服务器,验证函数将不会被调用,而直接通过了验证。
图3 通过内存修改绕过密码验证攻击主要以Xen PV虚拟机位目标。需要注意的是,尽管它正逐渐被HVM所取代,目前它仍然被公共云服务提供商广泛使用。这其中就包括Amazon EC2。这给攻击者提供了攻击机会。由于目前已经有了很多成功的攻击能够在公共云中实现与目标共用物理机器,建议所有云供应商停止对PV的使用。