From 9a98ba12badfec0d6908ce3466d3530626152c36 Mon Sep 17 00:00:00 2001 From: Iru Cai Date: Thu, 16 May 2019 04:10:45 +0800 Subject: upd --- chap/chap2.tex | 85 ++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 47 insertions(+), 38 deletions(-) (limited to 'chap/chap2.tex') diff --git a/chap/chap2.tex b/chap/chap2.tex index 1dcfdf2..0f68d0e 100644 --- a/chap/chap2.tex +++ b/chap/chap2.tex @@ -65,27 +65,25 @@ Meltdown 型攻击利用的是处理器异常产生的暂态指令,这些指 在现代处理器中,内核和用户进程之间的隔离通常由处理器的定义的权限位实现, 这一位定义了内核的页是否可以被访问。这一位只能在进入内核态时设置,并在 切换到用户态时清除。这个硬件特性使得操作系统可以将内核映射到每个进程的 -地址空间,在终端处理等事件中,可以高效地从用户进程切换至内核。因此,在 +地址空间,在中断等事件发生时,可以高效地从用户进程切换至内核。因此,在 操作系统的实现中,处理器从用户进程切换到内核时,不会改变内存映射。 -Meltdown 是一种新型攻击,它使得任何用户进程可以简单地读取所在机器的整个 +在 Meltdown\supercite{meltdown} 攻击中,任何用户进程都可以简单地读取所在机器的整个 内核内存(包括映射在内核区域中的所有物理内存),从而完全破坏内存隔 -离。Meltdown 不利用任何软件漏洞,适用于所有主流操作系统。Meltdown 利用 -大多数现代处理器中侧信道信息,可以用于 2010 年以来的现代 Intel 处理器, +离。Meltdown 不利用任何软件漏洞,适用于所有主流操作系统。Meltdown 利用了 +大多数现代处理器中的侧信道信息,可以用于 2010 年以来的现代 Intel 处理器, 也可能可用于其他厂商的处理器。 侧通道攻击通常需要非常具体地了解目标应用程序,并且只用于泄露其中的秘密 信息,但 Meltdown 允许攻击者在可被攻击的处理器上,通过运行代码获得整个 -内核地址空间的数据,包括任何映射在内核中的物理内存。Meltdown 的简单和 -强大来自乱序执行的副作用。 +内核地址空间的数据,包括任何映射在内核中的物理内存。Meltdown 之所以简单和强大,是因为它利用了乱序执行产生的副作用。 乱序执行是现代处理器用于提高性能的重要特性,用于隐藏功能单元的延迟,例 如,读取内存的功能单元需要等待存储器中的数据到达。现代处理器在遇到长延 -迟的执行时,不会停止执行,而是可以乱序操作,将后续的操作调度到空闲的功 -能单元中。然而,这些操作通常有预期之外的副作用,例如,在顺序和乱序执行 -中,时间差异都可能泄露信息。 +迟的执行时,不会使处理器停顿,而是可以乱序操作,将后续的操作调度到空闲的功 +能单元中。 -从安全角度来看,一个观察特别重要:易受攻击的乱序处理器允许非特权态的进 +从安全的角度,有一个发现很重要:易受攻击的乱序处理器允许非特权态的进 程将数据从特权(内核或物理)地址载入临时的寄存器中。进一步,处理器可以 基于该寄存器的值进行计算,例如用这个寄存器的值访问数组。如果一条指令不 应该执行,通过简单地丢弃访问内存得到的结果,处理器可以确保程序执行的正 @@ -98,15 +96,6 @@ Meltdown 是一种新型攻击,它使得任何用户进程可以简单地读 蔽信道的接收端,找出这个临时寄存器的值。因此,在微架构层次,即实际的 硬件实现中,存在可利用的安全性问题。 -Meltdown 打破了处理器内存隔离功能提供的所有安全保障。这种攻击可以用于现 -代台式机、笔记本电脑以及云服务器。 Meltdown 允许非特权进程读取映射在内 -核地址空间中的数据,包括 Linux,Android 和 OS X 上的整个物理内存,以 -及 Windows 上的大部分物理内存。这些内存可能包含其他进程的物理内存,以及 -内核共享的容器沙箱(如 Docker,LXC)或半虚拟化模式下的 Xen 中,虚拟化管 -理程序的内存,和其他虚拟化实例的内存。Meltdown 攻击的性能取决于处理器速 -度、TLB 和高速缓存大小、DRAM 速度等,可以以 3.2KB/s 到 503KB/s 的速度 -读取内核内存。因此,大量系统受到影响。 - % background: address spaces 为了将不同的进程相互隔离,处理器支持虚拟地址空间,它将虚拟地址翻译为物 理地址。虚拟地址空间将内存划分为一系列的页,系统通过多级页表将虚拟页翻 @@ -131,7 +120,7 @@ Meltdown 打破了处理器内存隔离功能提供的所有安全保障。这 可以读取内核地址空间的数据,在产生异常前,攻击者构造的暂态指令序列可以 将读取到的数据通过隐蔽信道发送给攻击者。 -以下是一段 Meltdown 攻击的示例代码,通过它可以读取内核地址空间的数据: +图\ref{lst:meltdown}是一段 Meltdown 攻击的示例代码,通过它可以读取内核地址空间的数据: \begin{figure} \centering @@ -147,13 +136,22 @@ mov rbx, qword [rbx + rax] ; 访问探测数组 \label{lst:meltdown} \end{figure} -以上 X86 指令读取了以 rcx 为地址的内核空间的数据,在用户态下,这个读取 +这段 X86 指令读取了以 rcx 为地址的内核空间的数据,在用户态下,这个读取 内核空间数据的指令会产生异常,但是在处理器产生异常之前,这条指令可以将 内核空间的数据读至寄存器,并且其后的指令也会执行,访问 rbx 指向的探测数 组。在处理器回卷了产生异常的指令和其后执行的指令后,高速缓存中仍然保留 了探测数组和内核数据相关的元素,从而攻击者可以通过扫描探测数组的每一 项,观察访问时间,以推测内核空间数据的值。 +Meltdown 打破了处理器内存隔离功能提供的所有安全保障。这种攻击可以用于现 +代台式机、笔记本电脑以及云服务器。 Meltdown 允许非特权进程读取映射在内 +核地址空间中的数据,包括 Linux,Android 和 OS X 上的整个物理内存,以 +及 Windows 上的大部分物理内存。这些内存可能包含其他进程的物理内存,以及 +内核共享的容器沙箱(如 Docker,LXC)或半虚拟化模式下的 Xen 中,虚拟化管 +理程序的内存,和其他虚拟化实例的内存。Meltdown 攻击的性能取决于处理器速 +度、TLB 和高速缓存大小、DRAM 速度等,可以以 3.2KB/s 到 503KB/s 的速度 +读取内核内存。因此,大量系统受到影响。 + \subsubsection{Foreshadow} % foreshadow introduction @@ -392,7 +390,7 @@ mov rax, dword [mem + rax] 据。在 Intel Core i7-5600U 处理器中,可以以 3.3MB/s 的速度泄露一个 AVX 寄存器的数据。 -\subsection{Spectre型攻击} +\subsection{Spectre 型攻击} Spectre 型攻击利用处理器对控制流或数据流的预测,并进行推测式执行产生的 暂态指令。Spectre 型攻击中,暂态指令访问的是程序在体系结构层面能访问的 @@ -401,8 +399,8 @@ Spectre 型攻击利用处理器对控制流或数据流的预测,并进行推 推测式执行的常见形式是控制流的推测式执行。控制流的推测式执行依赖于转移 预测技术,包含了分支的预测、间接转移目标地址的预测和函数返回地址的预测, 对应于 Spectre 攻击中 Spectre-PHT, Spectre-BTB, Spectre-RSB. 此外,处 -理器预测 load 指令和程序序列之前访问地址未知的 store 指令地址不冲突, -推测式执行这样的 load 指令,它对应 Spectre-STL. +理器预测装载指令和程序序列之前访问地址未知的存储指令地址不冲突, +推测式执行这样的装载指令,它对应 Spectre-STL. %%%% gtran: branch prediction @@ -500,12 +498,12 @@ if (x < array1_size) \begin{figure}[htbp] \centering - \includegraphics[width=0.8\textwidth]{spectre_v1.eps} + \includegraphics[width=0.4\textwidth]{spectre_v1.eps} \caption{边界检查结果和分支预测方向的可能情形\supercite{spectre}} \label{fig:spectre_v1} \end{figure} -图\label{fig:spectre_v1}是边界检查结果和预测的方向的四种组合。在已知边 +图\ref{fig:spectre_v1}是边界检查结果和预测的方向的四种组合。在已知边 界检查的结果之前,处理器预测最可能的结果,推测式地执行边界检查之后的代 码。导致边界检查的结果不能及时得出的原因很多,如边界检查期间发生缓存缺 失,缺少空闲的执行单元,存在复杂的数据依赖。在这些情况下,正确预测的可 @@ -614,7 +612,7 @@ ARM 处理器上进行验证,确认它们受 Spectre v1 的影响。 在一个存储缓冲区(store buffer),往存储系统写入的数据在指令提交前将写 入数据的地址和值存放在这个缓冲区中,后续的指令要使用这个地址的值时,可 以将缓冲区中的数据转发给需要的指令。推测式缓冲区溢出利用了这个特性,例 -如以下程序: +如图\ref{lst:spec-buf-overflow}中的程序: \begin{figure} \centering @@ -624,7 +622,7 @@ ARM 处理器上进行验证,确认它们受 Spectre v1 的影响。 if (x < len) a[x] = z; \end{minted} -\end{figure} +\end{figure} 攻击者给出一个超过数组 \verb|a| 大小的 \verb|x| 时,在推测式执行时,会 将 \verb|a[x]| 的地址和攻击者输入的值 \verb|z| 写入至存储缓冲区。如果 @@ -647,7 +645,7 @@ Spectre v2 利用间接转移的推测式执行,用于预测间接转移的主 \begin{figure}[htbp] \centering - \includegraphics[width=0.8\textwidth]{spectre_v2.eps} + \includegraphics[width=0.4\textwidth]{spectre_v2.eps} \caption{转移预测器在不同上下文中训练和使用\supercite{spectre}} \label{fig:spectre_v2} \end{figure} @@ -720,16 +718,27 @@ Intel 处理器的 BTB.\supercite{jump-over-aslr} \subsubsection{Spectre-RSB} -返回栈(RSB)用于预测程序函数调用的返回地址。如果 RSB 中的返回地址和实 -际返回地址不同,则会产生错误的推测式执行, -SpectreRSB\supercite{spectre-returns}\supercite{ret2spec} 利用了这种错 -误的推测式执行进行攻击。 +返回栈(RSB)用于预测程序函数调用的返回地址。RSB 是一个栈结构,当函数调用指令执行时,处理器将返回地址压入 RSB,用于该函数调用对应的返回指令执行时,预测返回的目标地址。当函数返回时,处理器从 RSB 的栈顶得到一个地址,作为预测的返回地址,处理器从这个地址开始推测式执行。当处理器从体系结构的软件栈中得到返回地址,该地址和预测的返回地址相同时,推测式执行正确,否则推测式执行错误。 + +Spectre-RSB\supercite{spectre-returns}\supercite{ret2spec} 利用了 RSB +预测返回地址错误,导致错误的推测式执行。RSB 预测返回地址错误有四种原因。 + +第一个原因是由于 RSB 大小有限,会产生上溢和下溢的行为。RSB 的大小通常 +和程序调用栈的大小相匹配。调用深度超过 RSB 的大小时,会造成RSB 溢出, +覆盖其中最老的条目,在函数返回时,会发生 RSB 下溢出。在 RSB 下溢出时, +不同处理器用不同方式处理 RSB 为空的情形,如 Intel 的处理器使用 BTB 进 +行转移预测,攻击者可以用 Spectre-BTB 的攻击方式进行攻击。 + +第二个原因是直接污染 RSB,在这种场景下,攻击者可以替换或删除软件调用栈 +中的值,从而 RSB 中的值和软件栈中的值不同,导致错误的推测式执行。 + +第三种方法是推测式污染 RSB. 在一个函数调用指令推测式执行时,返回地址进 +入软件栈和 RSB,当推测式执行错误时,虽然调用指令被撤销,但返回地址仍然 +在 RSB 中。 -Spectre-RSB 的利用方式包括使 RSB 溢出,及污染 RSB. RSB 的大小为普通程 -序函数调用深度,调用深度超过 RSB 的大小时,会造成RSB 溢出,覆盖其中最 -老的条目,在函数返回时,会发生 RSB 下溢出。而有的处理器在 RSB 为空时, -使用 BTB 进行转移预测,攻击者可以用 Spectre-BTB 的攻击方式进行攻击。污 -染 RSB 的方法包括在处理器的不同上下文中使用 RSB,推测式污染 RSB 等。 +第四种方法是跨上下文使用 RSB. 因为上下文切换时,正在执行线程的 RSB 会 +被新的线程使用,如果新的线程执行返回指令,则会从原线程提供的 RSB 中的 +地址处进行推测式执行。 \subsubsection{Spectre-STL} -- cgit v1.2.3