Leaky cauldron on the dark land: Understanding memory side-channel hazards in SGX【CCS‘17】

摘要

英特尔SGX的侧通道风险最近引起了人们的高度关注。备受关注的是新发现的页面故障攻击,在该攻击中,操作系统级别的对手引发页面故障,以观察SGX飞地中运行的受保护进程的页面级访问模式。由于几乎所有提议的防御都集中在这种攻击上,人们对这种努力是否真的提高了对手的门槛,攻击的简单变体是否会使所有保护失效知之甚少,更不用说对SGX系统中其他攻击面的深入了解了。

在本文中,我们报告了系统分析SGX面临的侧通道威胁的第一步,重点是与内存管理相关的风险。我们的研究确定了8种潜在的攻击载体,从TLB到DRAM模块。更重要的是,我们强调了对SGX内存侧通道的常见误解,证明通过新的页面通道恢复EdDSA密钥时可以避免高频率的AEX,并且可以通过结合缓存和跨包区DRAM通道来实现对包区程序(64B级别)的细粒度监控。我们的发现揭示了SGX正在进行的安全研究与其侧通道弱点之间的差距,重新定义了安全飞地的侧通道威胁模型,并可能引发关于何时使用此类系统以及如何安全使用该系统的讨论。

引言

当今的一个重大安全挑战是如何建立一个能够保护大规模数据密集型计算的可信执行环境(TEE)。这对于将敏感数据(如电子健康记录)的分析外包给不受信任的云等目的至关重要。服务于这样的目的不能仅仅依赖于加密手段,例如,全同态加密,它仍然太慢,无法处理计算任务实际规模。

最近的硬件进步使一种有前景的替代方案成为可能,如英特尔软件保护扩展(SGX)[10]。SGX为数据和代码提供安全保护,旨在抵御来自其主机操作系统甚至系统管理员的攻击。这种保护是英特尔主流CPU(即Skylake和Kaby Lake)的一项功能,其特点是其小型可信计算基础(TCB),仅包括CPU包,并有可能根据处理器的能力扩展其性能。

然而,设计的简单性迫使飞地程序利用部分或完全由不可信操作系统控制的资源(内存、I/O等),因此可能使其受到侧信道攻击,在侧信道攻击中,飞地之外的对手可以从对共享资源的观察操作推断出内部的敏感信息

SGX侧通道危险

不幸的是,这种威胁比想象的更现实、更严重:先前的研究表明,完全控制操作系统的对手可以操纵在飞地模式(SGX保护的CPU模式)下运行的代码的页表,在执行过程中引发页错误;通过监控对手在相对无噪声的环境中发生的故障,他可以在页面级别识别程序的执行轨迹,这足以从流行的应用程序库中提取文本文档、图像轮廓[43]和破坏密码操作[39]。在我们的论文中,我们将这些攻击称为页面故障侧通道攻击。

英特尔对这些侧信道的立场值得思考。他们承认,SGX不能抵御四个侧信道攻击向量:功率统计、缓存未命中统计、分支定时和通过页表的页访问[2]。面对这些侧通道带来的安全威胁,英特尔建议“由独立软件供应商设计飞地,防止侧通道信息泄露。[7]”,尽管他们实际上与学术界和开源合作伙伴积极合作,以帮助减轻威胁[6]。

从英特尔的声明中可以清楚地看出,解决这些侧通道问题的根本硬件更改(例如,通过将整个页面表保留在包围区内来击败页面故障侧通道[16])不太可能发生。因此,软件供应商面临着艰巨的任务,即了解SGX侧通道的安全影响,并开发实用技术来减轻构建其SGX应用程序时的威胁。

鉴于该问题的重要性,近年来已经见证了解决SGX所侧通道威胁的尝试如雨后春笋般出现[15,38,39],例如,通过将敏感代码和数据放置在同一页面[39],或者通过硬件支持[38]或定时执行[15]检测页面故障

然而,这些研究主要针对页面错误攻击。尽管对这种已证明的攻击向量的关注是有道理的,但对页面故障攻击的唯一关注可能是不够的。毕竟,在复杂的计算任务(例如,数据密集型计算)中,当需要外部帮助来完成任务时,在最低限度的软件支持的基础上为一个安全的haven分配任务,可能会为内部信息在与外部的互动中渗透开许多途径。仅关注内存,我们不仅可以看到程序的虚拟内存管理,还可以看到其物理内存控制部分或完全暴露于不受信任的操作系统,更不用说飞地程序可能需要的其他系统服务(进程管理、I/O等)

即使只看页面表,我们也不确定已知的页面攻击是从飞地进程中提取敏感信息的唯一方法还是最有效的方法。在对可能的攻击面缺乏全面了解的情况下,尚不清楚所有提出的保护措施(往往是重量级和侵入性的)是否都能提高侧通道攻击的门槛,也不清楚对手是否可以切换到更轻量级和同等有效的不同技术或通道,为了提取这些方法旨在保护的信息

了解记忆侧通道

作为全面了解软件供应商面临的侧通道威胁的第一步,在本文中,我们将重点关注与内存相关的侧通道,这是一个重要的,可以说是有史以来研究过的最有效的侧通道类别。当然,页面故障侧通道也在我们讨论的范围内。为了加深社区对内存侧通道攻击面的理解,并指导防御机制的设计,我们认为重要的是要做到以下三点:

首先,页面错误并不是泄露飞地程序内存访问模式的唯一矢量。任何缓解内存侧通道泄漏的后续尝试都应考虑整个攻击表面

