基于DoS对云虚拟机内存的攻击方法

今天分析的这篇论文在2017年于CCS会议发表,题目是《DoS Attacks on Your Memory in Cloud》,其DOI信息在这里

这篇文章涉及了很多计算机组成原理的知识,尤其是CPU与内存的知识。我在阅读这篇文章时感到十分吃力,补上了本科计组知识后才好一些。若读者对下面某些内容感到不知所云,不妨一补。

内容简介

在云计算中,基于网络的DoS攻击已经进行了广泛地分析,并提出了许多防御措施。但是,攻击者使用虚拟机(Virtual Machine,下文简称VM)进行对受害者的严重内存攻击则没有完全理解。虽然在云服务器中,内存被软件虚拟层严格地隔离开,但底层硬件的内存仍然被所有VM共享。这个性质可以被聪明的攻击者利用(只要他也在服务器上拥有一台VM),使服务器拒绝为受害者分配内存。

论文首先介绍了这一问题的严重性(最严重情况下,在亚马逊EC2上可以对电子商务网站造成38倍的延时),之后提出了一种创新的防御手段,通过数据分析建立标准模型,并将VM运行情况与该模型比对,从而发现攻击行为并确定攻击来自于哪一台VM。

背景

攻击模型与假设

文中提出如下几条假设。

  • 攻击目标VM位于公共的IaaS(Infrastructure as a Service,基础设施即服务)云上,如亚马逊EC2。
  • 攻击者可以在目标VM的宿主服务器上,运行至少一台VM(相关技术细节已经研究过),且攻击者可以在这台他自己的VM上运行任意程序。
  • 攻击者不需具备向目标VM发送网络数据包的能力,即基于网络的DoS攻击的不可用的。
  • 云服务提供商不会进行攻击,且云服务器特权程序不可被控制用来攻击。
  • 软件和硬件隔离机制的功能是正确运行的。
  • 云服务器运营商可以把不同VM分配在同一台云服务器上,但很可能不在同一个物理处理器核上。

这种情况下,云服务器上运行有一个管理程序,负责对硬件资源进行虚拟化和分配管理,因此VM可以认为它控制一台电脑的全部硬件资源。一台云服务器可以有多个处理器,同一个处理器的不同核之间有各自的L1与L2缓存,但它们共享一块终极缓存(Last Level Cache,下文简称LLC,也被称为L3缓存)。

此外,各个处理器共享一个内存控制器(Integrated Memory Controller,下文简称IMC)、一个内部数据总线(inter-package bus)与一块主存(DRAM芯片)。云服务器分配给每个VM一些虚拟CPU,且一个虚拟CPU仅分配给一台VM。运行在虚拟CPU上的程序可以使用任意与这个虚拟CPU关联的资源。因此,不同VM之间共享硬件缓存、总线、内存通道和DRAM缓冲区。
以上就是目前的通常情况,软件实现的VM隔离,仅对虚拟和物理的内存页表做了处理,但没有涉及底层各个处理器核共享的内存。

物理内存资源

LLC

如上所述,LLC被同一个处理器的不同核共享。Intel通常将L1与L2中的cache line也在LLC中复制一份(关于CPU cache,推荐阅读这篇文章学习)。当LLC中的cache line被清除时,L1与L2缓存中对应的副本也被清除。但是,Intel没有公布具体的对应规则,我们不知道L1中的cache line对应LLC的哪一个地址。这也为攻击者增加了难度。

内存总线

Intel使用环形总线拓扑结构连接同一处理器的各个部分,如核、内存控制器与快速通道互联接口(Quick Path Interconnect,QPI)。快速通道互联接口提供了处理器各部分之间、处理器与I/O接口之间点对点的连接。内存控制总线连接LLC与IMC的存储体(bank)调度器。DRAM总线连接IMC调度器与DRAM存储体。这些高速的设计使攻击者很难渗透。同时,对于普通原子操作的总线锁清除也使得对其的攻击不太有效。但是,一些外部原子的总线锁操作仍然存在。

