论文《The Evolution of Transient-Execution Attacks》的总结,针对近些年比较热门的瞬态执行攻击,尤其是Spectre、Meltdown、LVI进行概述,提出一个总体的框架,所有的瞬态执行攻击都包含6个阶段。当然,该团队还有一篇针对瞬态执行攻击的防御论文,针对这6个阶段,争取破坏其中一个环节,就可以达到防御效果。防御论文为《Evolution of Defenses against Transient-Execution Attacks》。
摘要
以往,研究人员有一个共识:处理器架构以下的信息是无法被观测到的。但是,缓存侧信道攻击的出现,表示微架构层次的部分数据可以被提取出来。
随之而来,出现了利用推测执行机制和乱序执行的攻击方法,我们称它为瞬态攻击,因为这些攻击都利用了一个事实:处理器执行了一些操作之后,再将其撤销,仿佛这些操作没有执行过。但是,这里的“撤销”并不干净,微架构层次下,攻击者可以获得这些操作曾经执行过的一些痕迹。
本文主要介绍瞬态执行攻击的发展历史,从系统的角度来分析这种攻击的过程,促进该类攻击的一些变种的发现。
1 引言
现代处理器,处于相同的架构,比如同一个定义好的interface,同一个指令集,方便同一个二进制程序能够在不同的处理器上运行。因此,处理器的制造者往往更关注,一个架构层次的行为,从底层的具体实现上如何优化,提高效率。这里介绍了两个优化机制:缓存、分支预测。
从安全角度来看,很长一段时间,处理器架构以下的信息是无法被观测到的,处理器没有提供给用户一个interface来查看某部分是否处于缓存。Kocher提出,通过测试内存访问的延迟,可以获取cache的部分信息,相当于实现一个interface,可以让攻击者看到一些微架构层次的信息。不过这里的信息,主要是某部分处于缓存,某部分不在缓存中,这些meta-information。当时出现了一些有力的 crytographic 和 non-cryptographic 攻击,因此,安全人员认为应该合理设计代码,是的secret不会影响这些 meta-information。比如, no secret-dependent memory accesses。
2018年,幽灵攻击和熔断攻击被提出来。当时,人们预计会发现更多的Spectre的变种,Meltdown则被认为是唯一的。
但是,Foreshadow的出现表明类似Meltdown的漏洞依然存在。它扩展了 user-to-kernel 类型的攻击方法,能够从任意物理地址泄露信息。某种意义上,它预示着该领域的进一步发展,目前发现了许多不同的熔断型攻击。
随着瞬态执行攻击方式的发展,相应的缓解措施也不断发展,在工业界得到了应用。
本文介绍了瞬态执行攻击的发展历程,使用 6 个通用的阶段来标准化这种攻击。从微架构的错误预测角度,描述幽灵攻击的所有已知变种。针对现有的熔断类型攻击,本文从系统角度强调了它们之间的相似点。我们认为,基于本文从系统角度得出的观点,未来将会出现很多新的瞬态攻击变种。
2 背景
2.1 推测执行和乱序执行
推测执行,就是对于暂时没法确定结果的branch,处理器猜测出一个值,先继续执行着
乱序执行,就是遇到异常之后,异常代码之后的代码可能已经执行过了。
2.2 缓存攻击
缓存攻击逐渐成为瞬态执行攻击的一个必备模块,它关注直接访问内存和访问缓存中数据的时间差异。目前出现的方法有很多,比如:Flush+Reload, Prime+Probe, Flush+Flush, Evict+Time。总体来说,< font color="#dd0000">缓存攻击都包含以下三个阶段:
- 攻击者将微架构初始化为一个预先定义好的状态。
- 攻击者诱使victim执行一个操作。
- 攻击者基于微架构状态的变化,推测出victim的行为信息。
隐蔽信道构建,是缓存攻击的一个特殊情形,sender 和 receiver 都由攻击者掌握,主要是为了绕过一些架构层次的限制。
2.3 Store-to-Load Forwarding
针对分支预测单元中的memory disambiguation predictor,进行攻击。
store buffer
该过程就是,将存储在 store buffer,并且还没有被写回缓存的数据,直接传递到使用相同地址的 load操作。针对load操作的地址,可能出现四种情形:
- True positive match
- True negative match
- False negative match。
- False positive match。
3 瞬态执行的概述
对于瞬态执行攻击过程的一般化,前人也有一些工作,本文在这里提出,< font color="#dd0000">瞬态执行攻击的 6 个 阶段:
-
攻击的准备阶段,包含两部分。
- 准备微架构,确保一个瞬态执行的窗口,保证瞬态执行的第一条指令到最后一条指令都有足够的时间
- 准备微架构传输通道,以便恢复数据
-
使用触发指令,触发瞬态执行。
- 幽灵攻击类型,可能是victim域内的任何分支
- 熔断攻击类型,可能是attacker域内任何形式的中止指令
- LVI攻击类型,可能是victim域内任何形式的中止指令
-
瞬态指令执行,准备微架构传输通道传输的数据
-
攻击者对先前准备的数据进行编码,比如存入缓存
-
CPU意识到错误,回退,执行正确的指令。
-
恢复数据,攻击者将编码数据从微架构级别提取到架构级别。由于数据通常编码在缓存中,攻击者使用缓存侧通道,如Flush+Reload,来执行此任务。
4 瞬态执行攻击
4.1 Spectre类型的攻击
Spectre类型的攻击,主要依赖于错误预测下的瞬态执行。也就是,CPU按照以往的行为,预测出一个错误的执行路径。CPU中负责预测的元件是,Branch Predict Unit(BPU),它包含多种预测器,分别用来预测不同类型的分支。Spectre类型的攻击,归根究底是利用gadget,攻击BPU器件的,并且因为攻击的具体预测器不同,可以分为不同类型。
- Pattern History Table(PHT),猜测一下直接分支的结果,比如 if(该不该跳转)
- Branch Target Buffer(BTB),猜测一下间接分支的target,(跳转到哪里)
- Return Stack Buffer(RSB),函数调用会在栈顶存放返回地址,加快跳转
- memory disambiguator--->store-to-load forward
- This predictor tries to predict whether a load operation overlaps with a previous store operation
Spectre-PHT.
pattern历史表,这种攻击通过不断地重复,对PHT错误训练,从而误导它暂时跳过边界检查,使得CPU走向一个错误的条件路径。Schwarz证明,这种攻击在网络环境中也是可以实现的。
代表:Spectre V1
Spectre-BTB.
分支target缓存,在同一个程序里面,使用某个跳转地址,不断训练BTB,从而误导CPU,使其重定向到该程序虚拟地址空间内的任何位置。
Similarly to return-oriented pro- gramming (ROP), the attacker can chain multiple jump targets together to achieve arbitrary transient execution as far as the tran- sient window allows
代表:Spectre V2
Spectre-RSB.
返回栈Buffer,攻击者使用恶意构造的目标地址,污染RSB,误导其暂时返回到一个恶意地址。
Spectre-STL.
基于 store-to-load攻击
4.2 Meltdown类型的攻击
Canella 提出一个典型的Meltdown类型攻击的命名机制。主要分为两步:
- the type of the fault or the assist that causes transient execution
- different reasons for the fault or assist and from which buffer they leak from
本文将Meltdown类型的攻击分为三组,重点介绍每一组中的共同点:
Deferred Permission Check. 推迟 Permission 检查
this category show architecturally correct behavior but with a lack of permission checks,
就是说它使用的攻击代码,单纯执行的话,普通用户无法执行,但是带权限用户可以顺利执行。而只要我们将权限检查稍微推迟,就可以获得一个短暂的瞬时执行的窗口。
代表:Meltdown,Meltdown-PK,Meltdown-BND,Meltdown-MPX,Meltdown-GP
Incorrect Use of Intermediate Values. 利用中间值
该种攻击利用 中间值 来恢复数据。具体的话,就是构造一些无效的、无意义的(和是否为特权用户无关)行为,然后截取一部分中间数据,重新翻译。
在架构层面,处理器认为,不实际存在的页表条目可以包含任何位置的数据,如果程序尝试将此数据解释为物理地址,一般都是错误的。
但是,我们可以将此数据中途拦截下来,进行翻译,得到 secret。
代表:Foreshadow
Use-After-Free.
最近出现一些新的 meltdown 类型攻击,类似于软件漏洞中常用的 use-after-free 漏洞攻击手法,对一些失效的对象成功再次使用。
代表:ZombieLoad, RIDL, Fallout
4.3 LVI类型的攻击——Load Value Injection
lvi 介绍说:
LVI turns previous data extraction attacks around, like Meltdown, Foreshadow, ZombieLoad, RIDL and Fallout, and defeats all existing mitigations.
Instead of directly leaking data from the victim to the attacker, we proceed in the opposite direction:
we smuggle — "inject" — the attacker's data through hidden processor buffers into a victim program and hijack transient execution to acquire sensitive information, such as the victim’s fingerprints or passwords.
Crucially, LVI is much harder to mitigate than previous attacks, as it can affect virtually any access to memory.
Unlike all previous Meltdown-type attacks, LVI cannot be transparently mitigated in existing processors and necessitates expensive software patches, which may slow down Intel SGX enclave computations 2 up to 19 times.
Spectre,构造或者在 victim 程序中找到一些 gadget。
Meltdown,使用攻击者程序引发异常,从缓冲区中窃取数据。
LVI,更像是前两者的结合。
we combine Spectre-style code gadgets in the victim application with Meltdown-type illegal data flow from faulting or assisted memory load instructions to bypass existing defenses and inject attacker-controlled data into a victim's transient execution.
LVI的实现有四个步骤:
- 用攻击者的 data 去污染一个隐藏的处理器缓冲区
- 在 victim 程序中引发故障或辅助负载
- 攻击者的 data 在 victim 程序的错误、负载之后,被瞬时地注入到代码 gadget 中。
- 在处理器检测到错误并回滚所有操作之前,侧通道可能会留下秘密相关的痕迹。
5 结论
以往,人们认为这些很安全
现在,侧信道攻击说明能泄露 meta-data
瞬时执行攻击,说明能够泄露更多信息。
本文展示了一下顺势执行攻击时如何发展的,希望能够促进新的瞬时执行攻击的发现。
6 相关材料
Meltdown:
Spectre:
LVI:
Foreshadow: ForeshadowAttack
MDS: Mds
ZombieLoad: ZombieLoadAttack
一个有大用的网站:classification tree and PoCs
标签:Evolution,缓存,瞬态,Attacks,Spectre,攻击,Transient,Meltdown,执行 From: https://www.cnblogs.com/lizhouyang/p/17090588.html