其次,并不是每一次对飞地的侧信道攻击都会引发大量的异步飞地eXits(AEX),正如页面故障攻击所证明的那样。这一点很重要,因为异常高的AEX中断率被认为是SGX侧信道攻击的一个关键特征,设计用于捕获该信号的保护可以击败该攻击[15,38]。然而,我们的发现表明,这种基于中断的保护是脆弱的,因为更复杂的攻击可以避免产生过多的中断

第三,可以在高速缓存行级别获取到包围区内存中的细粒度侧通道观测。因此,将敏感代码和数据放在同一页面上的防御[39]对新的攻击无效

在本文中,我们希望通过以下研究工作来了解这些信息:

探索记忆侧通道攻击面

在我们的研究中,我们调查了涉及内存管理的SGX侧通道攻击面,确定了与CPU硬件中的地址转换缓存(例如,TLB、分页结构缓存)、位于主内存中的页表以及整个缓存和DRAM层次结构相关的8种类型的侧通道攻击向量。该研究考虑了地址转换和存储器操作中的每个步骤。因此,据我们所知,对针对SGX飞地的存储器侧信道攻击面进行了最全面的分析。

减少内存侧通道攻击的副作用

为了证明大量的AEX不是内存侧通道攻击的必要条件,我们开发了一种新的基于内存的攻击,称为sneaky page monitoring(SPM)。SPM攻击通过在页面表条目(PTE)中设置和重置页面的已访问标志来监控页面何时被访问。【这和Telling Your Secrets without Page Faults不是一样吗?但是都是17年的】与页面故障攻击[43]不同,在页面故障攻击中,每次访问页面时都会生成页面故障,对访问标志的操作不会直接触发任何中断。然而,攻击仍然需要通过触发中断来不时刷新转换后备缓冲区(TLB),以迫使CPU查找页表并在PTE中设置访问标记。

尽管如此,我们发现有几种方法可以减少这种攻击中的中断次数,甚至完全消除它们。特别是,我们可以避免跟踪程序片段(例如,函数)的入口和出口页面之间的访问模式,而是使用这些页面之间测量的执行时间来推断其间的执行路径。如果所有与秘密相关的分支都位于同一页中(即[39]提出的机制),只要这些分支的执行之间仍然存在时间差,这种方法仍然可以工作。此外,我们还提出了一种技术,该技术利用英特尔的“超线程”功能,通过使用包围区代码共享同一CPU核心的攻击进程来刷新TLB,这样可以在“超线程化”打开时消除中断的需要【TLB这里又和Translation Leak-aside Buffer: Defeating Cache Side-channel Protections with TLB Attacks相似,但是这篇文章是18年的】。

我们通过对现实应用程序的攻击来展示SPM的有效性。特别是,我们发现,当攻击EdDSA(第4.3节)时,我们的定时增强仅触发1300次中断,而在恢复整个512位密钥时,页面错误攻击导致71000次中断,直接访问标志攻击导致33000次中断。这种水平的中断率使得我们的攻击对所有已知的基于中断的防御几乎是看不见的[15,38],因为即使是目标程序的正常执行也会产生数千次中断

提高攻击的空间粒度

页面错误攻击使攻击者能够在页面粒度(4KB)上观察飞地程序的内存访问模式,因此现有的解决方案建议通过将敏感代码和数据对齐在相同的内存页面内来击败攻击。为了证明这种防御策略是无效的,我们展示了一系列实现更精细空间粒度的内存侧通道攻击,包括跨包围区Prime+Probe攻击、跨包围区DRAMA攻击和新型缓存DRAM攻击。特别是,缓存DRAM攻击利用Prime+Probe缓存攻击和DRAMA攻击来提高空间粒度。当利用这两个通道时,我们能够实现细粒度的观察(对于Prime+Probe,64B相当于16KB,对于DRAMA攻击,≥1KB),这使我们能够监控飞地程序的执行流(类似于Flush+Reload攻击)。请注意,这不能在缓存级别完成,因为在我们的情况下,攻击者不与目标飞地程序共享代码,这使得Flush+Reload不可用

含义

我们的研究结果表明,人们对SGX中潜在的攻击面缺乏了解,这可能会产生严重后果。不仅所有现有的防御机制易受我们开发的新攻击的影响,但其中一些攻击只会略微增加攻击者的成本:正如我们的研究所表明的,对于虚拟内存上的通道,页面故障攻击不是最具成本效益的攻击,大量的AEX中断也不是成功攻击所必需的;所有现有的保护措施都不会给更复杂的攻击者增加太多负担,他们可以有效地降低AEX的频率,而不会破坏攻击的有效性。最重要的是,我们希望我们的研究能够重新思考SGX和类似TEE技术的安全限制,引发关于何时使用它们以及如何正确使用它们的讨论。

贡献

在本文中,我们做出了以下贡献:

•首次深入研究SGX存储器侧通道攻击面。尽管只关注内存管理,但我们的研究揭示了披露飞地信息的新通道,特别是访问的标志、定时和跨飞地通道。

•新的攻击。我们开发了一套利用这些新渠道的新攻击技术。特别是,我们展示了多个通道可以相互补充,以提高攻击的有效性:定时+访问标志以减少AEX(使现有保护的有效性降低),DRAM+缓存以实现对飞地的细粒度观察(64B)。

•新的理解。我们讨论了新威胁的可能缓解措施,并强调了更好地理解类似SGX技术的局限性的重要性。

背景

Intel SGX中的内存隔离

飞地程序的内存隔离是英特尔SGX的一个关键设计功能。为了保持向后兼容性,英特尔通过对现有处理器体系结构的扩展来实现这种隔离,我们将在下面介绍。