DRAM与IMC

每个DRAM芯片由多个存储体组成。每个存储体有许多行和列,还有存储最近使用行列的存储体缓存以加快速度。每个处理器有多个IMC,使用规划算法(如First-Ready-First-Come-First-Serve)控制DRAM的访问。现代DRAM与IMC可以同时处理大量请求,所以针对其的攻击效果一般。

内存DoS攻击

硬件存储是分层结构(如L1、L2、LLC到DRAM,速度由快到慢)。这些被许多使用规划算法的资源连接。针对内存的DoS攻击基于存储资源的抢占或规划算法调度的抢占,或者两者兼有。对于抢占存储资源,攻击者可以将受害者的数据由快速存储器向低速存储器驱逐。对于抢占算法调度,攻击者可以降低受害者内存请求的优先级,例如欺骗算法提高攻击者的优先级,或者同时提交大量请求使调度器崩溃。

LLC清洗攻击

在基于抢占存储资源的攻击中,论文发现LLC清洗攻击可以导致最为严重的性能下降,主要原因是LLC没有访问控制或配额限制。因此一台VM的程序可以将另一台VM的LLC cache line驱逐出去。同时,被L1、L2包含的LLC(大多数现代Intel的LLC)会将这个驱逐行为传递到L1、L2中,从而使状况恶化。不存在包含关系的LLC(大多数AMD的LLC)略有缓解。但是,如果受害者占用的内存多于私有缓存,那么会频繁访问LLC,承受LLC清洗攻击。

缓存清洗攻击

为进行LLC清洗攻击,攻击者可申请一块覆盖整个LLC的内存缓冲区。每个内存块访问一个内存地址,通过这种方式可以清洗整个缓存并把受害者的所有数据由LLC驱逐到DRAM。持续重复该操作即导致缓存清洗攻击。
理想情况下,攻击者使用的缓冲区应该恰好与LLC对应,也就是说这块缓冲区可以填满每个LLC slice而没有自冲突(self-conflicts,将之前的line从这块缓冲区中驱逐)。达成这个目标有两个难点:第一,宿主机缓存目录的内存缓冲区地址对攻击者不可见;第二,LLC slice到物理内存地址的映射未公开。
为克服以上困难,攻击者可以首先分配1GB的大页内存(HugePage),以确保对应的宿主机内存地址是连续的,无需担心有未知的虚拟内存转换。之后对于每一个LLC slice的组(set,与组相联中的“组”同义),攻击者选择一组与cache line一样大小、与该组索引的对应关系相同、但slice不一定相同的内存块。之后攻击者访问这些块并计算访问耗时。如果耗时较长,说明在slice内有自冲突。攻击者可以递归地从组中清除一些内存块,直到观察不到自冲突。在对每一个缓存组进行相同操作后,攻击者就拥有了一块理想的缓冲区。
攻击者还可以使用多线程技术,加速这一操作过程。

自适应LLC清洗

基本的LLC清洗技术在受害程序的内存占用远远小于LLC的时候无效,因为进行一次清洗需要大量时间,期间大数内存访问不影响受害程序内存。为实现更加细粒度的攻击,论文开发了一种缓存探针技术,用来精确查找LLC中与受害程序对应的组,并仅对这个组进行清洗。
攻击者首先在自己的VM上分配一个覆盖LLC的内存缓冲区。然后使用下面两个步骤实现缓存探针:发现阶段,在受害程序运行过程中,对每个组的缓存,攻击者访问该组的若干cache line并计算不导致自冲突的最大cache line数量。如果这个数量比组相连的组数小,则说明受害程序频繁使用该组的cache line,这个组可以用来实现清洗攻击。攻击阶段,攻击者持续访问上述组中的缓存,以清洗受害程序数据。

外部原子锁攻击

这种攻击是基于调度的最有效方式。Intel与AMD的处理器共同适用这种攻击方式。

