Bluethunder: A 2-level directional predictor based side-channel attack against SGX【分支预测】


作者:T. Huo, X. Meng, W. Wang, C. Hao, P. Zhao, J. Zhai, and M. Li.
发布:IACR(计算机体系结构顶会)
时间:2020

笔记

BlueThunder
1、动机
(1)目前大多数SGX保护方法旨在防御基于页表和基于缓存的攻击,使飞地中的秘密容易受到基于BPU攻击
(2)基于BPU的攻击可以识别飞地内的细粒度控制流信息(即指令级与页面级和缓存行级)
(3)大多数现有的针对飞地的基于BPU的侧信道攻击都利用BTB进行攻击。通过滥用BTB入口冲突,攻击者可以推断甚至误导飞地中目标分支的执行方向。然而,基于BTB的攻击可以通过当前的缓解技术来预防。
(4)与基于BTB的攻击不同,基于PHT的攻击仍然可以突破当前的保护机制。Branchscope[ERAG+18]首先对SGX执行基于PHT的攻击。通过操纵双峰预测器(即1级预测器)中的哈希冲突,该攻击可以提取目标飞地的细粒度信息。
(5)然而,Branchscope需要在每次检测之前执行大量(即100000)分支来激活易受攻击的预测器,这在攻击期间会造成相当大的训练开销,并限制了这种攻击的使用。
2、攻击原理
基于模式历史表(PHT)的针对SGX的侧信道攻击,滥用2级方向预测器揭示飞地中依赖输入的控制流
3、挑战
(1)即使对同一目标分支进行预测,也可以在不同的上下文中使用不同的条目。因此,攻击者很难在二级预测器中构造入口冲突
(2)n位的PHT的值还没有向公众公开
(3)基于BPU的攻击通常要求攻击者和受害者进程按顺序执行(例如,首先攻击者训练预测器,然后受害者执行代码,最后攻击者检测到状态变化),这限制了攻击的时间分辨率
4、新技术
(1)中断SGX飞地来修复受害者核心的分支历史
(2)对2级预测器中条目的内部逻辑进行逆向工程
(3)动态调整攻击者目标分支的分支方向来提高攻击的时间分辨率
5、泄露
(1)攻击者执行路径中与“TTTNNN”不匹配的任何不规则序列都可能是受害者进程造成的
①如果检测到的执行序列中包含的“N”的数量大于“T”的数量,则受害者进程执行具有所取方向的目标分支;如果检测到的执行序列中包含的“N”的数量小于“T”的数量,则受害者应以未采取的方向执行目标分支
(2)通过跟踪执行分支的周期数,攻击者可以推断分支是否被错误预测,从而推断目标2级预测器条目的当前状态
6、比较
(1)Bluethunder和PORTSMASH都具有高的时间分辨率和低的可检测性,PORTSMASH甚至可以实现比Blue雷电更高的空间分辨率。然而,由于Bluethunder滥用完全不同的处理器组件,它可以绕过大多数防御技术,如禁用SMT或防止端口争用,这些技术可用于防御PORTSMASH攻击
7、缺陷
(1)然而,这是以更长的进攻时间为代价的。具有不同检测时间的两个测量值之间的比较如表7所示。结果表明,随着检测次数的增加,两种测量方法的时间成本也随之增加
8、防御
(1)软件
①Choi等人[CKGN01]提出了一种称为“if转换”的技术,该技术能够使用CMOV等条件指令来替换条件分支。由于飞地程序中的条件分支被删除,我们的攻击就不能再进行了。然而,这种方法通常是特定于算法的,将其应用于一般应用是具有挑战性的
②由于Bluethunder攻击会向目标系统引入大量预测失误,因此通过监控目标系统中的预测失误数量,可以检测到这些攻击
③然而,对于这两种检测方法,选择用于区分良性程序和不良程序的阈值是困难的。这是因为许多良性程序可能会导致大量预测失误或中断,就像Bluethunder一样。
(2)硬件
①随机化PHT索引逻辑
1)Bluethunder的根本原因是飞地进程和非飞地进程之间的2级预测器入口冲突。
2)为了让攻击者更难构建条目冲突,我们可以随机更改PHT索引逻辑,就像随机化缓存映射一样[WL07]。考虑到如果我们只随机化一次,攻击者可能会发现随机化索引逻辑,可以使用周期性随机化。该解决方案可以保持PHT的高使用率,因为PHT条目仍然在包围区和非包围区进程之间共享。然而,如果我们多次随机化索引算法,以便记录分支与其PHT条目之间的当前索引关系,则可能需要额外的硬件组件(如缓冲器)。
②防止预测敏感分支
1)Branchscope[ERAG+18]提出了一种优化方法软件开发人员标记与敏感信息相关的分支。当执行这些标记的指令时,CPU将避免预测它们。这种方法可以保护受害进程不受侧通道攻击,并且与禁用BPU相比,可以减少性能开销。然而,此解决方案无法抵御隐蔽通道攻击
(3)相关工作
①SGX侧信道
1)基于页表的攻击
a.基于页故障
a)该攻击通过将包围区页面标记为不存在来在页面大小粒度的包围区内泄漏机密
b.基于页位
a)通过观察页面表的访问位和脏位,成功地进行了页面位攻击并泄露了飞地的秘密
2)缓存的攻击
a.通过使用“Prime+Probe”方法[OST06],这些攻击能够了解飞地访问哪些内存位置,并以细粒度提取飞地的秘密。
3)基于BPU的攻击
a.利用BPU做出的推测性预测结果
a)SgSpectre[CCX+19]在SGX环境中利用了著名的Spectre漏洞[KHF+19],破坏了SGX飞地的机密性和完整性
b.利用BPU的当前状态
a)例如,Lee等人[LSG+17]进行了一种名为“分支阴影”的攻击,该攻击通过滥用飞地和非飞地之间的BTB入口冲突来推断飞地的细粒度控制流
b)另一个例子是Branchscope[ERAG+18],它通过滥用BPU中的双峰预测器来泄露目标程序中的敏感数据,BPU的核心组件是2位饱和计数器。然而,Branchscope有一个限制,它需要近100000个分支在攻击期间的每次检测之前初始化BPU状态,这大大降低了攻击速度。
c)Branchscope与我们的攻击密切相关。不同的是,我们对攻击进行了反向工程并滥用了两级定向预测器,这是BPU中完全不同的预测组件。
②微体系结构侧信道
微体系结构侧通道利用处理器中的共享资源
1)缓存
2)分支预测单元
3)无序执行
4)浮点单元

摘要