虚拟和物理内存管理

英特尔SGX为飞地程序及其控制结构保留了一系列连续物理内存,称为处理器保留内存(PRM)。CPU的扩展内存管理单元(MMU)防止来自飞地之外的所有程序访问PRM,包括OS内核、虚拟机管理程序、SMM代码或直接内存访问(DMA)。Enclave Page Cache(EPC)是PRM内存范围的一个子集。EPC被划分为4KB的页面,并与其他物理内存页面类似地进行管理。每个EPC页面可以一次分配到一个飞地

每个程序的虚拟内存空间都有一个Enclave Linear Address Range(ELRANGE),它是为飞地保留的,并映射到EPC页面。敏感代码和数据存储在ELRANGE中。负责将虚拟地址转换为物理地址的页表由不受信任的系统软件管理。Translation lookaside buffer(TLB)以传统方式为EPC页面工作。当CPU通过EENTER或EEXIT指令或异步飞地出口(AEX)在非命名模式和飞地模式之间转换时,与当前进程上下文标识符(PCID)以及全局标识符相关联的TLB条目将被刷新,从而防止非飞地代码学习关于飞地内地址转换的信息

内存隔离的安全检查

为了防止系统软件通过操纵页面表条目来任意控制地址转换,CPU还在地址转换期间参考Enclave页面缓存映射(EPCM)。每个EPC页面对应于EPCM中的一个条目,该条目记录EPC页面的所有者飞地、页面类型以及指示页面是否已分配的有效位。分配EPC页面时,其访问权限在其EPCM条目中指定为可读、可写和/或可执行。映射到EPC页面的虚拟地址(在ELRANGE内)也记录在EPCM条目中。

由不可信系统软件设置的页表条目的正确性由扩展的页未命中处理程序(PMH)来保证。当代码在飞地模式下执行或地址转换结果落入PRM范围时,将进行额外的安全检查。特别地,当代码在非命名模式下运行并且地址转换落入PRM范围时,或者代码在飞地模式下运行但是物理地址没有指向属于当前飞地的常规EPC页面,或者触发页表遍历的虚拟地址与EPCM中相应条目中记录的虚拟地址不匹配时,将发生页面错误。否则,生成的TLB条目将根据EPCM条目和页面表条目中的属性进行设置。

内存加密

为了支持比EPC更大的ELRANGE,EPC页面可以“交换”到常规物理内存。此过程称为EPC页面驱逐。被逐出页面的机密性和完整性通过经过身份验证的加密得到保证。硬件内存加密引擎(MEE)与内存控制器集成,并无缝加密被逐出到常规物理内存页面的EPC页面的内容。消息验证码(MAC)保护加密的完整性和与被逐出的页面相关联的随机数。加密的页面可以存储在主存储器中,也可以像常规页面一样交换到辅助存储器中。但与加密相关的元数据需要由系统软件妥善保存,以便页面再次“交换”到EPC中。

威胁模型

在本文中,我们考虑针对飞地保护的代码和数据的攻击。这里的系统软件是指使用系统权限运行的程序,如操作系统和管理程序。我们在本文中的重点是威胁飞地项目机密性的侧通道分析。因此,飞地程序代码中的软件错误超出了我们的范围。此外,不涉及内存管理和地址转换的副通道也不包括在内

我们假设在我们演示的攻击中知道要加载到飞地中的受害者二进制代码。由于对手还知道虚拟地址空间中飞地二进制的基地址,以及整个虚拟到物理的映射,因此可以导出二进制代码在页面、缓存、DRAM中的映射。受害者程序的源代码不是必需的。我们在真实的SGX平台上进行了分析和实验。因此,我们确实假设对手在执行攻击之前可以访问相同配置的机器。

了解攻击面

在本节中,我们通过深入研究攻击向量(允许干扰飞地内执行的共享资源),然后分析单个向量,从攻击的利用方式和有效性的角度,探讨SGX内存管理中的侧信道攻击面。

攻击向量

现代英特尔CPU体系结构中的内存引用涉及一系列微操作:通过首先查阅一组地址转换缓存(例如TLB和各种分页结构缓存),然后遍历内存中的页表,将程序生成的虚拟地址转换为物理地址。所得到的物理地址然后用于访问高速缓存(例如,L1、L2、L3)和DRAM以完成存储器引用。在这里,我们在每个步骤中讨论内存侧通道攻击向量。

地址转换缓存

地址转换缓存是便于地址转换的硬件缓存,包括TLB和各种分页结构缓存。

TLB是一个多级集合关联硬件缓存,它临时存储从虚拟页码到物理页码的转换。特别地,虚拟地址首先被分为三个部分:TLB标记位、TLB索引位和页偏移位。TLB索引位用于索引集合关联TLB,并且TLB标记位用于匹配搜索到的TLB集合的每个TLB条目中的标记。与一级缓存类似,用于数据和指令的L1 TLB分为dTLB和iTLB。L2 TLB,通常较大且统一,将在L1 TLB未命中时进行搜索。最近的英特尔处理器允许在上下文切换时选择性地刷新TLB条目。这是由TLB条目中的进程上下文标识符(PCID)字段启用的,以避免刷新将再次使用的条目。如果两个级别的TLB都未命中,将启动页表遍历。根据英特尔的术语,虚拟页码分为PML4位、PDPTE位、PDE位和PTE位,每个位负责索引主存储器中的一级页表。由于页表遍历的延迟很长,如果处理器还配备了分页结构缓存,如PML4缓存、PDPTE缓存、PDE缓存,这些硬件缓存也会被搜索以加速页表遍历。PTE可以在存储器访问之前首先在高速缓存层次结构中进行搜索[11]。

