diff options
author | Iru Cai <mytbk920423@gmail.com> | 2019-05-15 08:11:58 +0800 |
---|---|---|
committer | Iru Cai <mytbk920423@gmail.com> | 2019-05-15 08:11:58 +0800 |
commit | 264d2f866382b7409cc9ff6eb1620373822e0071 (patch) | |
tree | 3064b4c12ae96540cfdabfbb5e76de7d22464729 /chap | |
parent | b515a2961caeb0b2254a97e1c9dab02d5de5bf67 (diff) | |
download | dissertation-264d2f866382b7409cc9ff6eb1620373822e0071.tar.xz |
upd
Diffstat (limited to 'chap')
-rw-r--r-- | chap/chap2.tex | 233 | ||||
-rw-r--r-- | chap/chap3.tex | 150 | ||||
-rw-r--r-- | chap/chap4.tex | 38 | ||||
-rw-r--r-- | chap/chap5.tex | 189 |
4 files changed, 347 insertions, 263 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 等攻击的其他利用形式。 diff --git a/chap/chap3.tex b/chap/chap3.tex index aaa7956..045e9a8 100644 --- a/chap/chap3.tex +++ b/chap/chap3.tex @@ -66,11 +66,11 @@ retpoline\supercite{retpoline} 是 Google 提出的防御 Spectre-BTB 的方法 % TODO:增加 retpoline 的代码? % index masking -Webkit 在数组访问中使用 index masking\supercite{webkit} 方法,它让数组 -下标和一个值进行与操作,去掉下标高位的1,将数组下标控制在一定范围内,防 -止处理器在推测式执行中访问数组指定范围之外的数据。Linux 构造了一个粒度 -更细的 array\_index\_nospec\supercite{linux-spec},它的功能如 -图\ref{fig:array-index-nospec}: +Webkit 在数组访问中使用索引掩码(index masking)\supercite{webkit} 方 +法,它让数组下标和一个值进行与操作,去掉下标高位的1,将数组下标控制在 +一定范围内,防止处理器在推测式执行中访问数组指定范围之外的数据。Linux +构造了一个粒度更细的 array\_index\_nospec\supercite{linux-spec},它的 +功能如图\ref{fig:array-index-nospec}: \begin{figure}[htbp] \begin{minted}[frame=single]{C} @@ -118,64 +118,53 @@ Google 为 Chrome 浏览器使用了站点隔离(site isolation)技术,使 \Fixme: 需要重新翻译 -SafeSpec\supercite{safespec}提出了一种原则性的方法来保护处理器免受推测 -式执行攻击,同时保留执行推测性执行以从其性能中受益的能力。一般原理(如 -图\ref{fig:safespec}所示)使用临时结构(图中的阴影状态)来保存任何以推 -测方式产生的状态,而不会影响处理器的主要结构(我们在图中称为提交状态)。 -例如,如果推测性加载指令导致加载高速缓存行,而不是将该高速缓存行加载到 -处理器高速缓存中,我们将该行保存在临时结构中。如果稍后对加载指令进行压 -缩,则会将这些效果移除(从提交状态开始的底部路径),不会从错误推测的指 -令中更改缓存,并关闭漏洞。或者,如果指令提交,则将高速缓存行从临时结构 -移动到L1高速缓存并从阴影状态中移除。 +SafeSpec\supercite{safespec}提出了一种设计原则保护处理器免受推测式执行 +攻击,同时保持推测式执行带来的性能提升。SafeSpec 的总体设计如图 +\ref{fig:safespec}所示,使用临时结构(图中的影子状态)来保存任何推测式 +执行的指令产生的状态,而不影响处理器的主要结构(在图中称为提交状态)。 +例如,如果推测式执行中的装载指令需要向缓存中填入一个缓存行,则改行保存 +在临时结构中,而不是高速缓存。如果这个指令被取消,则它产生的效果也一起 +被清除,从而错误的推测式执行不会改变缓存状态;如果指令提交,则将这个缓 +存行从临时结构移动至缓存中。 \begin{figure}[htbp] \centering \includegraphics[width=0.8\textwidth]{safespec.eps} - \caption{SafeSpec 总体设计} + \caption{SafeSpec 总体设计\supercite{safespec}} \label{fig:safespec} \end{figure} 虽然SafeSpec原则上很简单,但必须解决许多与其安全性,复杂性和性能相关的 -问题。我们将在本节的其余部分概述这些问题。 - -% transient to commit -有两个选项可用于决定何时将状态从阴影移动到已提交状态。在第一个变量中, -我们称之为等待分支(WFB),我们可以假设一条指令在它所依赖的所有分支 -(更一般地说,所有预测)都已被解析时不再是推测性的。 WFB阻止两种幽灵的 -变种,它们依赖于错误分支预测;没有任何错误推测的指令移动到已提交状态。 -但是,它不会阻止不依赖于分支预测器的Meltdown。第二个变量等待提交(WFC) -等待直到导致推测性副作用的指令在将其效果移动到提交状态之前提交,因此也 -会阻止崩溃。我们注意到,根据此定义的重新排序缓冲区是一种阴影状态,只有 -在提交指令时,其数据才会移动到永久状态(架构状态)。 - -阴影状态组织和大小:如果阴影状态结构太小,则替换推测状态(如果稍后将提 -交此数据,则导致丢失对已提交状态的更新),或者指令必须停止,直到那里在 -发布之前,它是投机结构的空间。因此,从性能的角度来看,应该设计影子结构 -的组织和大小,使得结构可以保持通过在典型工作负载上测量的推测产生的推测 -状态。但是,我们将证明安全考虑因素对投机状态提出了更严格的要求。 - -减轻瞬态猜测攻击:通过构造安全规范可以防止推测值影响已提交结构的状态, -这是在已发布的推测攻击中隐蔽地传递数据的途径。但是,它不会在处于推测状 -态的指令之间创建隔离。这为我们称为瞬态推测攻击(TSA)的新型攻击创造了 -可能性。特别是,由于提交的指令可以处于推测状态(在它们的依赖分支在WFB -中提交之前,或者在指令本身在WFC中提交之前),因此有一个时间窗口,它们 -可以在它们之前与错误指定的指令共享推测状态。被压扁了。如果我们不小心, -可以在此期间创建一个隐蔽通道,将敏感数据从错误推测的分支传递到将要提交 -的分支,从而允许数据被泄露。 - -考虑一个尺寸小的阴影结构的例子(比如说一个条目)。然后,读取特权数据的 -恶意推测代码可以使用阴影状态秘密地将其传递给推测代码(将提交的“接收器” -代码)。例如,它可以替换阴影状态中的条目,导致接收者在提交后注意到其推 -测状态(因为它被替换)的缺失。或者,如果我们在阴影结构已满时阻塞,接收 -器可以检测到其代码执行时间较长。 - -尽管TSA的严重程度远低于原始攻击,但必须仔细考虑它们以确保无法进行泄漏。 -解决此问题的一种方法是对每个分支的推测状态进行分区,或者对其进行大量调 -整,或者甚至在最坏的情况下,以确保通过阴影状态不发生泄漏。 TSA还可以通 -过在功能单元或其他共享结构上创建争用来秘密地进行通信;这是我们也考虑的 -问题。我们将在第五节讨论如何减轻TSA攻击。 - -过滤延迟的副作用:当指令在执行过程中被压缩时,会发生SafeSpec的一个问题。 +问题。 + +将状态从影子状态移动到提交状态有两种选择。第一种选择是等待分支(Wait + For Branch,WFB),当一个指令依赖的所有分支结果都已经得出时,这个指 +令不再是推测式执行的指令。WFB 可以防御 Spectre v1 和 v2,它们依赖于错误 +的分支预测,没有任何错误的推测式执行产生的状态进入提交状态。而 +Meltdown 不依赖于分支预测,因此 WFB 不能防御 Meltdown. 第二种选择是等 +待提交(Wait For Commit,WFC),在指令提交的时候,才将推测式执行产生的 +状态更新至提交状态。 + +影子状态的大小是另一个设计选择。如果保存影子状态的结构太小,则会导致推 +测式执行的状态被替换,或指令需要在发射前停顿,直到影子状态有足够的空间。 +因此,影子状态应当设计为能符合一般程序产生的推测式执行状态数量的大小。 +暂态推测式攻击从安全的角度,说明影子状态的大小要足够大。 + +SafeSpec 防止推测式执行的产生的值影响提交状态,从而阻止了 Spectre 攻击 +通过隐蔽信道传送数据。但是 SafeSpec 并没有隔离推测式执行中的指令的状态, +这可能造成暂态推测式攻击(Transient Speculation Attack)。由于指令在提 +交前可在推测式执行的状态,在一段时间内,它可以和错误推测式执行的指令共 +享状态。 + +例如,考虑一个非常小的影子结构(如只有一个条目),恶意的推测式执行的代 +码可以读取一个特权数据,隐蔽地通过影子状态传送这个数据至接收者。它可以 +替换影子状态中的条目,使得接收者发现其推测式执行状态丢失。如果在影子状 +态满时阻塞执行,接收者可以发现它的执行时间变长。 + +SafeSpec 的一个问题是如果一个长延迟指令,例如从内存中读取数据的指令, +在执行过程中被取消,它的状态需要丢弃。因此,如果一个长延迟指令的结果返回, + + 如果指令已经启动了高延迟操作,例如从内存中读取,我们必须确保在收到内存 后可以丢弃内存中的响应。 执行的指令推测性地将任何结果状态存储到阴影结 构。 因此,如果收到长等待时间回复并且没有匹配的事务,我们只是丢弃这些 @@ -464,9 +453,6 @@ DAWG提供了强大的隔离和合理的性能开销。 在 zsim 模拟器中使用 SPEC CPU2006, PARSEC, GAPBS 进行模拟,相对于 Intel CAT,在不同的评测程序和划分方式下,大多数程序性能下降为 4\%\~7\%. -DAWG 的主要缺点是需要操作系统的支持。此外,DAWG 不能防御 NetSpectre 等可 -在同一安全域内进行的攻击。 - \subsubsection{Context-Sensitive Fencing} %\Todo: CSF introduction @@ -768,3 +754,51 @@ Spectre 攻击需要分为三个步骤:从存储系统装载秘密数据,将 \section{Meltdown 和 Spectre 的防御方案分析} +由于 Meltdown 型攻击和 Spectre 型攻击利用的暂态指令不同,因此防御方案 +也不同。 + +对于 Meltdown 型攻击,防御方法相对简单。只要使产生异常的指令在微架构层 +次上无法访问体系结构层次上无法访问的数据,即可以阻止 Meltdown 型攻击。 +在现有的处理器中,需要使用 KAISER 等防御方案,会造成一定性能的损失。 + +Spectre 攻击的防御相对复杂。对于软件防御方案,在分支后添加串行化指令或 +数据依赖,阻止推测式执行的发生,会有 30\% 以上的性能下降。 +\supercite{spec-load-hardening} 使用静态分析工具 +\supercite{oo7}\supercite{spectector}寻找程序中受影响的分支,可以检测 +出受 Spectre 攻击影响的分支,并只对这些分支进行防御,但是这些工具仍然 +未能投入使用。而且,这些方法都只能防御 Spectre v1. Retpoline 有 5\% 至 +10\% 的性能开销\supercite{systematic},只能用于防御 Spectre v2. 索引掩 +码只用于数组边界检查一类分支,站点隔离只用于浏览器等特定场景。 + +总的来说,软件防御方案防御的攻击类型有限,而且需要对软件进行修改,而硬 +件防御方案通常不要求软件修改,可以防御多种变体的攻击,这是硬件防御方案 +相对于软件防御方案的优点。 + +现有的硬件防御方案主要关注高速缓存侧信道。在现有的大部分 Spectre 类型 +攻击中,都使用高速缓存侧信道,因此针对高速缓存侧信道的防御方法可以抵抗 +大多数的攻击。随着侧信道攻击研究的发展,未来的处理器可能需要考虑更多的 +信道。 + +SafeSpec 的方法是使用临时结构。InvisiSpec 为了处理内存一致性的问题,在 +添加一个推测式执行缓冲区之外,还要增加一个验证步骤,使得 InvisiSpec 具 +有较大的性能开销。 + +基于缓存隔离的 DAWG 的主要缺点是需要操作系统的支持。此外,DAWG 不能防 +御 NetSpectre 等来源于同一安全域的攻击。 + +Context-Sensitive Fencing 基于译码阶段的微码自定义,它只适用于使用微码 +的处理器。 + +Conditional Speculation 定义了安全相关的概念,并将其用于安全冒险检测, +这个概念可以用于所有可泄露数据的侧信道。对于缓存侧信道,基于缓存命中的 +过滤器和 TPBuf 过滤器结合,性能开销较小。TPBuf 主要用于防御基于共享内 +存的侧信道攻击,而不能防御不利用共享内存的缓存侧信道攻击,这是一个主要 +缺点。 + +SpectreGuard 是基于隐私数据标记的防御方法,它针对 Spectre 攻击中所有的 +侧信道,而不限于缓存信道。它的设计简单,但是需要软件的支持。 + +\section{本章总结} + +本章介绍了现有的 Meltdown 和 Spectre 的防御方法,重点介绍 Spectre 的防 +御方法,包括软件防御和硬件防御。最后分析了各种防御方案的特性和缺点。 diff --git a/chap/chap4.tex b/chap/chap4.tex index ab8b34f..04ed1c6 100644 --- a/chap/chap4.tex +++ b/chap/chap4.tex @@ -18,7 +18,7 @@ Spectre-RSB 攻击,此方法可以扩展至 Spectre-STL 攻击。攻击者在 其他的侧信道攻击。本文针对攻击者通过 Spectre 攻击获取内存中秘密数据的 情形,不考虑攻击者通过攻击获取寄存器中秘密数据的情形。 -\section{基于动态信息流追踪的Spectre检测方法} +\section{基于动态信息流追踪的 Spectre 检测方法} 动态信息流追踪(Dynamic Information Flow Tracking)\supercite{dift}是 一种硬件安全策略,通过识别可疑的信息流,并限制可疑信息的使用,保护程序 @@ -283,13 +283,13 @@ gem5 的提交阶段由 DefaultCommit 类实现,它提交 ROB 队列头部的 此在状态机中添加一个状态 IX,表示接收了 SpecLoad 之后缓存缺失,向下级存 储系统发送读请求,还未得到响应。 -InvisiSpec 中,一级缓存处理 Load 和 Expose 的部分状态如 +InvisiSpec 中,一级缓存处理 SpecLoad 和 Expose 的部分状态如 图\ref{fig:invisispec_mesi}所示。 \begin{figure}[htbp] \centering \includegraphics[width=0.8\textwidth]{invisispec_mesi.eps} - \caption{InvisiSpec 一级缓存处理 Load 和 Expose 请求} + \caption{InvisiSpec 一级缓存处理 SpecLoad 和 Expose 请求} \label{fig:invisispec_mesi} \end{figure} @@ -300,17 +300,17 @@ InvisiSpec 中,一级缓存处理 Load 和 Expose 的部分状态如 % hit based -而对于只在缓存命中时执行装载指令的方案,设计相对简单。它只需要处理 -SpecLoad 请求。 +%% 而对于只在缓存命中时执行装载指令的方案,设计相对简单。它只需要处理 +%% SpecLoad 请求。 -在这种情形下,不需要添加额外状态。缓存行在任一状态下,接收 SpecLoad 时 -状态不变。缓存命中时,则执行 spec\_load\_hit 将缓存行中的内容返回至处 -理器。 +%% 在这种情形下,不需要添加额外状态。缓存行在任一状态下,接收 SpecLoad 时 +%% 状态不变。缓存命中时,则执行 spec\_load\_hit 将缓存行中的内容返回至处 +%% 理器。 -而在缓存缺失时,则在其中添加一个 spec\_load\_miss 操作,它向处理器返回 -一个缓存缺失的响应。LSQ 在写回的过程中处理这个响应,为其对应的缓存缺失 -的指令设置表\ref{tab:inst_status}中的 FenceDelay 属性,并通知指令队列需 -要推迟这条访存指令的执行。 +%% 而在缓存缺失时,则在其中添加一个 spec\_load\_miss 操作,它向处理器返回 +%% 一个缓存缺失的响应。LSQ 在写回的过程中处理这个响应,为其对应的缓存缺失 +%% 的指令设置表\ref{tab:inst_status}中的 FenceDelay 属性,并通知指令队列需 +%% 要推迟这条访存指令的执行。 \subsection{执行流水线的修改} @@ -354,10 +354,10 @@ FenceDelay & 指令被阻止执行,直到确认安全,在 InvisiSpec 之外 \label{tab:inst_status} \end{table} -在每一周期,处理器扫描 ROB 中的每条指令,更新流水线中每条指令 -的 PrevBrsResolved 状态。在 LSQ 中,对于每一个未完成的 load 指令,根据 -指令之前是否存在未决分支,判断指令是否安全,设定 ReadyToExpose 属性,取 -消 FenceDelay 标志。 +在每一周期,处理器扫描 ROB 中的每条指令,更新流水线中每条指令的 +PrevBrsResolved 状态。在 LSQ 中,对于每一个未完成的装载指令,根据指令 +之前是否存在未决分支,判断指令是否安全,设定 ReadyToExpose 属性,取消 +FenceDelay 标志。 \subsection{动态信息流追踪的实现} @@ -380,5 +380,9 @@ FenceDelay & 指令被阻止执行,直到确认安全,在 InvisiSpec 之外 了 PrevBrsResolved 属性,或者(2)AfterTaintedBranch 未设置,并且源寄存 器均未被标记。 +\section{本章小结} -\Todo: 如何添加一个总结性的章节? +本章前两节介绍本文设计的基于信息流追踪的 Spectre 组件的检测方法,讨论 +了执行可能泄露数据的装载指令的几种方法。第三节介绍了在 gem5 中实现这些 +技术的方法,包括对 gem5 流水线的分析,gem5 装载指令执行流程的分析,对 +执行流水线作出的修改,实现装载指令安全执行的方法。 diff --git a/chap/chap5.tex b/chap/chap5.tex index f7020a8..bbda05d 100644 --- a/chap/chap5.tex +++ b/chap/chap5.tex @@ -98,69 +98,69 @@ Glibc 2.24 静态链接。 方法是先用 gem5 的 AtomicSimpleCPU 运行 10000000000 条指令进行程序的预 热,再用待评测的处理器配置运行 1000000000 条指令,得出评测结果。 -表\ref{tab:spec2006}中列出每个 SPEC CPU2006 在 Baseline 模式下运行的指 -令数和操作数,在其他处理器配置下,实际运行的指令数可能有增加或减少,相 -应的操作数也有增加或减少。 - -\begin{table} -\begin{tabular}{|c|c|c|c|} -\hline -基准测试程序 & 类型 & 指令数 & 操作数\tabularnewline -\hline -\hline -401.bzip2 & int & 1000000015 & 1607899217\tabularnewline -\hline -429.mcf & int & 1000000012 & 1308544223\tabularnewline -\hline -445.gobmk & int & 1000000014 & 1932674840\tabularnewline -\hline -456.hmmer & int & 1000000013 & 1980694497\tabularnewline -\hline -458.sjeng & int & 1000000010 & 1827828221\tabularnewline -\hline -462.libquantum & int & 1000000011 & 1714852019\tabularnewline -\hline -464.h264ref & int & 1000000017 & 1545541668\tabularnewline -\hline -471.omnetpp & int & 1000000011 & 1971636254\tabularnewline -\hline -473.astar & int & 1000000010 & 1702905457\tabularnewline -\hline -410.bwaves & fp & 1000000011 & 1839010239\tabularnewline -\hline -433.milc & fp & 1000000018 & 1285963875\tabularnewline -\hline -434.zeusmp & fp & 1000000014 & 1524235186\tabularnewline -\hline -435.gromacs & fp & 1000000013 & 1630938771\tabularnewline -\hline -436.cactusADM & fp & 1000000014 & 1320986203\tabularnewline -\hline -437.leslie3d & fp & 1000000010 & 1415843900\tabularnewline -\hline -444.namd & fp & 1000000009 & 1333316425\tabularnewline -\hline -450.soplex & fp & 1000000013 & 1664925057\tabularnewline -\hline -454.calculix & fp & 1000000010 & 1691328153\tabularnewline -\hline -459.GemsFDTD & fp & 1000000014 & 1320385828\tabularnewline -\hline -470.lbm & fp & 1000000011 & 1191402714\tabularnewline -\hline -482.sphinx3 & fp & 1000000016 & 1618883137\tabularnewline -\hline -\end{tabular} -\caption{SPEC CPU2006 各基准程序的指令数和操作数} -\label{tab:spec2006} -\end{table} +%% 表\ref{tab:spec2006}中列出每个 SPEC CPU2006 在 Baseline 模式下运行的指 +%% 令数和操作数,在其他处理器配置下,实际运行的指令数可能有增加或减少,相 +%% 应的操作数也有增加或减少。 + +%% \begin{table} +%% \begin{tabular}{|c|c|c|c|} +%% \hline +%% 基准测试程序 & 类型 & 指令数 & 操作数\tabularnewline +%% \hline +%% \hline +%% 401.bzip2 & int & 1000000015 & 1607899217\tabularnewline +%% \hline +%% 429.mcf & int & 1000000012 & 1308544223\tabularnewline +%% \hline +%% 445.gobmk & int & 1000000014 & 1932674840\tabularnewline +%% \hline +%% 456.hmmer & int & 1000000013 & 1980694497\tabularnewline +%% \hline +%% 458.sjeng & int & 1000000010 & 1827828221\tabularnewline +%% \hline +%% 462.libquantum & int & 1000000011 & 1714852019\tabularnewline +%% \hline +%% 464.h264ref & int & 1000000017 & 1545541668\tabularnewline +%% \hline +%% 471.omnetpp & int & 1000000011 & 1971636254\tabularnewline +%% \hline +%% 473.astar & int & 1000000010 & 1702905457\tabularnewline +%% \hline +%% 410.bwaves & fp & 1000000011 & 1839010239\tabularnewline +%% \hline +%% 433.milc & fp & 1000000018 & 1285963875\tabularnewline +%% \hline +%% 434.zeusmp & fp & 1000000014 & 1524235186\tabularnewline +%% \hline +%% 435.gromacs & fp & 1000000013 & 1630938771\tabularnewline +%% \hline +%% 436.cactusADM & fp & 1000000014 & 1320986203\tabularnewline +%% \hline +%% 437.leslie3d & fp & 1000000010 & 1415843900\tabularnewline +%% \hline +%% 444.namd & fp & 1000000009 & 1333316425\tabularnewline +%% \hline +%% 450.soplex & fp & 1000000013 & 1664925057\tabularnewline +%% \hline +%% 454.calculix & fp & 1000000010 & 1691328153\tabularnewline +%% \hline +%% 459.GemsFDTD & fp & 1000000014 & 1320385828\tabularnewline +%% \hline +%% 470.lbm & fp & 1000000011 & 1191402714\tabularnewline +%% \hline +%% 482.sphinx3 & fp & 1000000016 & 1618883137\tabularnewline +%% \hline +%% \end{tabular} +%% \caption{SPEC CPU2006 各基准程序的指令数和操作数} +%% \label{tab:spec2006} +%% \end{table} 图\ref{fig:is_spec06_result}是每种配置的处理器运行 SPEC CPU2006 相对于 Baseline 的运行时间。 \begin{figure}[htbp] \centering - \includegraphics[width=0.8\textwidth]{result.eps} + \includegraphics[width=\textwidth]{result.eps} \caption{每种配置的处理器运行 SPEC CPU2006 的相对运行时间} \label{fig:is_spec06_result} \end{figure} @@ -168,6 +168,77 @@ Baseline 的运行时间。 从评测结果可以看出,在使用 DIFT 识别可能泄露数据的 load 指令后,推迟这 些指令的执行,有 15\% 的性能开销,平均性能开销比 InvisiSpec 小。在此基 础上,用 InvisiSpec 的方案执行这些 load 指令,可以进一步将性能开销减少 -至 8.5\%. +至 8.5\%. 其中在 IS+DIFT 方案中,有 12 个基准程序的性能开销在 3\% 以下, +6 个在 10\% 至 20\%. 性能开销最大的是 omnetpp, 所有安全的方案都会造成 +94\% 以上的性能开销。 + +为了观察使用基于信息流追踪的检测机制的效果,可以统计 IS 和 IS+DIFT 方 +案中 SpecLoad 请求的数量。 + +\begin{table} +\center +\begin{tabular}{|c|c|c|c|} +\hline +基准测试 & IS & IS+DIFT & SpecLoad 减少量\tabularnewline +\hline +\hline +astar & 592665385 & 337046726 & 43.13\%\tabularnewline +\hline +bwaves & 197767307 & 4175863 & 97.89\%\tabularnewline +\hline +bzip2 & 194937438 & 88235308 & 54.74\%\tabularnewline +\hline +cactusADM & 6789192 & 1730316 & 74.51\%\tabularnewline +\hline +calculix & 167229407 & 51778868 & 69.04\%\tabularnewline +\hline +GemsFDTD & 82999260 & 1731800 & 97.91\%\tabularnewline +\hline +gobmk & 243636621 & 50238751 & 79.38\%\tabularnewline +\hline +gromacs & 12385627 & 899474 & 92.74\%\tabularnewline +\hline +h264ref & 83954284 & 14540555 & 82.68\%\tabularnewline +\hline +hmmer & 188615797 & 95542441 & 49.35\%\tabularnewline +\hline +lbm & 16619502 & 4 & 100.00\%\tabularnewline +\hline +leslie3d & 84725917 & 1497323 & 98.23\%\tabularnewline +\hline +libquantum & 34125171 & 4306 & 99.99\%\tabularnewline +\hline +mcf & 138128311 & 27634366 & 79.99\%\tabularnewline +\hline +milc & 41388836 & 1224233 & 97.04\%\tabularnewline +\hline +namd & 35643072 & 11144890 & 68.73\%\tabularnewline +\hline +omnetpp & 117181327 & 38237525 & 67.37\%\tabularnewline +\hline +sjeng & 241108901 & 49780302 & 79.35\%\tabularnewline +\hline +soplex & 161218472 & 77026596 & 52.22\%\tabularnewline +\hline +sphinx3 & 107409895 & 22898074 & 78.68\%\tabularnewline +\hline +zeusmp & 102149604 & 431352 & 99.58\%\tabularnewline +\hline +\end{tabular} +\caption{DIFT 对 SPEC CPU2006 各基准测试的效果} +\label{tab:specload} +\end{table} + +可以看出,几乎所有的基准程序中,DIFT 可以过滤一半以上被认为不安全的装 +载操作,其中 bwaves, GemsFDTD, libquantum, milc 中,推测式执行中的装载 +指令只有 3\% 以下需要用安全的方式执行,因此使用 Fence+DIFT 即可以获得 +与 Baseline 几乎同等的性能。在 IS+DIFT 性能开销最大的 omnetpp 中, +SpecLoad 的数量只减少了 67\%,而性能开销接近 20\% 的 calculix 和 astar, +SpecLoad 减少的数量也在 70\% 以下。 + +%\Todo: 评测结果的分析 +\section{本章总结} -\Todo: 评测结果的分析 +本章先介绍了评测环境,列出了各个处理器配置的基本参数。其后给出了评测指 +标,包括安全性的测试和性能测试的指标。最后给出了安全测试的方法和结果, +以及用 SPEC CPU2006 进行性能评测得出的性能结果与分析。 |