软件保护扩展(SGX)是一种基于硬件的可信执行环境(TEE),在最近的英特尔商品处理器中实现。通过将安全关键应用程序的内存与不受信任的软件隔离,该机制为用户提供了一个名为飞地的强屏蔽环境,用于安全执行程序。然而,最近的研究表明,SGX飞地很容易受到侧信道攻击。为了应对这些攻击,已经研究并利用了几种保护技术。在本文中,我们探索了一种新的基于模式历史表(PHT)的针对SGX的侧信道攻击,名为Bluethunder,它可以绕过现有的保护技术,揭示飞地内的秘密信息。与现有的基于PHT的攻击(如Branchscope[ERAG+18])相比,Bluethunder在分支预测单元中滥用了两级方向预测器,在此基础上,我们开发了一种利用方法来揭示飞地中依赖输入的控制流。由于训练2级预测器的成本非常低,Bluethunder可以在攻击期间实现高带宽。我们在两个案例研究中评估了我们的攻击:提取英特尔SGX SDK中vfprintf函数中的格式字符串信息,以及攻击mbed TLS中RSA解密算法的实现。这两种攻击都表明,Bluethunder可以以较低的训练开销恢复飞地内的细粒度信息,比最新的基于PHT的侧信道攻击(Branchscope)高出52倍。具体来说,在第二次攻击中,蓝雷可以在单次运行中以96.76%的准确率恢复RSA私钥。

引言

基于硬件的可信执行环境(TEE)是实现安全计算的一种很有前途的技术。通过在隔离环境中运行软件,TEE可以保护软件资源不被不受信任的应用程序或操作系统(OS)访问。ARM的TrustZone[ARM08]、Intel的Trusted Execution Technology(TXT)[Gre12]和Software Guard Extensions(SGX)[Int14]是广泛部署的基于商品硬件的TEE。在这些TEE实现中,英特尔的SGX由于其强大的安全保障而近年来备受关注,它支持各种新的应用程序,如安全数据分析[SCF+15]和安全分布式计算[DSC+15,BWG+16]。

然而,最近的研究表明,SGX容易受到以下侧信道攻击:基于页表的攻击[VBWK+17,XCP15]、基于缓存的攻击[BMD+17,GESM17,HCP17,SWG+17]和基于分支预测单元(BPU)的攻击[ERAG+18,LSG+17,CCX+19]。与其他两种攻击相比,基于BPU的攻击受到了相当大的关注,原因有以下两个:首先,目前大多数SGX保护方法旨在防御基于页表和基于缓存的攻击,使飞地中的秘密容易受到基于BPU攻击;其次,基于BPU的攻击可以识别飞地内的细粒度控制流信息(即指令级与页面级和缓存行级)

分支目标缓冲区(BTB)和模式历史表(PHT)是BPU中的两个主要组件。大多数现有的针对飞地[CCX+19,LSG+17]的基于BPU的侧信道攻击都利用BTB进行攻击。通过滥用BTB入口冲突,攻击者可以推断甚至误导飞地中目标分支的执行方向。然而,基于BTB的攻击可以通过当前的缓解技术来预防[HLLP18,ABPK07,Int18]。与基于BTB的攻击不同,基于PHT的攻击仍然可以突破当前的保护机制。Branchscope[ERAG+18]首先对SGX执行基于PHT的攻击。通过操纵双峰预测器(即1级预测器)中的哈希冲突,该攻击可以提取目标飞地的细粒度信息。然而,Branchscope需要在每次检测之前执行大量(即100000)分支来激活易受攻击的预测器,这在攻击期间会造成相当大的训练开销,并限制了这种攻击的使用

在本文中,我们提出了一种新的基于PHT的攻击Bluethunder【我们用蓝雷来表示闪电(因为它的颜色是蓝色的)和闪电,这是快速和强大的。】,它可以揭示在真实SGX硬件上运行的飞地程序的细粒度控制流。Bluethunder将2级预测器中的碰撞滥用为侧信道。Branchscope通过为每次检测执行大量分支来激活双峰预测器,相比之下,Bluethunder在攻击期间只需要激活一次2级预测器预测器,这大大加快了攻击速度。此外,由于PHT表在上下文切换时不刷新,并且在运行在同一物理核心上的2个超线程之间共享,因此在更新最新的微码补丁或禁用SMT后,Bluethunder在处理器上仍然有效

然而,在实践中,在2级预测器上利用这样的信道并不是那么简单,因为(1)在对2级预预测器条目[LMB+]进行索引时同时考虑了最近的分支历史和目标分支的地址,因此即使对同一目标分支进行预测,也可以在不同的上下文中使用不同的条目。因此,攻击者很难在二级预测器中构造入口冲突。(2)尽管已经公开了2级预测器的关键部分是n位PHT[ERAG+18],但是n的值还没有向公众公开;(3)当前基于BPU的攻击通常要求攻击者和受害者进程按顺序执行(例如,首先攻击者训练预测器,然后受害者执行代码,最后攻击者检测到状态变化),这限制了攻击的时间分辨率。为了克服这些挑战,我们开发了三种新的开发技术:(1)通过中断SGX飞地来修复受害者核心的分支历史,(2)对2级预测器中条目的内部逻辑进行逆向工程;(3)提出了一种检测方法,该方法可以通过动态调整攻击者目标分支的分支方向来提高攻击的时间分辨率

我们针对最近CoffeeLake处理器上的SGX飞地评估了Bluethunder,目标是SGX SDK中的vfprintf函数和mbed TLS中的滑动窗口RSA-2048解密算法(第6节)。两个实验都表明攻击可以比最新的基于PHT的侧信道攻击(Branchscope)高52倍。具体来说,在第二个实验中,Bluethunder只运行一次解密,就以96.76%的准确率提取了整个2048位的私钥。Bluethunder恢复一位的开销平均为1.85×104个cpu周期,仅为Branchscope(9.56×105个cpu周期)的1.9%。

总之,本文的主要贡献是:

贡献

新颖的基于PHT的攻击。

我们介绍了一种新的基于PHT的侧信道攻击Bluethunder,用于提取飞地进程的控制流。我们还对2级预测器中PHT条目的内部逻辑进行了逆向工程。据我们所知,这是对2级定向预测器的第一次侧信道攻击,它扩展了我们对针对SGX的侧信道攻击的理解。

新技术。

(1)我们提出了一种新的方法来构造一个只有93个分支的给定分支历史。通过使用这种方法,我们恢复了飞地中断的分支历史信息。(2)我们提出了一种新的检测技术,使攻击者能够以高时间分辨率监视飞地的动作,而不必关心飞地中的目标指令何时执行。(3) Bluethunder是第一次尝试使用SGX中断来修复分支历史。通过在目标分支之前中断包围区,攻击者可以确保每次执行包围区程序中的目标分支时,分支历史都是相同的。

实施和评估。

我们在真实的SGX硬件上使用最新的硬件补丁来实现Bluethunder,以抵御推测性执行攻击,并在两个案例研究中评估了这种实现:攻击vfprintf函数和RSA算法。当攻击者和受害者在两个超线程逻辑核心上运行,以及在没有超线程的同一逻辑核心上时,我们还确认了Bluethunder在这两种情况下的表现。

背景