矢量1。超线程环境下的共享TLB和分页结构缓存

启用超线程(HT)【英特尔的“同时多线程”术语】时,在包围区模式下运行的代码可能与在非包围区模式中运行的代码共享同一组TLB和分页结构缓存。因此,飞地代码对此类资源的使用将干扰非飞地代码的使用,从而创建侧信道。该攻击向量用于清除HT-SPM攻击中的TLB条目(第4.1节)。

矢量2。正在刷新AEX上TLB和分页结构缓存中的选定条目。

根据最新版本的《英特尔软件开发人员手册》[3],进入和离开包围区模式将刷新TLB和分页结构缓存中与当前PCID。因此,它使来自不同流程上下文的对手能够在上下文切换时推断刷新的条目。即使在没有HT的处理器上,这也是可能的。然而,我们无法在我们拥有的机器(即Skylake i7-6700)上确认这一攻击向量。我们推测这是因为我们的Skylake i7-6700遵循了旧版本的《英特尔软件开发人员手册》[4]中的规范,该手册规定,无论进程上下文如何,所有条目都将被刷新。尽管如此,我们相信这种攻击向量可能会出现在未来的处理器中。

矢量3。引用的PTE被缓存为数据。

除了分页结构缓存之外,引用的PTE也将作为常规数据进行缓存[11]。这个工件启用了一个新的攻击向量:通过利用监控的PTE上的Flush+Reload侧信道,对手可以执行交叉核心攻击,以跟踪包围区代码的页面级内存访问模式。这个攻击向量提供了我们在第4节中描述的SMP的定时通道版本。我们将在第6节中讨论它的含义。

页表

图1

页表是存储在主存中的多级数据结构,用于地址转换。每个分页表遍历都涉及多个内存访问。与常规的内存访问不同,页表查找是由处理器方向的微代码触发的,而不涉及重新排序缓冲区[11]。每一级的条目存储指向包含页表的下一级(物理地址)的存储器页的指针。PTE的结构如图1所示。特别地,比特0是present标志,指示物理页面是否已经映射到虚拟页面;位5是访问标志,每当页表遍历导致该页表条目的引用时,该标志由处理器设置;位6是脏标志,它是在相应的页面已经更新时设置的。页面帧回收算法依赖脏标志来做出帧回收决策。

由于页表位于操作系统内核内部,由不受信任的系统软件控制,因此可以对其进行操作以攻击飞地。然而,如前所述,由于EPC页面权限也受到EPCM的保护,恶意系统软件不能任意操纵EPC页面以损害其完整性和机密性。然而,在先前的工作[43]中已经表明,通过清除相应PTE中的当前标志,恶意系统软件可以从飞地程序收集页面访问的痕迹,从而推断出与秘密相关的控制流或数据流。尽管如此,设置当前标志并不是针对飞地程序的唯一攻击向量。

矢量4。以包围区模式更新访问的标志。

当页表遍历导致PTE的引用时,条目的accessed标志将设置为1。因此,在非包围区模式下运行的代码将能够检测页面表更新,并了解到对应的EPC页面刚刚被包围区代码访问。但是,页表遍历也将更新TLB条目,因此将来对同一页的引用不会更新PTE中的已访问标志,直到TLB条目被其他的地址转换行为驱逐。我们在第4节的SPM攻击中利用了这个攻击向量。

矢量5。飞地模式下脏标志的更新。

与访问的标志类似,当飞地程序修改相应的EPC页面时,脏标志将被更新。可以利用此工件来检测对新页面的内存写入。新的侧通道攻击向量将使对手能够监控与机密相关的内存写入,这可能是一种比内存访问跟踪更精细的推理攻击。

矢量6。在包围区模式下触发的页面错误。

除了当前标志之外,PTE中的一些其他比特可以被用来触发页面故障。例如,在x86-64处理器上,位M到位51是保留位,当设置时将在地址转换时触发页面故障。这里的M−1位是机器上物理地址的最高位。设置NX标志后,当从相应的EPC页面获取指令时,将强制页面出错。

缓存和内存层次结构

一旦将虚拟地址转换为物理地址,将从高速缓存和内存层次结构提供内存引用。两者都是临时存储器,只有在通电时才能保存数据。层次结构的顶部是单独的一级数据和指令缓存,下一级是专用于一个CPU核心的统一二级缓存,然后是CPU包的所有核心共享的三级缓存,最后是主存储器。缓存通常建立在静态随机存取存储器(SRAM)上,主存储器建立在动态随机存取存储器上。上层存储往往更小、更快、更贵,而下层存储通常更大、更慢、更便宜。内存提取从上到下依次进行;上一级的未命中将导致访问下一级。从较低级别获取的数据或代码通常会更新较高级别中的条目,以加快将来的引用。

主存储器通常被组织在多个存储器通道中,由存储器控制器处理。一个内存通道物理分区为多个DIMM(双列直插式内存模块),每个DIMM具有一个或两个列。每个列具有多个DRAM芯片(例如,8或16),并且还被划分为多个组。存储体承载按行组织的存储器阵列,并且每一行通常具有8KB的大小,由多个4KB存储器页共享,因为一个页往往跨越多行。存储体上还有一个行缓冲区,用于保存最近访问的行。在提供内存请求之前,每次读取内存都会将整行加载到行缓冲区中。因此,对已经在行缓冲器中的DRAM行的访问要快得多。