原子锁攻击

在管理多处理器共享数据时,Intel为提供了一种原子锁操作。在Intel Pentium(P5)处理器之前,这种原子锁操作总是在内部总线上生成锁信号,以保证操作的原子性。所以直到原子锁操作结束,其它处理器均被阻塞。在P6处理器之后,总线锁换成了缓存锁,锁住的是缓存,缓存连接机制保证操作的原子性,这样就减少了调度阻塞的次数。

但是,论文仍发现了两种攻击者能够使用的锁住总线的操作。其一是针对未对齐内存块访问引起的原子锁。这种情况下,处理器必须访问两个cache line,为保证操作的原子性,处理器要对总线加锁。其二是针对未被缓存内存块的访问引起的原子锁。这时缓存不工作,因此为保证操作的原子性,内存总线要被加锁。

较低严重性的内存争夺

对DRAM控制器或者DRAM存储体(bank)的争夺也是可行的。但造成的影响会显著降低。

建议的防御措施

文中提出了一种创新性的、多用途的措施,可以检测与缓解云中针对内存的DoS攻击。这种措施不需要提前了解应用使用的内存资源。一种叫做“执行节流”(execution throttling)的操作用于减轻攻击造成的影响。这种措施的创新性在于结合了两种方法:基于性能监测单元(Performance
Monitoring Unit,PMU)的事件统计(event counting),与通过调整IA32_CLOCK_MODULATION模型特定寄存器(Model Specific Register,MSR)进行的占空比调整(duty cycle modulation)。关于MSR,请参考维基百科的相关内容。

检测阶段

检测内存DoS攻击的关键在于,这种攻击是由攻击者VM与被保护VM之间的异常资源抢占引起的。这种资源抢占可以明显地改变被保护VM的内存使用状态,而这个状态又可以被云服务提供商监测到。假设访问内存资源的统计数据符合特定的概率分布,则受攻击时,统计数据会发送变化。

伪孤立参考抽样

使用“执行节流”的方法获得样本。其基本思想是降低其它VM的执行速度,但在参考采样阶段保持受保护的VM的速度。这可以减少共存VM的干扰,而无需暂停它们。

“执行节流”基于Intel处理器中提供的一种称为“占空比调整”的特性。这一设计旨在规范每个核心的执行速度和功耗。处理器允许软件为每个核分配“占空比”(duty
cycles),这个核在占空时工作,否则不工作。在执行节流中,其他VM的执行速度将会降低,并且受保护的VM很少受到资源的抢占。因此,在执行节流阶段收集的参考样本是由基本不受抢占状态得出的。

缓解阶段

云服务提供商有多种方法缓解攻击。一种是,受到LLC攻击时,可以将受影响的VM迁移到其它CPU上;另一种是,受到内存攻击时,可以将受影响的VM迁移到其它宿主服务器上。但是,VM迁移不能解决攻击者对其它VM的影响。
另一种方法是识别攻击者的VM,然后进行强制执行节流以降低恶意VM的执行速度,同时云服务提供商进行进一步的调查或/并通知客户,怀疑其VM有资源滥用操作。

识别攻击者VM

一旦检测到内存DoS攻击,为了减轻威胁,云服务提供商就需要识别出哪个VM正在进行攻击。在这里,文章提出了一种新的方法,基于选择性执行节流,以一种二分法搜索的方式识别恶意VM。首先,一半VM保持正常的执行速度,而其余VM在参考采样周期内被抑制。如果在这种情况下,参考样本与原有样本变化不大,则说明恶意VM不在这些VM中。然后选择其余一半的VM以正常速度运行,而其他VM都被限制,以收集下一个参考样本并进行分析,直到找出恶意VM。

结语

本篇论文的技术细节大致如上所述。通过本次学习,可以看出底层知识的重要性。对底层的涉及,有时候可以影响成果的深度。所以在今后的学习中,要适当回顾本科知识,扎得更深,才能站得更稳。