BPU是现代流水线处理器的优化设计。通过预测进程的可能执行路径,BPU可以加快处理器设计中的获取进程,从而使处理器免于等待先前指令的完成
图1

图1说明了BPU的一种可能设计,它有两个主要组件:分支方向预测器和BTB。分支方向预测器用于预测分支指令的可能跳跃方向(跳跃或不跳跃);而BTB用于预测该分支的跳转目的地地址。当分支到来时,BPU通常使用一个分支方向预测器来预测该分支可能的执行方向。如果预测结果被采用(即跳转),则从BTB预测的地址开始的指令将被提前获取并执行;或者如果预测不采取分支,则BTB所做的目标地址预测将被忽略。同时,根据传入分支的实际跳转方向来更新预测器。
图2

PHT。分支方向预测器(即双峰预测器或二电平预测器)中的主要组件是PHT,它是一个包含几个n位饱和的记录表计数器。当方向预测器工作时,可以选择其中的一个PHT条目来预测即将到来的分支的可能方向。在实际执行该分支之后,PHT的相对条目给出的计数器被更新。图2中给出了更新n位饱和计数器的有限状态机(FSM)描述。如果计数器值小于2n−1,则此计数器处于“not-taken模式”,这意味着预测的方向“not-taken”;否则,计数器处于“taken模式”,所做的预测为“take”。例如,值为0的3位饱和计数器处于“not-taken模式”;而另一个值为4的处于“taken模式”。

双模/2级预测器。双模预测器和二电平预测器是现代处理器中的两个主要分支方向预测器。双峰预测器利用了分支方向结果与该分支的先前历史有关的观察结果;而2级预测器[YP91]认为结果也受到其他最近分支的跳跃历史的影响。

当一个分支首次出现时,BPU通常选择双峰预测器来预测该分支可能的执行方向[ERAG+18]。然而,如果该预测器多次出错,则BPU将选择2级预测器以实现高性能。BPU中的选择器表(如图1所示)可以根据之前的历史确定哪个预测器可能对即将到来的分支表现更好。

尽管双峰和二级预测因子[YP91]都依赖于PHT表进行预测,但它们的PHT索引算法不同。双峰预测器在索引时仅考虑目标分支的地址;而2级预测器在索引条目[LMB+,H+18]时同时考虑目标分支的地址和记录在分支历史缓冲器(BHB)中的最近分支历史。此外,它们的预测精度也不同。由于2级预测器利用了更多的分支信息,因此在许多情况下,其预测结果可以比双峰预测器的预测结果更有信心。

SGX

Intel SGX[C16]是一种基于硬件的TEE的实现,由现代Intel CPU(自Skylake以来)支持。为了在硬件中加强物理内存隔离,SGX引入了一组新的CPU指令,可用于创建和管理隔离的软件组件[MAB+13],称为飞地。飞地中的数据不能被运行在非飞地环境中的不受信任的软件访问(即,特权像操作系统和系统管理程序这样的软件)。然而,由于SGX飞地可以通过SGX指令集生活在传统进程的虚拟地址空间中,因此这些飞地能够容易地访问非飞地进程的存储器区域

非飞地代码和飞地代码交互。只能通过几个预定义的入口点进入或退出飞地。EENTER和EEXIT指令在不可信软件和飞地之间传输控制。当发生中断或异常时,处理器执行异步飞地退出(AEX),将中断飞地的寄存器保存到称为状态保存区(SSA)的飞地存储器中,清除CPU寄存器,并将控制权转移到飞地外的预先指定的指令。在处理中断或异常之后,执行ERESUME指令,该指令从SSA帧中重新加载先前保存的上下文,并继续在飞地中执行。

威胁模型

我们假设标准的SGX威胁模型,在该模型中,攻击者可以完全控制特权软件,如操作系统。

首先,我们假设攻击者可以访问目标飞地程序的源代码和/或二进制代码。通过分析这些资源,攻击者可以获得飞地的详细行为,特别是该飞地的控制流和分支的跳转信息(即源地址和目的地址)。带有模糊代码的程序(例如,来自远程服务器的代码)不在我们的攻击范围内。

其次,我们假设攻击者和受害者程序共同驻留在同一物理核心上。这是因为BPU在逻辑核心级别是共享的,但在物理核心级别是分离的。通过使用螺纹结合技术[EPAG16,LSG+17],可以很容易地强制这种共同居住。

第三,攻击者能够测量自己分支的预测错误信息。性能监视计数器(PMC)[LSG+17]和rdtscpinstruction[ERG+18,LSG+17]都可用于此测量。

第四,攻击者可以在飞地中的目标分支执行之前中断飞地,确保在执行目标分支之前不采取其他跳转操作。这种能力使攻击者能够构建与飞地相同的最近分支历史,并控制飞地的执行速度。尽管在中断普通用户级进程时很难实现这一目标,但在中断飞地时可以完美实现,因为攻击者可以利用操作系统对硬件定时器设备的控制[VBPS17]。

BlueThunder攻击

概述

Bluethunder攻击旨在通过操纵BPU中的2级方向预测器来获得飞地程序的细粒度控制流。为了实现这一目标,攻击者应该能够激活2级预测器,并滥用该预测器在飞地中泄露机密。一般来说,蓝雷攻击由以下两个阶段组成(如图3所示):
图3

第1阶段:激活2级预测器。我们通过对2级预测器以外的预测器施加几个错误预测来强制关闭它们,确保2级预存器最终被激活并由目标核心上的进程使用。按照TBDV-Q中描述的方向执行目标分支(目标分支用于静止的方向矢量,第4.2节)方向矢量会误导BPU,使其很容易做出错误预测。此准备阶段在攻击期间仅执行一次。

第二阶段:泄密。这个阶段包括两个步骤:构造碰撞和滥用碰撞。首先,在受害者(即在飞地环境中)和攻击者(即在非飞地环境下)进程之间建立hash冲突,hash冲突是由通过相同PHT条目预测不同分支引起的。我们提出了一种简单的方法来构造给定的分支历史,然后提出了一个高级方法来恢复包围区中断的分支历史。这种先进的方法还可以降低我们进攻的训练成本,因为历史训练只需要93个跳跃指令。其次,攻击者通过用TBDV-a(用于攻击的目标分支方向向量,第4.3节)向量执行目标分支来探测冲突条目的状态变化。通过分析这些探测结果,攻击者可以推断出目标飞地程序的控制流程以及其中的秘密。在攻击过程中,每次检测都必须执行这个攻击阶段。

激活2级预测器

在本节中,我们将描述如何激活BPU中的2级预测器,这是我们针对SGX的Bluethunder攻击的第一步。我们将在第4.3节中介绍滥用该预测因子进行攻击的方法。