矢量7。CPU缓存在包围区和非包围区模式下的代码之间共享。

SGX不保护飞地免受缓存侧通道攻击。因此,所有级别的缓存都在飞地模式和非飞地模式下的代码之间共享,类似于众所周知的侧通道攻击向量跨进程和跨VM缓存共享。因此,所有已知的缓存侧通道攻击,包括对L1数据缓存、L1指令缓存和L3缓存的攻击,都适用于包围区设置。我们根据经验证实了此类威胁(第5.1节)。

矢量8。整个内存层次结构,包括内存控制器、通道、DIMM、DRAM列组和组(包括行缓冲区),在包围区和非包围区模式下的代码之间共享。

与高速缓存共享类似,DRAM模块由计算机系统中运行的所有进程共享。因此,不可避免地将包围区代码和非包围区代码访问存储在同一DRAM组中的存储器。DRAM行缓冲器可以作为侧通道攻击向量:当目标程序进行内存引用时,相应的DRAM行将被加载到存储体的行缓冲器中;对手可以比较行访问时间来检测特定行是否刚刚被访问,从而推断目标的内存访问。DRAMA攻击中利用了此伪影[36]。在第5节中,我们展示了在解决关键技术挑战后,这种攻击也可以在飞地程序上成功。其他共享内存层次结构也可能在包围区和非包围区代码之间产生争用,从而导致可能导致隐蔽信道的干扰[27]。

表征内存向量

在这里,我们在三个维度上表征上述存储器侧通道:

空间粒度

该概念描述了在存储器侧信道攻击期间对手可直接观察到的最小信息单元。具体来说,它测量了一侧通道观测无法揭示的地址空间的大小。例如,页面故障攻击的空间粒度为4KB,表明每个故障都使对手能够看到一个被触摸的内存页面(4096字节),尽管访问的确切地址没有直接公开。

时间可观察性

给定空间粒度级别,即使对手无法直接看到最小信息单元内发生的事情,在执行目标程序期间仍然可以生成定时信号,以帮助区分程序在单元内进行的不同访问。例如,程序在页面上停留的持续时间间接地指示发生了单个内存还是多次访问。如果测量时间并用于细化攻击中的观测结果,则称侧通道具有此特性。

副作用

我们使用这个概念来表征由内存侧通道攻击引起的可观察异常,可以用来检测攻击。一个例子是AEX,它经常被页面错误攻击调用。另一个副作用是执行速度减慢。由于进行侧信道攻击的主要方法是在内存资源中引起争用,例如缓存、TLB、分页结构缓存、DRAM行缓冲区等的刷新,因此飞地代码的运行时性能将引入开销AEX也会增加性能开销。例如,报告的原始页面错误攻击会使目标程序的运行速度慢一到两个数量级。这种程度的放缓很容易引起注意。使用Chen等人[15]提出的方法也可以检测到频繁的AEX,因为两个基本块之间的执行时间可能要长得多。

通过SPM攻击减少副作用

为了攻击虚拟内存,页面故障侧通道攻击者首先限制对所有页面的访问,每当包围区进程接触到这些页面中的任何一个时,就会引发页面故障,从而生成其页面访问序列。

这里的一个问题是,这种方法是重量级的,每次访问页面都会造成中断。这通常会导致性能下降一到两个数量级[43]。因此,通过观察其极高频率的页面错误(即AEX)和从远程观察到的异常低的性能,可以检测到这种攻击。除了那些需要硬件更改的解决方案外,所有现有的解决方案要么利用中断,要么试图删除程序的页面跟踪(例如,将所有代码放在一个页面上)。几乎没有人质疑这种辩护是否足够。

为了表明过量的AEX不是进行内存侧信道攻击的必要条件,在本节中,我们详细介绍了y隐蔽页面监控(SPM),这是一种新的页攻击,可以与频率低得多的AEX实现类似的效果。

SPM的三种攻击(矢量4)

在本节中,我们将介绍三种类型的SPM攻击,它们监视页表条目并利用不同的技术来刷新TLB。

B-SPM:访问标志监视。

SPM攻击操纵和监视飞地进程页面上的访问标志,以识别其执行跟踪。具体来说,我们在飞地之外运行一个系统级攻击过程,反复检查每个页表条目的访问标志,记录它的设置时间(从0到1),并在发生这种情况时重置它。以这种方式恢复的页面访问跟踪是一系列页面集,每个页面集都是在两次连续检查之间访问的一组页面(其访问标志设置为1)。这种攻击是轻量级的,因为当页面被访问时,它不需要任何AEX来第一次观察页面。

然而,如前所述,在转换虚拟地址后,其页码会自动添加到TLB中。因此,当稍后访问该页面时,将不会再次设置该页面的已访问标志。为了强制处理器访问PTE(并更新标志),攻击者必须主动使TLB条目无效。最简单的方法是从不同的CPU核心生成处理器间中断(IPI),以触发TLB击落,这会导致飞地出现AEX,从而刷新当前PCID的所有TLB条目。图2说明了这种攻击,我们称之为基本SPM或B-SPM。
图2
这种B-PM攻击仍然涉及中断,但已经比页面故障攻击轻得多:TLB击落通常比页面故障便宜;更重要的是,B-PM只在需要再次观察访问同一页面时触发中断,而后者需要在每次(新的)页面访问前触发中断。

就准确性而言,页面故障攻击往往具有精细的观察,而B-SPM攻击无法区分在同一轮检查中发现的两个页面的访问顺序。然而,B-PM攻击力求在中断率和攻击解决方案之间取得平衡

