diff options
Diffstat (limited to 'chap/chap2.tex')
-rw-r--r-- | chap/chap2.tex | 233 |
1 files changed, 104 insertions, 129 deletions
diff --git a/chap/chap2.tex b/chap/chap2.tex index 5c8e73a..69d32d0 100644 --- a/chap/chap2.tex +++ b/chap/chap2.tex @@ -1,7 +1,7 @@ % Copyright (c) 2014,2016 Casper Ti. Vector % Public domain. -\chapter{Meltdown和Spectre攻击}\label{sec:attack} +\chapter{Meltdown 和 Spectre攻击}\label{sec:attack} 本章首先介绍侧信道攻击,之后对已有的 Meltdown 和 Spectre 攻击的各种变 体进行分类讲解,最后简单地介绍已有攻击的其他使用形式。 @@ -398,48 +398,46 @@ Spectre 型攻击利用处理器对控制流或数据流的预测,并进行推 %%%% gtran: branch prediction -\Todo: 关于处理器执行转移指令的背景知识,是否需要? +%% \Todo: 关于处理器执行转移指令的背景知识,是否需要? -\Fixme: 需要重新翻译的内容 +%% \Fixme: 需要重新翻译的内容 -在推测执行期间,处理器猜测分支指令的可能结果。更好的预测通过增加可成功 -提交的推测性执行操作的数量来提高性能。 +%% 在推测执行期间,处理器猜测分支指令的可能结果。更好的预测通过增加可成功 +%% 提交的推测性执行操作的数量来提高性能。 -现代英特尔处理器的分支预测器,例如Haswell Xeon处理器,具有用于直接和间 -接分支的多种预测机制。间接分支指令可以跳转到在运行时计算的任意目标地址。 -例如,x86指令可以跳转到寄存器,存储器位置或堆栈中的地址,例如“jmp eax”, -“jmp [eax]”和“ret”。 ARM上也支持间接分支(例如,“MOV pc,r14”),MIPS -(例如,“jr \$ ra”),RISC-V(例如,“jalr x0,x1,0”)和其他处理器。与直 -接分支相比,为了补偿额外的灵活性,使用至少两种不同的预测机制来优化间接 -跳转和调用[35]。 +%% 现代英特尔处理器的分支预测器,例如Haswell Xeon处理器,具有用于直接和间 +%% 接分支的多种预测机制。间接分支指令可以跳转到在运行时计算的任意目标地址。 +%% 例如,x86指令可以跳转到寄存器,存储器位置或堆栈中的地址,例如“jmp eax”, +%% “jmp [eax]”和“ret”。 ARM上也支持间接分支(例如,“MOV pc,r14”),MIPS +%% (例如,“jr \$ ra”),RISC-V(例如,“jalr x0,x1,0”)和其他处理器。与直 +%% 接分支相比,为了补偿额外的灵活性,使用至少两种不同的预测机制来优化间接 +%% 跳转和调用[35]。 -英特尔[35]描述了处理器的预测 -•以静态或单调方式进行“直接呼叫和跳转”, -•“间接呼叫和跳转”要么是单调的,要么是以不同的方式,这取决于最近的程序 -行为,以及 -•“条件分支”分支目标以及是否将采用分支。 +%% 英特尔[35]描述了处理器的预测 +%% •以静态或单调方式进行“直接呼叫和跳转”, +%% •“间接呼叫和跳转”要么是单调的,要么是以不同的方式,这取决于最近的程序 +%% 行为,以及 +%% •“条件分支”分支目标以及是否将采用分支。 -因此,几个处理器组件用于预测分支的结果。分支目标缓冲区(BTB)保持从最 -近执行的分支指令的地址到目标地址的映射[44]。即使在解码分支指令之前,处 -理器也可以使用BTB来预测未来的代码地址。 Evtyushkin等。 [14]分析了英特 -尔Haswell处理器的BTB,并得出结论,只有31个最低有效位的分支地址用于索引 -BTB。 +%% 因此,几个处理器组件用于预测分支的结果。分支目标缓冲区(BTB)保持从最 +%% 近执行的分支指令的地址到目标地址的映射[44]。即使在解码分支指令之前,处 +%% 理器也可以使用BTB来预测未来的代码地址。 Evtyushkin等。 [14]分析了英特 +%% 尔Haswell处理器的BTB,并得出结论,只有31个最低有效位的分支地址用于索引 +%% BTB。 -对于条件分支,记录目标地址对于预测分支的结果不是必需的,因为目的地通常 -在指令中被编码,同时在运行时确定条件。为了改进预测,处理器维护分支结果 -的记录,包括最近的直接和间接分支。 Bhattacharya等。 [9]分析了近期英特 -尔处理器中分支历史预测的结构。 +%% 对于条件分支,记录目标地址对于预测分支的结果不是必需的,因为目的地通常 +%% 在指令中被编码,同时在运行时确定条件。为了改进预测,处理器维护分支结果 +%% 的记录,包括最近的直接和间接分支。 Bhattacharya等。 [9]分析了近期英特 +%% 尔处理器中分支历史预测的结构。 -尽管返回指令是一种间接分支,但是在现代CPU中经常使用用于预测目标地址的 -单独机制。返回堆栈缓冲区(RSB)维护最近使用的调用堆栈部分的副本[15]。 -如果RSB中没有可用数据,则不同的处理器将停止执行或使用BTB作为回退[15]。 +%% 尽管返回指令是一种间接分支,但是在现代CPU中经常使用用于预测目标地址的 +%% 单独机制。返回堆栈缓冲区(RSB)维护最近使用的调用堆栈部分的副本[15]。 +%% 如果RSB中没有可用数据,则不同的处理器将停止执行或使用BTB作为回退[15]。 -分支预测逻辑(例如,BTB和RSB)通常不在物理核心之间共享[19]。因此,处理 -器仅从在同一核上执行的先前分支学习。 +%% 分支预测逻辑(例如,BTB和RSB)通常不在物理核心之间共享[19]。因此,处理 +%% 器仅从在同一核上执行的先前分支学习。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%% gtran: attack overview %%%%%%%%%%%%%%%%%%%%%%%5 - Spectre 攻击使得受害者程序在推测式地执行在严格按序执行的时不会执行的操 作,这些操作会通过隐蔽信道将秘密信息泄露给攻击者。 @@ -602,7 +600,7 @@ ARM 处理器上进行验证,确认它们受 Spectre v1 的影响。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\verb|TODO|: Spectre v1.1的内容,需要更详细地解释攻击原理 +%% \verb|TODO|: Spectre v1.1的内容,需要更详细地解释攻击原理 推测式缓冲区溢出(Speculative Buffer Overflow) \supercite{spec-buffer-overflow} 是 Spectre-PHT 的另一种形式。处理器存 @@ -638,19 +636,17 @@ Spectre v2 利用间接转移的推测式执行,用于预测间接转移的主 \begin{figure}[htbp] \centering \includegraphics[width=0.8\textwidth]{spectre_v2.eps} - \caption{转移预测器在攻击者控制的上下文 A 中训练。在上下文 B 中,转移 - 预测器根据在上下文 A 中的训练结果进行预测,导致处理器跳转至攻击者选 - 择的目标地址处进行推测式执行,该目标地址处存放着受害者地址空间中 - 的 Spectre组件。\supercite{spectre}} + \caption{转移预测器在不同上下文中训练和使用\supercite{spectre}} \label{fig:spectre_v2} \end{figure} 攻击者可以用恶意的目标地址训练转移预测器,从而处理器转移到攻击者选择的 -地址进行推测式执行。在图\ref{fig:spectre_v2}中,转移预测器可以在一个上 -下文中训练,在另一个上下文中进行预测。攻击者可以引导受害者推测式执行在 -正确的程序执行中永远不会执行的位置。由于推测性执行带来了可测量的副作 -用,这种攻击对于攻击者来说及其强大,即使在没有可利用的条件分支错误预测 -的情况下,也可以用它泄露受害者的内存。 +地址进行推测式执行。在图\ref{fig:spectre_v2}中,转移预测器可以在上下文 +中 A 中训练,在上下文 B 中,转移预测器根据在 A 中的训练结果进行预测, +导致处理器跳转至攻击者选择的目标地址处进行推测式执行。攻击者可以引导受 +害者推测式执行在正确的程序执行中永远不会执行的位置。由于推测性执行带来 +了可测量的副作用,这种攻击对于攻击者来说及其强大,即使在没有可利用的条 +件分支错误预测的情况下,也可以用它泄露受害者的内存。 举一个简单的攻击例子,攻击者试图读取受害者的内存,当发生间接转移时,攻 击者可以控制两个寄存器。这在现实的二进制程序中很常见,因为操作从外部接 @@ -667,49 +663,46 @@ Spectre v2 利用间接转移的推测式执行,用于预测间接转移的主 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% gtran %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\verb|TODO|: Spectre 的论文中关于 Spectre v2 一节的剩余内容,一直到实验结果部 -分 - -\Fixme: 重新翻译以下内容 - -许多其他攻击是可能的,这取决于对手所知道或控制的状态,对手所寻求的信息 -所在的位置(例如,寄存器,堆栈,内存等),对手控制推测执行的能力,指令 -序列可用于形成小工具,以及哪些渠道可能会泄漏来自投机操作的信息。例如, -如果攻击者可以简单地在将来自寄存器中指定的地址的存储器带入高速缓存的指 -令中诱导推测执行,则在寄存器中返回秘密值的加密函数可能变得可利用。同样, -尽管上面的示例假设攻击者控制两个寄存器,但攻击者控制单个寄存器,堆栈上 -的值或内存值对于某些小工具来说已足够。 - -从很多方面,这种攻击类似于面向返回编程 -(ROP)\supercite{ret2libc}。在ROP 中,攻击者从受害程序所用的 C 库等代 -码中寻找大量的指令序列,合并到一起形成一个组件,攻击者可以构造出能进行 -任意计算的组件。而在 Spectre v2 攻击中,受攻击的程序是正确编写的软件, -构造出的组件是暂态执行的,指令数目有限,然而攻击者仍然可以让处理器推测 -式执行复杂的指令序列,利用侧信道泄露数据。 - - -在x86处理器上模糊分支预测器。 - -攻击者从其自己的上下文中执行分支预测器的错误操作,以欺骗处理器在运行受 -害者代码时推测性地执行小工具。我们的攻击过程模仿受害者的分支模式导致分 -支被误导。 - -请注意,历史错误要求因CPU而异。例如,在Haswell i7-4650U上,使用了大约 -29个先前目标地址的低20位,尽管观察到在这些地址上进行了一些进一步的散列。 -在AMD Ryzen上,仅使用大约前9个分支的低12位。附录A中提供了用于更新Intel -Xeon Haswell E5-1650 v3上的分支历史缓冲区的反向工程伪代码。 - -此外,我们在攻击者的同一个虚拟地址处设置了一个跳跃,就像在受害者进程中 -一样。注意,这可能不是必需的,例如,如果CPU仅基于跳转地址的低位索引预 -测。在设计分支预测器时,我们只需要模拟虚拟地址;物理地址,时间和进程ID -似乎并不重要。由于分支预测不受其他内核上的操作的影响(参见第II-C节), -因此必须在同一CPU内核上进行任何错误训练。 - -我们还观察到分支预测器从非法目的地的跳跃中学习。虽然在攻击者的进程中触 -发了异常,但这可以很容易地捕获,例如,使用Linux上的信号处理程序或 -Windows上的结构化异常处理。与前一种情况一样,分支预测器然后将进行预测, -将其他进程发送到相同的目标地址,但是在受害者的虚拟地址空间(即,小工具 -所在的地址空间)中。 +%% \verb|TODO|: Spectre 的论文中关于 Spectre v2 一节的剩余内容,一直到实验结果部 +%% 分 + +%% \Fixme: 重新翻译以下内容 + +%% 许多其他攻击是可能的,这取决于对手所知道或控制的状态,对手所寻求的信息 +%% 所在的位置(例如,寄存器,堆栈,内存等),对手控制推测执行的能力,指令 +%% 序列可用于形成小工具,以及哪些渠道可能会泄漏来自投机操作的信息。例如, +%% 如果攻击者可以简单地在将来自寄存器中指定的地址的存储器带入高速缓存的指 +%% 令中诱导推测执行,则在寄存器中返回秘密值的加密函数可能变得可利用。同样, +%% 尽管上面的示例假设攻击者控制两个寄存器,但攻击者控制单个寄存器,堆栈上 +%% 的值或内存值对于某些小工具来说已足够。 + +Spectre v2 的攻击方式和面向返回编程(ROP)\supercite{ret2libc} 有相似 +之处。在ROP 中,攻击者从受害程序所用的 C 库等代码中寻找大量的指令序列, +合并到一起形成一个组件,攻击者可以构造出能进行任意计算的组件。而在 +Spectre v2 攻击中,受攻击的程序是正确编写的软件,构造出的组件是暂态执 +行的,指令数目有限,然而攻击者仍然可以让处理器推测式执行复杂的指令序列, +利用侧信道泄露数据。 + +对处理器的分支预测器进行错误的训练是攻击的一个关键步骤。为此攻击者需要 +通过逆向分析出 BTB 的工作方式,用于制造地址冲突。此前已有工作分析了 +Intel 处理器的 BTB.\supercite{jump-over-aslr} + +%% 请注意,历史错误要求因CPU而异。例如,在Haswell i7-4650U上,使用了大约 +%% 29个先前目标地址的低20位,尽管观察到在这些地址上进行了一些进一步的散列。 +%% 在AMD Ryzen上,仅使用大约前9个分支的低12位。附录A中提供了用于更新Intel +%% Xeon Haswell E5-1650 v3上的分支历史缓冲区的反向工程伪代码。 + +%% 此外,我们在攻击者的同一个虚拟地址处设置了一个跳跃,就像在受害者进程中 +%% 一样。注意,这可能不是必需的,例如,如果CPU仅基于跳转地址的低位索引预 +%% 测。在设计分支预测器时,我们只需要模拟虚拟地址;物理地址,时间和进程ID +%% 似乎并不重要。由于分支预测不受其他内核上的操作的影响(参见第II-C节), +%% 因此必须在同一CPU内核上进行任何错误训练。 + +%% 我们还观察到分支预测器从非法目的地的跳跃中学习。虽然在攻击者的进程中触 +%% 发了异常,但这可以很容易地捕获,例如,使用Linux上的信号处理程序或 +%% Windows上的结构化异常处理。与前一种情况一样,分支预测器然后将进行预测, +%% 将其他进程发送到相同的目标地址,但是在受害者的虚拟地址空间(即,小工具 +%% 所在的地址空间)中。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -740,20 +733,8 @@ store 指令地址不同,并推测式执行这个 load 指令,将其地址 在研究 Meltdown 和 Spectre 攻击的过程中,研究者还发现了一起其他的攻击 形式,它们基于已有的 Meltdown 和 Spectre 攻击,使用不同的利用方式。 -\subsection{MeltdownPrime 和 SpectrePrime} - -MeltdownPrime 和 SpectrePrime \supercite{meltdownprime} 是一种使用 -Prime+Probe 方式进行 Meltdown 和 Spectre 攻击的形式。通过利用缓存一致 -性协议的缓存行失效机制,可以达到和 Flush+Reload 方式的同等精度。 - \subsection{NetSpectre} -%%%%%%%%%%%%%%%%%% gtran %%%%%%%%%%%%%%%%%%%%%%%%%%% - -%\verb|TODO|: NetSpectre 的 introduction - -%\Fixme: 重新翻译此内容 - NetSpectre\supercite{netspectre} 是通过网络进行的 Spectre 攻击,使得 Spectre 攻击可以用于不运行攻击者控制的代码的系统上,从而更多的设备受到 Spectre 攻击的影响。 @@ -770,28 +751,22 @@ Evict+Reload 的远程缓存攻击方式,将 Spectre 攻击用于网络场景 通过使用 NetSpectre 攻击,攻击者可以破坏远程系统中部署的地址空间布局随 机化(ASLR)防御机制。 -% - -由于我们的NetSpectre攻击是通过网络安装的,因此受害设备需要攻击者可以访 -问的网络接口。攻击者必须能够向受害者发送大量网络数据包。但是,这些不一 -定必须在其中 -很短的时间。此外,我们攻击中的数据包内容不需要受攻击者控制。 +NetSpectre 攻击在网络上使用,需要攻击者访问受害者提供的网络接口,并且 +向受害者发送大量网络数据包。这些操作不一定需要在短时间内进行。 与本地幽灵攻击相比,我们的NetSpectre攻击并没有分为两个阶段。相反,攻击 者不断执行操作以使处理器出错,这将使其经常遇到可利用的错误推测执行。 NetSpectre不会跨越进程边界,而是通过将有效和无效值交替地传递给暴露的接 -口(例如,有效和无效的网络数据包)来就地进行训练。对于我们的NetSpectre -攻击,攻击者需要两个Spectre小工具,如果收到网络数据包,则会执行这些小 -工具:泄漏小工具和传输小工具。泄漏小工具在攻击者控制的索引处访问位流, -并根据所访问位的状态改变一些微架构状态。传输小工具执行任意操作,其中运 -行时取决于泄漏小工具修改的微架构状态。在大量噪声中,攻击者可以观察到网 -络数据包响应时间的这种时序差异。 Spectre小工具常见于现代网络驱动程序, -网络堆栈和网络服务实现中。 - -为了说明我们的NetSpectre攻击的工作原理,我们在一个适应的场景中考虑一个 -类似于原始Specter变体1示例[48]的基本示例:清单1中的代码是在收到网络数 -据包时执行的函数的一部分。我们假设x是攻击者控制的,例如,包头中的字段 -或某些API的索引。此代码构成我们的泄漏小工具。 +口(例如,有效和无效的网络数据包)来就地进行训练。 + +在 NetSpectre 攻击中,攻击者需要利用两个 Spectre 组件:泄露组件和传输 +组件,这些组件在收到网络数据包时执行。泄漏组件在攻击者控制的内存地址处 +访问数据,并根据访问的数据改变一些微架构状态。传输组件可以进行任意操作, +它的运行时间取决于泄露组件修改的微架构状态。这些组件可以存在于网络驱动 +程序,以及网络协议和网络服务的实现。 + +图 \ref{fig:netspectre_leak} 是一个 Spectre v1 组件,它是处理网络数据 +包的程序的一部分,其中 x 由攻击者控制,它构成了 NetSpectre 的泄露组件。 \begin{figure}[htbp] \begin{minted}{C} @@ -823,18 +798,9 @@ flag 的缓存状态会发生变化。如果 \verb|bitstream[x]| 为 1,则 flag 件的响应时间取决于 flag 的缓存状态,因此可以泄露秘密数据位 \verb|bitstream[x]| 的值。 - - - 为了完成攻击,攻击者测量每个秘密位泄漏的响应时间。由于响应时间的差异 - 在纳秒范围内,攻击者需要对大量测量进行平均以获得具有可接受置信度的秘 - 密值。实际上,我们的实验表明,在进行大量测量时,微结构状态的差异变得 - 明显。因此,攻击者可以首先测量两个角落情况(即,缓存和未缓存)和之后, - 以提取真实秘密位,执行尽可能多的测量以区分具有足够置信度的情况,例如, - 使用阈值或贝叶斯分类器。 - - 我们将这两个小工具,即泄漏小工具和传输小工具称为NetSpectre小工具。运 - 行NetSpectre小工具可能需要发送多个数据包。此外,泄漏小工具和传输小工 - 具可以通过不同的独立接口来访问,即,攻击者必须可以访问这两个接口。 +要完成 NetSpectre 攻击,攻击者需要测量一个秘密值泄露时的网络响应时间。 +由于响应时间的差异在纳秒级,因此攻击者需要进行大量的测量,此时可以得到 +明显的微架构状态差异。 \begin{figure}[htbp] \centering @@ -849,4 +815,13 @@ SgxPectre \supercite{sgxpectre} 将 Spectre 攻击用于泄露 Intel SGX 环境 中的数据。通过在 SGX enclave 之外污染 BTB,可以改变 SGX enclave 中的控 制流,进行 Spectre-BTB 攻击。 -% vim:ts=4:sw=4 +\subsection{MeltdownPrime 和 SpectrePrime} + +MeltdownPrime 和 SpectrePrime \supercite{meltdownprime} 是一种使用 +Prime+Probe 方式进行 Meltdown 和 Spectre 攻击的形式。通过利用缓存一致 +性协议的缓存行失效机制,可以达到和 Flush+Reload 方式的同等精度。 + +\section{本章总结} + +本章首先介绍侧信道攻击,接着分类介绍各个变体的 Meltdown 型攻击和 +Spectre 型攻击,最后介绍 NetSpectre 等攻击的其他利用形式。 |