我们的激活方法基于以下观察:只有当双峰预测器不能很好地预测时,BPU才会选择2级预测器进行预测。因此,通过对双峰预测器施加几个错误预测来关闭该预测器是可行的。我们构造了一个关闭双峰预测器所需的有效指令序列,并用一个包裹在循环中的条件分支正确地训练2级预测器。该条件分支的执行方向(即,是否采取该分支)由TBDV-Q方向向量确定如下。

TBDV载体。“目标分支方向矢量(TBDV)”是用于形成TBDV-Q矢量的基本矢量。该TBDV矢量的功能是误传双峰预测器。由于双模预测器使用2位饱和计数器预测[ERAG+18],任何与该模式不匹配的方向矢量都可能导致目标分支的预测错误。TBDV被生成为具有随机化0/1位的L位(0<L<100)矢量,其中0表示不取,1表示取。

TBDV-Q矢量。TBDV-Q矢量被设计为错误训练双峰预测器以及训练2级预测器。它只是将TBDV重复N次。

为了验证TBDV-Q矢量是否能够关闭双峰预测器并激活2级预测器,我们检查TBDV-Q中最后一个TBDV的预测结果(例如,使用PMC或定时信息)。如果最后一个TBDV的所有方向都被正确预测,我们得出结论,BPU已经成功地学习了这个TBDV的模式。我们确保双峰预测器不能通过设置大的L和随机化的0/1位来实现这一点,然后我们可以得出结论,2级预测器已经被选择和训练。否则,我们无法推断BPU正在使用哪个方向预测器
图4
剩下的任务是找到L和N的正确设置。首先,我们想计算L(0<L<100)的值,这样TBDV可以错误地预测双峰预测器,但可以通过2级预测器很好地预测。应该注意的是,L不能太小(不能错误地训练双峰预测器)也不能太大(不能适应2级预测器所使用的PHT的大小)。我们使用了N的固定值(即,16、32和64),这些值足够大,可以训练2级预测器,并且可以用于检测双峰预测器是否被禁用。值得注意的是,N的值不限于16的倍数。我们测试了500个案例的每个长度,每个案例重复3次测试。3个重复测试中的任何成功都证明该TBDV-Q能够激活2级预测器。结果如图4所示。可以看出,当长度L小于或等于22时,BPU几乎总是成功地预测目标分支,这意味着2级预测器被激活。同样值得注意的是,当L等于33、49、65、81或97(即,它们之间的距离是16的倍数)时,预测会失败很多。我们推测这与PHT表的结构有关。由于这不会影响我们的攻击,我们计划在未来进行另一项研究来解释这种影响。
图5

为了降低N的值,我们通过运行具有不同N的TBDV Qs来进行另一个实验。所有测试的TBDV Q都是用TBDV“111000”生成的,因为这个TBDV最终将用于我们的攻击。在这个实验中,我们对每个N测试500个案例,并记录每个N的成功率。结果如图5所示。我们发现,通过执行最多包含7个TBDV片段的TBDV-Q向量,可以激活和训练2级预测器。

在以下章节中,如果没有明确说明,则选择L=6和N=7的TBDV-Q矢量(即重复TBDV“TTTNNN”7次的矢量)来激活2级预测器。

泄密

在激活2级预测器之后,我们将操作该预测器以进行侧信道攻击。我们首先描述了在飞地进程(即受害者进程)和非飞地进程(即攻击者进程)之间构造入口冲突的方法,然后转而滥用这些冲突。为了简单起见,我们让攻击者进程和受害者进程在同一物理核心中的两个超线程上运行。然而,由于PHT状态在上下文切换期间不被刷新,如果不支持超线程并且两个进程在同一物理核心上运行,则也可以使用类似的技术【我们在可用的平台上确认了Bluethunder,并在撰写本文时提供了最新的微码补丁】。

构造碰撞

2级预测器的主要组成部分是PHT表,该表具有多个记录条目。为了构建入口冲突,我们假设两级预测器通常在相同的上下文中进行相同的预测。换句话说,在这种情况下使用相同的PHT条目。如果上下文可以恢复,则即使条目索引功能是不透明的,也可以访问其相对PHT条目。根据Ben Lee等人[LMB+],分支历史和分支目标的地址是影响上下文的两个主要因素。因此,这两个因素对PHT索引产生了影响

为了验证2级预测器的条目索引是否仅受[LMB+]中描述的两个元素的影响,我们进行了另一个实验。在这个实验中,受害者和攻击者线程运行相同的代码。该代码包含几个被称为训练序列的分支,以及在它们之后的一个被称为目标分支的分支。训练序列用于固定逻辑核的分支历史,而目标分支用于激活2级预测器并操纵目标2级预预测器条目。请注意,训练序列中的分支数量应该足以修复分支历史。目标分支的执行可以分为两部分:激活部分用于激活2级预测器;滥用部分是测试二级预测器的hash冲突是否已经成功构建。我们首先单独运行攻击过程,记录攻击者对滥用部分的预测失误结果。然后,我们在超线程内核上同时运行受害者和攻击者程序,并记录攻击者在测试过程中对滥用部分的错误预测结果。我们使用信号量来强制两个进程精确地依次执行每个分支。通过比较两个测试的预测失误结果,我们可以推断哈希冲突是否已经成功构建。
表1

攻击者对两次测试的预测失误结果如表1所示。如果攻击者进程单独运行,那么11个预测中只有4个是不正确的。当攻击者与受害者一起运行时,会发生9次预测失误。这种差异表明,攻击者分支操作的预测可能会受到受害者的影响。我们重复这个测试几次,结果总是一样的。

我们还减少了训练序列中采取的分支的数量,检测修复分支历史所需的最小数量。结果表明,93个已采取的分支足以确保分支历史是固定的。为了检查未执行分支的效果,我们在攻击者的代码中添加了几个未执行分支,在受害者的代码中增加了nop指令,以保持两个程序之间分支地址的不变性。结果表明,无论添加了多少未获取的分支或它们在哪里,条目冲突仍然存在。总之,未采取的分支对2级预测器的条目索引没有影响

基于以上实验,我们得出结论,如果两个进程之间的分支历史和目标分支的地址都相同,那么这些进程将共享相同的2级预测器条目。然而,尽管推断目标分支的地址很容易,但恢复受害者进程的分支历史记录相当复杂,因为它的值在不同的上下文中不同。攻击者恢复受害者分支历史的一个简单方法是执行相同的分支(或跳转)指令流,其地址与受害者程序中的地址完全相同。然而,由于最近的分支历史在不同的上下文中发生变化,因此飞地区每次可以使用不同的预测器条目来预测目标分支。因此,攻击者需要赶上受害者飞地的执行,并在攻击过程中监控正确的预测器条目,这在现实世界的攻击中很难实现。为了解决这个困难,我们向飞地发送中断,以便修复飞地核心的分支历史。这是因为当在飞地执行期间出现中断时,该飞地将被挂起,并将执行内核中定义的几个中断处理操作。我们观察到,这些处理操作(例如,恢复飞地)通常将目标核心的分支历史形成固定状态。这是因为最后的操作总是关于中断恢复,这对于任何APIC中断都是一样的。由于最后的操作中包含了足够多的跳转操作,因此它们可以强制分支历史达到固定状态。因此,这些操作可以作为我们攻击的训练序列。同时,由于飞地为中断处理执行的一些代码对我们来说是秘密的(例如,叶函数ERESUME),我们无法通过简单地复制目标代码来恢复中断历史。相反,我们转而检测最近英特尔处理器的分支历史更新算法,并演示了一种在飞地中断后恢复分支历史的高级方法。