T-SPM:定时增强。
图3

当对相同页面的重复访问成为输入的显著特征时,基本SPM需要发布更多TLB击落以观察该特征,使检测异常中断率的现有保护可以观察到攻击[15,38]。

图3展示了一个示例,其中与秘密相关的代码位于同一页中,只是在一个条件下的执行涉及循环,而在另一个条件上的执行不涉及循环,从而导致不同的执行时间。在这种情况下,需要在循环执行期间进行TLB击落,以使用页面访问跟踪(即页面访问次数)来区分两个分支。为了减少中断次数,我们利用定时通道来增强SPM,使其更隐蔽。具体来说,给定一个具有唯一入口页α和唯一出口页β的代码片段,以及不同页面上两点之间的多条依赖于输入的路径,我们的定时增强SPM(称为T SPM)连续监测α和β,测量这两点之间的执行时间,一旦发现β的访问标志被设置,刷新TLB并重置两个PTE的已访问标志。然后,所记录的定时被用于推断代码片段的输入

这种简单的方法避免了α和β之间的所有中断,但仍然揭示了连接它们的可能执行路径。在极端情况下,当所有其他代码都停留在同一页面上时,正如先前的研究[39]为抵御页面故障攻击而提出的那样,当对T-SPM的操作需要不同的时间才能完成时,T-SPM仍然可以推断出敏感信息。

HT-SPM:TLB通过超线程刷新。

此外,我们发现,当为处理器打开超线程时,我们可以在不发布TLB故障切换的情况下清除TLB,这会使所有现有的基于中断的保护无效。“超线程”在一个物理核心上运行两个虚拟核心,以处理来自两个不同操作系统进程的工作负载。这种资源共享对操作系统是透明的,因此不会触发任何中断。在两个虚拟核上运行的进程共享一些TLB,这使攻击者能够在不造成任何中断的情况下删除飞地之外的一些TLB条目。因此,在存在超线程的情况下,我们可以将攻击进程与飞地进程一起运行,以持续探测与后者使用的TLB条目冲突的虚拟地址,试图驱逐这些条目并迫使受害进程遍历其页表。使用这种我们称之为HT-SPM的技术,我们可以在攻击期间删除大部分甚至消除中断

【实验部分省略了】

利用CACHE-DRAM攻击提高空间粒度

页面故障侧通道攻击(以及上一节中描述的SPM攻击)只允许攻击者以在页面粒度上学习飞地程序的内存访问模式。因此,已经提出了将敏感代码和数据混合到同一页面中的机制,以击败此类攻击[39]。英特尔还建议“调整特定代码和数据块,使其完全存在于一个页面中。”[7]。然而,这种防御方法的有效性在很大程度上取决于这样一个事实,即页面粒度是对手可以实现的最佳空间粒度。然而,我们的研究表明事实并非如此。

在本节中,我们展示了三种攻击方法,以表明强大的对手能够显著提高空间粒度。特别是,我们将演示跨包围区Prime+Probe缓存攻击、跨包围区DRAMA攻击和缓存DRAM攻击。由于SGX不允许飞地之间共享内存,因此无法对安全飞地进行可实现缓存线粒度的Flush+Road缓存攻击。然而,我们证明了缓存DRAM攻击能够针对飞地实现相同级别的空间粒度。

跨飞地的Prime+Probe(矢量7)

我们的探索从验证跨飞地缓存Prime+Probe攻击开始。SGX不是为处理缓存侧通道攻击而设计的。因此,预计已知的缓存攻击也适用于SGX飞地c。为了证实这一点,我们将GnuPG 1.4.13移植到Graphene-SGX。该算法重复解密用3072位ElGamal公钥加密的密文,就像之前的工作(即[30])一样。GnuPG使用维纳表来决定与字段大小匹配的子组大小,并向安全参数添加50%的裕度,因此使用403比特的私钥。在实验中,攻击过程在加载受害者飞地时进行监控,并确定平方和乘幂的物理地址。利用缓存切片和缓存集映射[24]的知识,攻击者构建了映射到与目标地址相同的缓存集的驱逐集。在我们的实验中,只观察到一次ElGamal解密,我们可以通过Prime+Probe缓存攻击恢复所有403位私钥,错误率为2.3%。

该实验表明,Prime+Probe缓存攻击可以在跨飞地场景中执行,类似于传统设置。我们注意到Prime+Probe攻击实现了缓存集的空间粒度,在具有8196集LLC的处理器上为16KB(见表1和表7)。

跨飞地的DRAMA(矢量8)

DRAMA攻击利用共享DRAM行来提取敏感信息[36]。在这样的攻击中,为了了解受害者进程是否访问了虚拟地址d,对手分配了两个映射到同一DRAM组的内存块,其中一个与d的物理内存共享同一个DRAM行,我们称之为p,另一个映射到相同组上的不同行,我们也称之为p′。攻击使用以下步骤进行:

访问内存块p′。

等待一些受害者操作。

测量内存块p的访问时间。

对内存块p的更快内存访问表明受害者进程可能在操作。当然,因为DRAM行很大(例如,通常为8KB),所以错误检测是可能的。即便如此,DRAMA被证明可以有效地检测键击活动的存在[36]。

直接应用DRAM执行跨飞地攻击面临着几个挑战,其中大多数也是我们设计的缓存DRAM攻击所面临的挑战。因此,我们将这些设计挑战的讨论推迟到第5.3节,在该节中我们详细介绍了缓存DRAM攻击。在这里,我们列举了跨飞地DRAMA攻击的一些局限性。