恢复分支历史记录。在最近的英特尔处理器中,目标分支地址和最近的分支历史记录都用于索引PHT条目。据观察,在Intel Haswell处理器中,预测方案使用全局分支历史缓冲区,该缓冲区包含关于最后K个(对于Haswell,K=28)分支[H+18,KHF+19]的信息。作者发现,历史缓冲器的每次更新可能会将历史缓冲器移位2位,并且使用目的地址的最后2位以及最近分支的源地址的位0x40和0x80来计算新历史缓冲器的最低有效2位。在本节中,我们试图了解Skylake和CoffeeLake处理器测试台上的分支历史更新算法,并展示如何在中断后恢复飞地的分支历史。

根据最近的研究[H+18,KHF+19],我们观察到分支历史更新可以通过操纵最新分支目的地的最后两位来控制地址。为了测试这一观察结果是否也适用于Skylake和CoffeeLake处理器,我们根据之前的结论进行了以下测试,即93次跳跃足以构建给定的分支历史。我们在这个测试中创建了两个进程,即攻击者和受害者。在受害者的代码中,我们添加了93个跳转和一个目标分支。我们还在攻击者的代码中添加了93个分支和一个目标分支,但只有最后92个跳跃和目标分支与受害者的相同。我们改变了攻击者代码中添加的第一条跳转指令的跳转目的地,同时修复了该跳转的源地址。通过检查这两个进程是否会相互影响,我们可以推断发生了入口冲突。由于两个进程中的两个目标分支的地址相同,我们可以推断出两个进程的分支历史是相同的。测试结果表明,只有当第一个跳转目的地的最后两个比特是固定值(例如01)时,才会发生条目冲突。这一结果意味着,在Skylake或CoffeeLake处理器中,只有跳转目标地址的最后两位足以表示该跳转对分支历史的影响。
图6

我们利用这个结果来恢复中断后飞地的分支历史(如图6所示)。此恢复包括两个步骤:首先,我们在攻击者的代码中添加93条跳转指令,称为恢复的跳转。这些跳转的源地址在插入时是固定的,而它们的目标地址可以更改。我们还添加了93条跳转指令,称为测试跳转(T_Jmp),以及受害者代码和攻击者代码中的目标分支。请注意,每个受害者的T_Jmp指令(或目标分支)的源地址和目标地址应与攻击者代码中相应指令的源地址相同。现在,两个目标分支共享用于预测的相同的2级预测器条目,因为添加的93个分支可以刷新最近的分支历史并将两个进程的分支历史设置为相同。然后,我们删除两个进程中的最后一条(即第93条)T_Jmp指令,并更改R_Jmp序列中最后一条恢复跳转(R_Jmp)指令的目的地。通过检查是否已建立入口冲突,我们可以推断两个进程的分支历史何时相同。根据以上得出的结论,四次就足以恢复攻击者程序中的最后一条R_Jmp指令。接下来,我们删除两个进程中的倒数第二条(即第92条)T_Jmp指令,并通过再次检查来恢复倒数第二个(即第九十二条)R_Jmp指令的跳转目的地。我们总共重复了93次这个步骤,最后可以重建飞地中断后的分支历史。图6显示了当最后两条(即第92条和第93条)R_Jmp指令已经恢复时的恢复细节。

滥用冲突

通过构造条目冲突,攻击者能够访问2级预测器中的目标条目。现在我们试图滥用这个入口来进行蓝雷攻击。我们从检测2级预测器条目的内部工作逻辑开始。然后,我们试图利用这一逻辑发起侧通道攻击。

检测2级预测器逻辑。尽管已经发现2电平预测器中的主要组件是具有几个n位饱和计数器[ERAG+18]的PHT,但n的值仍然未知。为了检测n的值,我们单独执行一个攻击者进程,该进程包含93个训练分支和一个目标分支。我们使用的TBDV是“111··1000···0”,它有L1位0和L1位1。在该测试中,L1被设置为6。我们将该TBDV重复100次,并为目标分支生成最终的TBDV-Q。我们注意到,这个TBDV-Q矢量可以用于使双峰预测器静止并激活2级预测器。通过用这个向量执行目标分支,并检查目标分支的预测错误结果,我们可以推断出n的确切值。
表2

测试结果如表2所示。在使用已采取(或未采取)方向执行目标分支4次之后,可以训练2级预测器。换句话说,最多可以有4个连续的预测失误。对于训练PHT条目为n位饱和计数器的2级预测器的最坏情况,在使用相同PHT条目时出现 2 n − 1 2^{n-1} 2n1次预测失误后,可以训练预测器。因此,我们得出结论,n是3。换句话说,3位饱和计数器由2电平分支预测器使用。

为了验证这一结论在SMT中也有效,我们对两个进程(即攻击者和受害者)重复这一测试,这一次在兄弟核心上运行,而不是单独运行一个进程(例如攻击者)。通过执行相同的代码,这两个过程指向相同的2级预测器条目。我们利用信号量迫使它们一个接一个地执行目标分支。当攻击者(或受害者)进程以未采取的方向执行目标分支时,该饱和计数器的值减少1;否则,其值将增加1。表3列出了每个攻击者(或受害者)执行后的饱和计数器值。该测试结果表明,两个目标分支的执行方向可以相互影响,并且行为符合3位饱和计数器的FSM。例如,在执行第i个分支之前,3位饱和计数器的值为7(“采用模式”),并采用其预测结果。当受害者的第i个未获取目标分支到来时,发生预测错误,饱和计数器的值被更新为6。然后轮到攻击者进程了。攻击者还使用未执行的方向执行目标分支。由于计数器的当前值为6(也称为“采取模式”),因此会发生另一次预测错误,饱和计数器的值将更新为5。

操纵2级预测器。如果用于预测的相对饱和计数器达到临界值,则预测器实现用于预测分支的平衡状态。在更新到临界值之后,饱和计数器的变化可以引起对分支方向的不同预测。 2 n − 1 − 1 2^{n−1}-1 2n11 2 n − 1 2^{n−1} 2n1都是n位饱和计数器的临界值。以3位饱和计数器为例,假设其当前值为3,这是一个临界值。如果采取的分支将该计数器用于预测,则计数器被更新为4,指示用于预测的采取模式;否则,如果未采取分支使用该计数器,则计数器变为2,停留在预测的未采取模式。通过监视预测的变化,可以检测分支行为。

为了将饱和计数器设置为临界值,我们动态调整目标分支的分支方向。下一个分支方向设置为与预测方向相反。例如,如果相对2级PHT条目使用饱和计数器来给出采取模式预测,则攻击者将目标分支的方向设置为不采取,从而导致饱和计数器的减小;否则,如果饱和计数器当前给出未采取的预测,则攻击者会设置要采取的目标分支的方向,从而导致饱和计数器的增加。我们将攻击者执行的这个方向向量称为“用于攻击的目标分支方向向量(TBDV-A)”。
表4

如果不执行受害者程序,攻击者执行的TBDV-A最终应达到稳定状态,并以基本序列“TTTNNN”重复。对这一现象的解释见表4。我们假设在执行目标分支i−1次后,3位饱和计数器的二进制值为101(“采取模式”)。当第i个未执行的分支到来时,此计数器将做出错误预测,并且其值减小1。发现预测器在预测未执行分支时预测错误,攻击者了解到目标PHT条目现在处于“执行模式”,并决定下次运行未执行分支。在重复(i+5)次之后,相对饱和计数器的值再次变为101。结果,又开始了一圈。
表5

但是,如果攻击者进程与受害者进程一起运行,则这种稳定状态将被破坏。这是因为两个程序共享相同的2级PHT条目,并且受害者的目标分支的执行对攻击者程序的执行有影响。攻击者执行路径中与“TTTNNN”不匹配的任何不规则序列都可能是受害者进程造成的。通过分析这些不规则序列,攻击者最终可以推断出受害者进程的细粒度控制流。可能的不规则序列与受害者行为之间的关系如表5所示。如果检测到的执行序列中包含的“N”的数量大于“T”的数量,则受害者进程执行具有所取方向的目标分支;如果检测到的执行序列中包含的“N”的数量小于“T”的数量,则受害者应以未采取的方向执行目标分支。例如,如果攻击者的目标分支的执行方向序列是“TTTNNNN”,则我们得出结论,受害者的执行方向是“T”。这是因为攻击者需要再次降低饱和计数器的值,以抵消受害者对此计数器的影响。

预测失误测量。测量分支的预测错误信息对于进行基于BPU的侧信道攻击是必要的。一种常见的方法是读取PMC,这也适用于Bluethunder。尽管PMC提供了硬件事件的准确信息,但它要求用户具有系统级权限,这限制了它的使用。因此,我们还尝试了一种利用时间戳计数器(TSC)的替代测量方法。通过跟踪执行分支的周期数,攻击者可以推断分支是否被错误预测,从而推断目标2级预测器条目的当前状态。我们使用rdtscp指令来获取时间戳。此外,在rdtscp指令之前和之后添加了两个mfence指令,避免了加载和存储操作的无序执行。请注意,在Bluethunder攻击中,这种基于TSC的测量中由缓存机制引起的时间延迟是可以忽略的。这是因为被测量的指令经常被使用,并且它们很可能被缓存。
表6

与其他侧通道的比较。我们还将Bluethunder攻击与其他SGX攻击进行了比较,结果如表6所示。值得注意的是,由于受害者飞地和攻击者之间不存在共享内存,因此不能使用“Flush+Road”[YF14]和“Flush+Flush”[GMWM16]。根据表6,Bluethunder能够恢复指令级信息,其空间分辨率远高于页面级[GRBG18]或缓存级攻击[OST06,MWES19]。此外,由于Bluethunder不需要缓存驱逐[OST06]或执行大量跳跃指令来训练[ERAG+18],因此其可检测性较低。就时间分辨率而言,Bluethunder由于其训练开销极低而具有高精度。同时,我们注意到Bluethunder和PORTSMASH都具有高的时间分辨率和低的可检测性,PORTSMASH甚至可以实现比Blue雷电更高的空间分辨率。然而,由于Bluethunder滥用完全不同的处理器组件,它可以绕过大多数防御技术,如禁用SMT或防止端口争用,这些技术可用于防御PORTSMASH攻击

BlueThunder 部署

我们实现了基于SGX步骤[VBPS17]的Bluethunder攻击,这是一个针对具有单步中断执行控制的飞地程序的攻击框架。由于SGX步骤能够中断飞度中的每条指令,APIC中断处理操作就在每条指令之前执行。因此,每条指令之前的最近分支历史应该是相同的,并且通常选择相同的2级预测器条目来预测相同的目标分支。通过监视受受害者目标分支影响的条目,攻击者可以推断出受害者进程的控制流以及其中的秘密。

为了训练攻击者的分支历史与中断处理操作相同,我们使用第4.3.1节中描述的方法在攻击者的代码中构造了一个训练分支序列。已经证实,通过使用生成的序列,可以成功地建立哈希冲突。基于两个进程的分支历史和目标地址都相同的事实,攻击者可以与受害者共享相同的2级预测器条目(如图7所示)。请注意,此培训序列中只需要93条说明。考虑到Branchscope[ERAG+18]在每次检测之前需要执行100000个分支来训练BPU,Bluethunder的训练成本可以忽略不计。

在飞地内运行的受害者程序的整个执行周期为由攻击者监视。我们依靠一个名为testp3的开源工具来衡量是否发生了预测失误。为了识别受害者的目标分支何时被中断,Blue雷电记录了飞地中被中断的每条指令的地址。该地址信息可以由SGX步骤提供。只能考虑地址等于目标分支地址的指令。

rdtscp测量也在该测试中实现。为了提高准确性,我们在攻击者的代码中添加了一个阈值决定逻辑,它可以根据处理器的当前状态动态决定预测和预测失误之间的时间阈值。为了进一步降低测量中的噪声,我们还通过分别记录进入和离开飞地的时间来确定攻击窗口由于一条指令的中断处理所花费的时间比在飞地区中执行一条指令所花费的要长得多,因此监控攻击窗口内的执行时间可以显著减少噪声量

评估

我们在B360-HD3主板上执行了Bluethunder攻击,该主板使用CoffeeLake i7-8700处理器和32GB DDR4-2400内存。该平台运行Ubuntu 16.04,通用64位Linux 4.15.0内核,配备SGX Driver 2.0。我们使用taskset命令将受害者和攻击者进程绑定到特定的核心,使用isolcpus命令将这些核心与操作系统调度的某些请求隔离开来。我们展示了当攻击者进程和受害者进程在同一物理核心上的两个超线程上运行时的两种攻击情况,首先是针对vfprintf函数(第6.1节),然后是针对mbed TLS库的RSA实现(第6.2节)。我们还展示了在不支持超线程时针对RSA算法的结果(第6.3节)。

攻击Vfprintf函数