首先,受害者的大部分内存访问都将被缓存(默认情况下EPC是可缓存的),因此不会通过使用DRAM行泄露信息。虽然我们可以通过为运行受害者飞地3的核心设置CR0的缓存禁用(CD)位来手动禁用缓存,但这将使飞地进程减慢约1000倍。

其次,DRAMA攻击可能会错误地检测到与受害者飞地访问d无关的行命中,因为8KB的DRAM行可以由多个数据结构或代码区域共享。然而,这种错误检测在我们的实验中非常常见。

最后,DRAMA无法实现细粒度的空间精度。例如,在我们的测试系统上,内存页分布在4个DRAM行上。在极端情况下,攻击者可以占用除受害者飞地的单个1KB块外的整行,并实现1KB的空间精度(见表7),这比Prime+Probe缓存攻击(16KB)要好,但仍比Flush+Road缓存攻击(64B)差。

缓存DRAM攻击(矢量7和8)

为了改进跨飞地DRAM攻击,我们提出了一种新的高速缓存DRAM攻击。我们表明,通过利用向量7和向量8,对手可以显著提高内存侧通道攻击的空间粒度。

技术

图5

特别是,缓存DRAM攻击是使用两个线程执行的:一个线程以非包围区模式运行,该模式Prime+Probe 地址d映射到的最后一级缓存中的缓存集;另一个线程在不禁用高速缓存的情况下进行跨包围区DRAMA。由于Prime+Probe攻击会导致与最后一级缓存中的d发生冲突,因此受害者飞地的d的访问将到达DRAM。缓存DRAM攻击的概念如图5所示。然而,要实现针对SGX飞地的高速缓存DRAM攻击,需要解决以下挑战:
表1

表6

首先,与d共享DRAM组和行。飞地专用的EPC内存已经与DRAM中的其他物理内存隔离。为了理解这个工件,我们以自己的测试台(表1)为例解释了DRAM级别隔离的机制。假设行位是物理地址[36,42]中的最高有效位,位19之外的任何位都是确定物理地址的对应DRAM行的行位。对于128MB PRM(物理内存范围0x80000000到0x87FFFFFF),没有非PRM内存会占用行号0x1000到0x10FF,如表6所示。因此,PRM范围(仅由包围区占据)跨越每个DRAM存储体并且占据每个存储体中的特定行集合;这些行不与非PRM存储器区域共享。

为了克服这一障碍,我们利用处理器对同时运行多个飞地程序的支持,从对手控制的另一个飞地软件中执行DRAMA攻击。由于两个程序都在飞地内运行,因此它们共享EPC内存范围。如图5所示,对手可以设法将内存页与目标飞地内存放在同一个库甚至同一行上。具体而言,我们首先确定了受害者飞地中感兴趣的实际地址。这可以通过直接读取页面表来实现。然后,我们在间谍飞地中分配了一大块内存缓冲区,并确定了它们的物理地址。如上所述,使用原始DRAMA攻击[36]提供的反向工程工具,我们选择了两个内存地址p和p′。攻击如图5所示。p和p′被依次存取而没有任何延迟。测量存储器块p的访问等待时间,以确定受害者包围区中的目标地址d是否刚刚被访问。

其次,在飞地中获得细粒度定时器。执行这种攻击的一个意外挑战是缺乏可靠的时钟。SGXv1处理器系列不在飞地内提供时序信息:RDTSC和RDTSCP等指令对飞地程序无效。为了测量时间,一种简单的方法是进行系统调用,由于处理EEXIT和调用的时间不同,系统调用量大、速度慢且不准确。我们提出的一个更轻量级的解决方案利用了飞地进程可以在不切换模式的情况下访问外部内存的观察结果。因此,我们可以保留一个内存缓冲区,用于将CPU周期计数走私到攻击飞地中。具体来说,包围区外的线程不断地将循环计数转储到缓冲区,而包围区内的攻击线程则不断地从缓冲区中读取。尽管它们之间的竞争条件偶尔会带来噪音,因为我们避免了互斥来支持线程之间的及时交互,但大多数时候我们都成功地当探测目标飞地地址时,观察到行命中和行冲突之间的时间差。我们使用这种方法来测量p的访问延迟。

【实验部分省略】

缓解和讨论

攻击面分析

表7

表7总结了在不同向量上发现的存储器侧信道攻击的特征。这里的数据是从表1中的系统配置和128MB的PRM大小中收集的。“精度”列下的值显示攻击向量的空间精度。例如,iCache Prime+Probe侧信道的精度为2MB(即128MB/64):也就是说,在其中一个iCache集中检测到一个缓存未命中可能意味着正在访问的2MB物理内存中的任何一个。数字越大,向量的粒度就越粗。粒度最细的攻击是缓存DRAM攻击,它是64字节,相当于Flush+Reload缓存攻击。但是,请注意,由于缺少共享内存页面——因为EPC页面一次只属于一个飞地——Flush+Reload缓存攻击在SGX飞地上是不可行的。还值得注意的是,精度的计算没有考虑目标飞地专用的物理存储器的知识。这些信息可以帮助进一步提高粒度。针对iCache、dCache和L2缓存的Prime+Probe缓存攻击会导致大量AEX。这并没有考虑超线程。如果是这样的话,AEX的数据和放缓都将变得温和。大多数需要频繁抢占飞地执行的攻击向量都会导致较高的开销。跨飞地DRAMA需要禁用缓存才能进行有效的攻击,从而导致高速度减慢。表中没有显示的是时间可观察性。除了页面故障攻击,所有其他攻击都具有时间可观察性,因为它们允许观察比其基本信息单元所允许的更细粒度的信息,这些信息是通过定时信号泄漏的。