为了演示Bluethunder如何在飞地内揭示指令级机密信息,我们重点讨论了受控通道攻击和基于缓存的攻击都无法理想地提取机密信息的示例。具体来说,我们选择SGX SDK中定义的vfprintf函数作为我们的目标,其函数是在飞地中打印格式字符串。此函数使用switch-case语句来解释字符串格式,攻击者可以利用该格式。但是,由于此switchcase语句中的几个控制流位于单个页面甚至单个缓存行内受控通道攻击和基于缓存的攻击无法推断出vfprintf函数中的细粒度格式字符串信息
图8

与上述攻击相比,Bluethunder可以通过检查vfprintf函数中的switch-case语句来公开格式字符串信息。我们将字符串格式设置为“%llx”,并重复此打印操作100000次。使用CoffeeLake处理器进行的实验的平均错误率如图8所示。随着攻击者检测次数的增加,我们的攻击延迟线性增加,攻击的准确性也得到了提高。当检测次数为6次时,需要17610个时间戳来恢复受害者的一位秘密,错误率为0.83%。由于这个错误率是我们实验中最小的错误率,我们最终选择6次作为我们攻击的检测次数。值得注意的是,本测试未考虑SGX Step框架造成的时间延迟。这是因为Bluethunder独立于SGX步骤,并且通过使用其他中断技术,可以显著减少这种额外的开销。

我们还用rdtscp测量来测试Bluethunder。为了分析预测和预测失误的阈值,我们在CoffeeLake处理器上执行20000个样本分支(分别为10000个预测分支和10000个预测失误分支)。结果表明,当目标分支预测错误时,目标分支平均需要31个周期;否则,目标分支平均需要25个周期。通过仔细配置预测和预测失误之间的阈值,攻击者能够在一次测试中恢复87.93%的比特。

攻击RSA算法

我们还针对mbed TLS Library推出了Bluethunder,这是在基于SGX的环境[LSG+17、SLK+17和SLKP17]中进行加密和解密操作的流行选择。已经表明,在该库中实现的RSA算法容易受到控制流攻击[LSG+17]。与攻击相关的核心函数名为mbedtls_mpi_exp_md(如附录A所示),用于利用滑动窗口求幂算法进行模幂计算。此函数有两个条件分支,它们的执行方向直接受私钥的影响。通过检测这两个分支的执行方向,攻击者能够揭开目标进程的控制流,从而揭开受害者的私钥。

我们的攻击目标是RSA-2048算法中的解密操作。飞地直接调用mbed-TLS库中定义的RSA解密函数,并使用mbed-TLS生成的随机密钥对。攻击者的目标是恢复受害者(即飞地程序)使用的RSA私钥。我们在受害者之前启动攻击者程序,为攻击者提供足够的时间来激活2级预测器并初始化目标条目的值。
图9

结果表明,中断在我们的攻击中被精确地执行,核心函数mbedtls_mpi_exp_md执行大约140分钟。对于每条指令,恢复飞地并在飞地中执行此指令需要近11810个周期,而在非飞地环境中处理传入中断需要600万个周期。图9展示了攻击者目标分支的执行方向,这些方向受私钥的十位(341-350)的影响。为了使该图更加清晰,我们只显示了受飞地执行影响的攻击者的执行方向。以341位为例。三个红色点表示攻击者的执行方向为“TTT”,四个蓝色点表示攻击者执行方向为为“NNNN”。根据表5中的情况3,我们可以很容易地得出结论,现在受害者的执行方向是“T”(即,采取),私钥的位341是“1”。图9显示了受害者执行的目标分支方向向量为“1011111100”。值得注意的是,由于每个比特的恢复独立于其他比特,因此一个比特的错误不会影响后续比特的恢复。借助后处理分析脚本,我们可以通过检查和分析攻击者在攻击过程中目标分支的执行向量,可靠地恢复完整的2048位RSA私钥。
图10
表7

除了使用PMC,我们还尝试使用TSC进行测量。两种测量方法的精度如图10所示。与PMC测量相比,使用TSC测量的攻击精度有所下降。此外,结果表明,检测时间与攻击精度之间存在很强的关系。当检测次数为5次时,蓝雷可以达到准确度分别为79.50%(PMC)和75.90%(TSC)。随着检测次数的增加,两种测量方法的误差率都有所下降。当重复次数为30时,其攻击准确率甚至达到98.7%(PMC)和85.9%(TSC)。然而,这是以更长的进攻时间为代价的。具有不同检测时间的两个测量值之间的比较如表7所示。结果表明,随着检测次数的增加,两种测量方法的时间成本也随之增加

不支持超线程时的Bluethunder评估

尽管Bluethunder可以在SMT环境中获得出色的性能,但这种攻击并不局限于此类场景。换句话说,Bluethunder也可以在非SMT环境中进行。这是因为PHT在上下文切换期间不会被刷新。因此,在同一逻辑核心上执行的攻击者进程可以检测到飞地进程对PHT的影响。为了验证这种非SMT Bluethunder攻击的有效性,我们用它来攻击RSA算法,并试图恢复RSA私钥。结果表明,尽管这种非SMT攻击比SMT攻击花费的时间要长得多,但其准确率仍然很高,单次可以达到83.73%。

与Branchscope的比较

表8

我们还通过分别使用这两种攻击来恢复相同的10000位密钥,将Bluethunder与Branchscope[ERG+18]进行了比较。由于Branchscope不依赖于中断飞地,因此我们没有使用SGX步骤。相反,我们假设飞地可以赶上攻击者,并且我们只记录Branchscope可以达到的最快速度。表8给出了Bluethunder攻击和Branchscope攻击的比较。它们都是基于PHT的侧信道,同时使用BPU的不同组件进行攻击。结果表明,在Bluethunder中每次检测之前,训练预测器需要18532个周期,这是Branchscope的1.9%(即956304个周期)。换句话说,蓝雷的速度大约是Branchscope的52倍。此外,Bluethunder的精度与Branchscope的精度相似。

限制与未来的工作

局限性Blue雷电有以下限制:(1)由于Blue雷电依赖于中断飞地,一些中断审计缓解技术,例如T-SGX[SLKP17]可能检测到我们的攻击。在使用这些保护方法部署的机器中,攻击者在一段时间内只能强制执行有限数量的中断,这可能会减缓我们的攻击。(2)尽管大多数时候,攻击者的执行方向序列遵循“TTTNNN”模式,但有时它会匹配其他模式(如“TTNN”)。然而,可以通过重复实验来产生期望的输出。

未来工作。由于执行的分支会更新分支历史记录,因此可以使用当前分支历史的状态来准确地揭示受害者的控制流。该分支历史可以通过监视几个2级预测器条目的状态变化来推断。这是因为分支历史是用于索引2级预测器的元素之一,并且不同的分支历史导致不同2级预预测器条目的状态更新。通过测量可能的条目的状态变化并分析哪个条目已经更新,攻击者最终可以推断出受害者程序的控制流,从而推断出秘密。因为在这次攻击中可以同时检测到更多的预测器条目,所以它可以实现比当前Bluethunder更高的速度。

防御