未列出的其他攻击向量。

针对缓存的PTE项的Flush+Reload缓存攻击是表7中未列出的一个攻击向量。由于PTE条目与另外7个PTE条目共享缓存行,因此空间精度为4KB×8=32KB。如果PTE条目是有意组织的,则攻击可以达到4KB的空间精度。结合SPM和DRAMA攻击也将引入一种新的攻击向量。由于与我们展示的攻击相似,我们没有展示这些攻击。

现有防御措施的有效性

确定性多路复用

Shinde等人[39]提出了一种基于编译器的方法,将所有依赖秘密的控制流和数据流机会主义地放置在同一页面中,这样页面级攻击就不会泄露敏感信息。然而,这种方法不考虑缓存侧通道或DRAM侧通道,使防御容易受到缓存攻击和DRAMA的攻击。

使用事务内存隐藏页面错误

T-SGX[38]通过将程序的执行封装在硬件支持的内存事务中,防止包围区内的页面故障信息泄露。页面错误将导致事务中止,事务中止将首先由飞地内的中止处理程序处理。事务中止处理程序将注意到异常页面错误,并决定是否将控制流转发到不受信任的OS内核。因此,页面错误处理程序只能看到页面错误发生在中止处理程序所在的页面上(通过寄存器CR2)。真正的错误地址是隐藏的。

但是,T-SGX无法阻止访问标志启用的内存侧通道攻击。根据“英特尔软件开发人员”手册[3],当更新被引用页表项的访问标志和脏标志时,事务中止并不是严格执行的。这意味着不能保证事务区域内的内存访问不会通过更新页表条目而泄露。

安全的处理器设计

Sanctum[16]是一种新的硬件设计,旨在抵御最后一级缓存攻击和基于页表的攻击。由于Sanctum飞地有自己的页面表,页面访问模式对恶意操作系统来说是不可见的。因此,页面错误攻击和SPM攻击将失败。然而,Sanctum并不能阻止跨飞地DRAMA攻击。事实上,Sanctum仍然依靠操作系统将DRAM区域分配给飞地,创建页表条目,并在飞地初始化期间将代码和数据复制到飞地中。由于操作系统知道飞地的确切内存布局,因此攻击者可以在与目标飞地地址共享同一DRAM行的不同DRAM区域中运行攻击过程。

定时执行

Chen等人[15]提出了一种基于编译器的方法,称为DÉJAÉVU,以控制流图中基本块的粒度来测量飞地程序的执行时间。执行时间大于阈值表示包围区代码已中断,并且发生了AEX。它背后的直觉是,在基本块级别测量的执行时间不会受到不同输入引起的变化的影响。由于SGX v1飞地中缺乏定时测量,DÉJAÉVU在飞地内构建了一个软件时钟,该时钟封装在Intel事务同步扩展插件(TSX)中。因此,时钟本身不会在没有被检测到的情况下被中断。结果表明,DÉJAÉVU可以高保真地检测AEX。因此,任何引起大量AEX的侧通道攻击向量都会被DÉJAÉVU检测到。然而,那些不涉及AEX的攻击,如T-SPM或HT-SPM攻击,将完全绕过DÉJAÉVU。

Enclave地址空间布局随机化

当飞地程序加载到SGX内存中时,SGX Shield[37]实现了细粒度ASLR。然而,恶意操作系统在长期观察内存访问模式后仍然可以了解内存布局,因为SGX Shield不支持实时重新随机化。

经验教训

我们对SGX内存侧通道的分析揭示了对手拥有的新攻击面和新能力。以下是关于如何减轻SGX平台上的此类风险的一些想法,更一般地说,是针对新兴的TEE。

SGX应用程序开发

我们的研究表明,对手不仅可以通过页面和缓存通道,还可以通过页面间定时、跨飞地DRAM和超线程来实现对飞地进程的细粒度监控。SGX开发人员必须意识到这些新攻击面的影响,这对于构建飞地应用程序以避免通过新通道泄漏至关重要。例如,她无法再通过避免页面级访问模式来隐藏自己的秘密,因为页面内或页面间的时间安排也会泄露她的敏感信息。

软件级保护

针对SGX侧通道泄漏的防御不能再依赖于我们今天的假设。特别是,这种攻击不一定会导致异常高的AEX率。将敏感信息混合到相同的内存页中对于更精细的空间粒度的攻击是无效的。此外,对手还可以使用多个通道的组合来进行更强大的攻击。

硬件增强

到目前为止,我们所知道的大多数内存侧通道都可以通过硬件更改来缓解,例如,缓存/DRAM的分区和在EPC中保留包围区页表等。在某些情况下,这样的更改可能是最好的选择。进一步的研究有望更好地了解该问题和相关副渠道的影响,为英特尔和其他TEE制造商提供硬件级支持提供理由。

全局

多年来,我们观察到许多侧通道研究都遵循类似的模式:发现一种巧妙的攻击,然后研究人员立即开始防御攻击。然而,回顾过去,大多数防御方案都没有考虑到所展示的攻击背后的大局,因此它们无法提供有效的保护来对抗能够快速调整策略的对手,有时甚至没有有意义地提高攻击变化的标准。对SGX正在进行的研究显然也陷入了同样的陷阱。我们希望我们的研究能够成为重新思考SGX安全方面正在进行的工作的一个新的起点,激励后续工作更好地理解这种新TEE的基本局限性,以及我们如何有效、安全地使用它。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

粥粥粥少女的拧发条鸟

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值