软件缓解措施。一种基于软件的对抗Bluethunder的方法是删除目标飞地程序中的条件分支。Choi等人[CKGN01]提出了一种称为“if转换”的技术,该技术能够使用CMOV等条件指令来替换条件分支。由于飞地程序中的条件分支被删除,我们的攻击就不能再进行了。然而,这种方法通常是特定于算法的,将其应用于一般应用是具有挑战性的

一个更实际的对策是审计[GYCH18],它不需要更改处理器设计。该方法的主要思想是分析正在运行的进程的异常行为。由于Bluethunder攻击会向目标系统引入大量预测失误,因此通过监控目标系统中的预测失误数量,可以检测到这些攻击。此外,最近的两项工作T-SGX[SLKP17]和DéjaÉVu[CZRZ17]提出,检测受害者飞地的频繁中断也可以检测侧信道攻击。由于Bluethunder依赖于频繁中断飞地来构建PHT进入冲突,因此这两种方法对于防御我们的攻击也很有价值。然而,对于这两种检测方法,选择用于区分良性程序和不良程序的阈值是困难的这是因为许多良性程序可能会导致大量预测失误或中断,就像Bluethunder一样

硬件缓解措施。为了防止Bluethunder,一种方法是随机化PHT索引逻辑。Bluethunder的根本原因是飞地进程和非飞地进程之间的2级预测器入口冲突。为了让攻击者更难构建条目冲突,我们可以随机更改PHT索引逻辑,就像随机化缓存映射一样[WL07]。考虑到如果我们只随机化一次,攻击者可能会发现随机化索引逻辑,可以使用周期性随机化。该解决方案可以保持PHT的高使用率,因为PHT条目仍然在包围区和非包围区进程之间共享。然而,如果我们多次随机化索引算法,以便记录分支与其PHT条目之间的当前索引关系,则可能需要额外的硬件组件(如缓冲器)

另一个解决方案是防止预测敏感分支。一个简单的方法是禁用分支预测。但是,这可能会对处理器的性能造成严重影响。Branchscope[ERAG+18]提出了一种优化方法软件开发人员标记与敏感信息相关的分支。当执行这些标记的指令时,CPU将避免预测它们。这种方法可以保护受害进程不受侧通道攻击,并且与禁用BPU相比,可以减少性能开销。然而,此解决方案无法抵御隐蔽通道攻击

还存在其他可能的硬件缓解措施。例如,我们可以将BPU逻辑加倍,一个用于飞地进程,另一个用于非飞地进程。然而,这种缓解措施需要更复杂的BPU设计,并增加了制造处理器的成本。每当上下文切换到包围区模式或从包围区模式切换时,另一种解决方案可以刷新PHT状态,但这种缓解可能会延长BPU的训练时间,尤其是当上下文切换频繁发生时。

相关工作

SGX侧信道。研究人员表明,Intel SGX易受控制通道攻击[VBWK+17,XCP15]、基于缓存的攻击[BMD+17,GESM17,HCP17,SWG+17]和基于BPU的攻击[LSG+17,ERAG+18,CCX+19]。(1)根据Oleksi-Oleksenko等人[OTK+18],基于页表的攻击可分为两类:基于页故障的[XCP15,SCNS16]和基于页位的[WCP+17,VBWK+17]。Xu等人[XCP15]和Shinde等人[SCNS16]演示了SGX上的页面故障侧信道攻击,该攻击通过将包围区页面标记为不存在来在页面大小粒度的包围区内泄漏机密。之后,研究人员发现,这些针对SGX的受控信道攻击也可以在没有页面错误的情况下进行。王等人[WCP+17]和Jo-Van-Bulcket等人[VBWK+17]通过观察页面表的访问位和脏位,成功地进行了页面位攻击并泄露了飞地的秘密。(2)种基于缓存的攻击[WCP+17、GESM17、BMD+17、SWG+17]也被用来进行高分辨率SGX攻击。通过使用“Prime+Probe”方法[OST06],这些攻击能够了解飞地访问哪些内存位置,并以细粒度提取飞地的秘密。(3)针对SGX的基于BPU的攻击可以通过两种方式进行。一种方法是利用BPU做出的推测性预测结果。例如,SgSpectre[CCX+19]在SGX环境中利用了著名的Spectre漏洞[KHF+19],破坏了SGX飞地的机密性和完整性。攻击飞地的另一种方法是利用BPU的当前状态。例如,Lee等人[LSG+17]进行了一种名为“分支阴影”的攻击,该攻击通过滥用飞地和非飞地之间的BTB入口冲突来推断飞地的细粒度控制流。另一个例子是Branchscope[ERAG+18],它通过滥用BPU中的双峰预测器来泄露目标程序中的敏感数据,BPU的核心组件是2位饱和计数器。然而,Branchscope有一个限制,它需要近100000个分支在攻击期间的每次检测之前初始化BPU状态,这大大降低了攻击速度。Branchscope与我们的攻击密切相关。不同的是,我们对攻击进行了反向工程并滥用了两级定向预测器,这是BPU中完全不同的预测组件。

微体系结构侧通道。自Lampson[Lam73]于1973年首次提到微架构侧信道攻击以来,已经对其进行了几十年的研究。通常,微体系结构侧通道利用处理器中的共享资源,如缓存[DKPT17、Per05、GMWM16、IES15、GBK11、KAGPJ16、LYG+15、OST06、YF14、ZJRR12]、分支预测单元[ERAG+18、KHF+19、MR18、LSG+17、EPAG16、CCX+19]、无序执行[VBMW+18、LSG+15]和浮点单元[KS17]来执行特定攻击。一些攻击已经通过侧通道实现,例如执行密钥记录[GSM15]、泄露私钥[VBWK+17、YF14、BB05、AS08、KAGPJ16、LYG+15]、推断敏感用户数据[ZWB+18]和破坏TLS的加密[IIES15]。Ge等人[GYCH18]对这些微架构定时侧信道攻击进行了出色的调查。

结论

在本文中,我们提出了一种针对SGX的新的基于PHT的攻击,名为Bluethunder,它利用2级方向预测器作为侧信道。通过利用预测器中的哈希冲突,这种攻击可以精确地识别包围区内的细粒度(即指令级)控制流。我们实现了Bluethunder,并在两个案例研究中评估了这种攻击:攻击Intel SGX SDK中的vfprintf函数和mbed TLS中的RSA解密算法。这两次攻击都表明,尽管使用了几种防御技术,但蓝雷攻击确实很实用,对SGX构成了严重威胁。特别是,我们的实现能够在一次运行中以96.76%的准确率导出RSA私钥,其速度比最新的基于PHT的侧信道攻击(Branchscope)高出52倍。我们强调,需要采取基于硬件的对策来对抗Bluethunder攻击(即,在飞地模式切换期间刷新PHT),以防止对Blue雷电的大规模利用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

粥粥粥少女的拧发条鸟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值