summaryrefslogtreecommitdiff
path: root/chap/chap2.tex
diff options
context:
space:
mode:
Diffstat (limited to 'chap/chap2.tex')
-rw-r--r--chap/chap2.tex528
1 files changed, 239 insertions, 289 deletions
diff --git a/chap/chap2.tex b/chap/chap2.tex
index 7f6b4f8..576da48 100644
--- a/chap/chap2.tex
+++ b/chap/chap2.tex
@@ -28,7 +28,7 @@ Diffie-Hellman,RSA 等密码的私钥。\supercite{TimingAttack} 这是最早
的数据时,访问这个地址的时间更短,利用这个性质,攻击者可以得知一个地址
是否曾经被访问过。缓存计时攻击的常见形式有:
-\begin{itemize}
+\begin{enumerate}
\item Evict+Time: 攻击者清除一个缓存组,然后对一个算法的运行进行计时,
检查它的运行时间是否受到影响
\item Prime+Probe: 受害者运行一段程序后,攻击者访问缓存某一组的每一路,
@@ -36,8 +36,9 @@ Diffie-Hellman,RSA 等密码的私钥。\supercite{TimingAttack} 这是最早
\item Flush+Reload: 攻击者利用 x86 的 clflush 等指令清除一个共享内存地
址对应的缓存行,在受害者运行一段程序后,攻击者重新装载该行对应的地址
的数据,通过测量访问时间推断受害者是否访问了这个共享的地址
-\end{itemize}
+\end{enumerate}
+% TODO: more side channels
\section{Meltdown 和 Spectre 攻击的各种变体}
处理器在执行指令遇到异常,或者推测式执行了错误的指令后,会回卷错误执行
@@ -47,7 +48,7 @@ instruction)。Meltdown\supercite{meltdown} 和
Spectre\supercite{spectre} 是最早发现的两个利用暂态指令的攻击。此后发现
了更多的 Meltdown 和 Spectre 的变体。为了找出更多的攻击类型和分析它们的
防御方案,Claudio Canella 等人对这些攻击及其防御做了系统性的研
-究\supercite{systematic},将所有暂态执行攻击分为 Meltdown型攻击
+究\supercite{systematic},将所有暂态执行攻击分为 Meltdown 型攻击
和 Spectre 型攻击两类。
\subsection{Meltdown 型攻击}
@@ -59,53 +60,47 @@ Meltdown 型攻击利用的是处理器异常产生的暂态指令,这些指
\subsubsection{“熔断”(Meltdown)攻击}
内存隔离是现代操作系统的核心安全功能之一。操作系统确保用户程序无法访问
-其他程序的内存或内核的内存。这种隔离是现代计算环境的基石,使得系统上可
+其他程序或内核空间的内存区域。现代计算环境利用这种隔离,使得系统上可
以同时运行多个应用程序,和多个用户的进程。
-在现代处理器中,内核和用户进程之间的隔离通常由处理器的定义的权限位实现,
-这一位定义了内核的页是否可以被访问。这一位只能在进入内核态时设置,并在
-切换到用户态时清除。这个硬件特性使得操作系统可以将内核映射到每个进程的
-地址空间,在中断等事件发生时,可以高效地从用户进程切换至内核。因此,在
-操作系统的实现中,处理器从用户进程切换到内核时,不会改变内存映射。
+在现代处理器中,内核和用户进程之间的隔离,通常由处理器定义的一个权限位
+实现,它定义了内核的页是否可以被访问。这一位只能在进入内核态时设置,并
+在切换到用户态时清除。这个硬件特性使得操作系统可以将内核映射到每个进程
+的地址空间,在中断等事件发生时,可以在不改变内存地址映射的条件下,高效
+地从用户进程切换至内核。
-在 Meltdown\supercite{meltdown} 攻击中,任何用户进程都可以简单地读取所在机器的整个
-内核内存(包括映射在内核区域中的所有物理内存),从而完全破坏内存隔
-离。Meltdown 不利用任何软件漏洞,适用于所有主流操作系统。Meltdown 利用了
-大多数现代处理器中的侧信道信息,可以用于 2010 年以来的现代 Intel 处理器,
-也可能可用于其他厂商的处理器。
+Meltdown\supercite{meltdown} 攻击使得任何用户进程都可以简单地读取所在
+机器的整个内核区域的内存(包括映射在内核区域中的所有物理内存),从而完
+全破坏了内存隔离。Meltdown 不利用任何软件漏洞,而是利用了现代处理器中
+的侧信道,适用于所有主流的操作系统。这种攻击可以用于 2010 年以来的现代
+Intel 处理器,也可能可用于其他厂商的处理器。
侧通道攻击通常需要非常具体地了解目标应用程序,并且只用于泄露其中的秘密
-信息,但 Meltdown 允许攻击者在可被攻击的处理器上,通过运行代码获得整个
-内核地址空间的数据,包括任何映射在内核中的物理内存。Meltdown 之所以简单和强大,是因为它利用了乱序执行产生的副作用。
-
-乱序执行是现代处理器用于提高性能的重要特性,用于隐藏功能单元的延迟,例
-如,读取内存的功能单元需要等待存储器中的数据到达。现代处理器在遇到长延
-迟的执行时,不会使处理器停顿,而是可以乱序操作,将后续的操作调度到空闲的功
-能单元中。
-
-从安全的角度,有一个发现很重要:易受攻击的乱序处理器允许非特权态的进
-程将数据从特权(内核或物理)地址载入临时的寄存器中。进一步,处理器可以
-基于该寄存器的值进行计算,例如用这个寄存器的值访问数组。如果一条指令不
-应该执行,通过简单地丢弃访问内存得到的结果,处理器可以确保程序执行的正
-确性。因此,在体系结构层次,即处理器执行计算的抽象定义下,不会出现安全
-问题。
-
-但是,乱序执行中的内存访问会影响缓存,而缓存的状态又可以通过缓存侧通道
-进行检测。因此,攻击者可以通过在乱序执行的指令流中,读取特权态的内存来,
-来得到整个内核内存的数据,并通过微体系结构隐蔽通道传送出来,然后攻击者在隐
-蔽信道的接收端,找出这个临时寄存器的值。因此,在微体系结构层次,即实际的
-硬件实现中,存在可利用的安全性问题。
+信息,但在易受攻击的处理器上,利用 Meltdown 攻击,可以通过运行代码获得
+整个内核地址空间的数据,包括任何映射在内核中的物理内存。
+
+在一个易受攻击的乱序处理器中,处理器允许非特权态的进程将数据从特权地址
+装载至临时的寄存器中。进一步,处理器可以使用该寄存器的值进行计算,例如
+用这个寄存器的值访问数组。如果一条指令不应该执行,通过简单地丢弃访问内
+存得到的结果,处理器可以确保程序执行的正确性。因此,在体系结构层次,即
+处理器执行计算的抽象定义下,不会出现安全问题。
+
+但是,乱序执行中的内存访问会改变缓存状态,而缓存的状态又可以通过缓存侧
+通道进行检测。因此,攻击者可以通过在乱序执行的指令流中,读取特权态的内
+存,来得到整个内核内存的数据,并通过微体系结构隐蔽通道传送出来,然后攻
+击者在隐蔽信道的接收端,找出这个临时寄存器的值。因此,在微体系结构层次,
+即实际的硬件实现中,存在可利用的安全性问题。
% background: address spaces
-为了将不同的进程相互隔离,处理器支持虚拟地址空间,它将虚拟地址翻译为物
-理地址。虚拟地址空间将内存划分为一系列的页,系统通过多级页表将虚拟页翻
-译为物理页。页表是一个多级的结构,存放虚拟页到物理页的映射,同时,它还
-保存了每个页的保护属性,用于处理器进行权限检查,例如可读、可写、可执行、
-用户可读等。操作系统中每一个运行中的进程有一个对应的页表,页表所在的位
-置存放在处理器中的一个特定寄存器中,在上下文切换时,操作系统会更新这个
-寄存器,从而切换到处理器的进程可以使用这个进程对应的页表。利用这个机制,
-每个进程的虚拟地址空间映射到不同的物理区域,每个进程只能使用自己地址空
-间中的数据,从而达到进程间隔离的效果。
+为了将不同的进程相互隔离,处理器为操作系统提供了虚拟地址空间机制,它将
+虚拟地址翻译为物理地址。虚拟地址空间将内存划分为一系列的页,系统通过多
+级页表将虚拟页翻译为物理页。页表是一个多级的结构,存放虚拟页到物理页的
+映射,同时,它还保存了每个页的保护属性,用于处理器进行权限检查,例如可
+读、可写、可执行、用户可读等。操作系统中每一个运行中的进程有一个对应的
+页表,页表所在的位置存放在处理器的一个特定的寄存器中,在上下文切换时,
+操作系统更新这个寄存器,切换至处理器上的新进程可以使用这个进程对应的页
+表。利用这个机制,每个进程的虚拟地址空间映射到不同的物理内存区域,每个
+进程只能使用自己地址空间中的数据,从而达到进程间隔离的效果。
每个地址空间都可以分为用户地址空间和内核地址空间。正在运行的进程可以访
问用户地址空间,而内核地址空间只有进入内核态后可以访问,操作系统通过在
@@ -115,10 +110,10 @@ Meltdown 型攻击利用的是处理器异常产生的暂态指令,这些指
操作系统将内核地址空间映射至每个用户进程的地址空间中。处理器执行访存指
令时,在将虚拟地址翻译为物理地址的时候,检查地址对应的权限位,判断用户
-是否可访问该地址。Meltdown攻击中,攻击者让处理器从用户不可访问的内核地
-址装载数据至寄存器,由于所有内核地址都可以翻译为合法的物理地址,处理器
-可以读取内核地址空间的数据,在产生异常前,攻击者构造的暂态指令序列可以
-将读取到的数据通过隐蔽信道发送给攻击者。
+空间的指令是否可访问该地址。在 Meltdown 攻击中,攻击者让处理器从用户不
+可访问的内核地址装载数据至寄存器,由于所有内核地址都可以翻译为合法的物
+理地址,处理器可以读取内核地址空间的数据,在产生异常前,攻击者构造的暂
+态指令序列可以将读取到的数据通过隐蔽信道发送给攻击者。
图\ref{lst:meltdown}是一段 Meltdown 攻击的示例代码,通过它可以读取内核地址空间的数据:
@@ -136,72 +131,71 @@ mov rbx, qword [rbx + rax] ; 访问探测数组
\label{lst:meltdown}
\end{figure}
-这段 X86 指令读取了以 rcx 为地址的内核空间的数据,在用户态下,这个读取
+这段 x86 指令读取了以 rcx 为地址的内核空间的数据,在用户态下,这个读取
内核空间数据的指令会产生异常,但是在处理器产生异常之前,这条指令可以将
-内核空间的数据读至寄存器,并且其后的指令也会执行,访问 rbx 指向的探测数
-组。在处理器回卷了产生异常的指令和其后执行的指令后,高速缓存中仍然保留
-了探测数组和内核数据相关的元素,从而攻击者可以通过扫描探测数组的每一
+内核空间的数据读至寄存器,并且其后的指令也会执行,访问 rbx 指向的探测
+数组。在处理器回卷了产生异常的指令和其后执行的指令后,高速缓存中仍然保
+留了探测数组和内核数据相关的元素,从而攻击者可以通过扫描探测数组的每一
项,观察访问时间,以推测内核空间数据的值。
-Meltdown 打破了处理器内存隔离功能提供的所有安全保障。这种攻击可以用于现
-代台式机、笔记本电脑以及云服务器。 Meltdown 允许非特权进程读取映射在内
-核地址空间中的数据,包括 Linux,Android 和 OS X 上的整个物理内存,以
-及 Windows 上的大部分物理内存。这些内存可能包含其他进程的物理内存,以及
-内核共享的容器沙箱(如 Docker,LXC)或半虚拟化模式下的 Xen 中,虚拟化管
-理程序的内存,和其他虚拟化实例的内存。Meltdown 攻击的性能取决于处理器速
-度、TLB 和高速缓存大小、DRAM 速度等,可以以 3.2KB/s 到 503KB/s 的速度
-读取内核内存。因此,大量系统受到影响。
+Meltdown 打破了处理器内存隔离功能提供的所有安全保障。这种攻击可以用于
+现代台式机、笔记本电脑以及云服务器。 Meltdown 允许非特权进程读取映射在
+内核地址空间中的数据,包括 Linux,Android 和 OS X 上的整个物理内存,以
+及 Windows 上的大部分物理内存。这些内存可能包含其他进程的物理内存,以
+及内核共享的容器沙箱(如 Docker,LXC)或半虚拟化模式下的 Xen 中,虚拟
+化管理程序的内存,和其他虚拟化实例的内存。Meltdown 攻击可以以 3.2KB/s
+到 503KB/s 的速度读取内核内存。
\subsubsection{“预兆”(Foreshadow)攻击}
% foreshadow introduction
-由于现代广泛使用的操作系统和应用程序的大小可以轻松地达到数百万行代码,
-并且单个漏洞通常会破坏所有安全保证,所以在安全上很难信任现有的操作系统
-和应用程序。为了应对这些挑战,学术界和工业界开发了可信执行环境
-(Trusted Execution Environment, TEE),其中包含一个处理器常规执行环境
-之外的非分层保护模型,用于隔离应用程序,称为隔离区(enclave)。 TEE 利
-用只含有处理器和微码的最小可信计算基础(Trusted Computing Base),来保
-证相互不信任的隔离区的保密性和完整性。 每个隔离区的私有处理器和
-内存状态只可以由其内部运行的代码访问,并且在任何特权级别(包括潜在的恶
- 意操作系统和虚拟机管理程序)上运行的所有其他隔离区和软件都无法访
-问。除了强大的内存隔离外,TEE 通常还提供一个证明(attestation)原语,
-从而可以本地或远程地在运行时从密码学上验证特定的隔离区已经加载到真
-正的(因而被认为是安全的)TEE 处理器上。
-
-随着 2013 年 Intel 软件防护扩展(Software Guard eXtention,
-SGX)\supercite{sgx}的发布,硬件强制的 TEE 隔离和证明可以在现成的x86处
-理器上使用。由于 Intel SGX 承诺的强大安全保障,越来越多的行业参与者将这
-项技术应用于可受攻击者控制的机器上,需要安全执行的各种应用程序中。Open
-Whisper Systems 依靠 SGX 在 Signal 网络中实现隐私友好的联系人发现功
-能。\supercite{signal-sgx} 微软和 IBM 最近都宣布在其云基础架构中支
-持 SGX。各种现成的蓝光播放器以及 4K Netflix 客户端使用 SGX 对高分辨率视
-频流实施数字版权管理(DRM)。新兴的加密货币\supercite{mobilecoin}和的区
-块链\supercite{sawtooth}技术更加依赖于 SGX 的正确性。
-
-然而,当前的 SGX 实现并没有满足它的安全目标。Foreshadow 攻击利用现
-代 Intel 处理器中的乱序执行机制,可以从处理器的缓存中泄露明文
-的隔离区数据。Foreshadow 攻击的核心是利用 Meltdown 攻击相同的处理器
-漏洞,即处理器的访问控制逻辑允许攻击者在瞬态的乱序执行指令回滚之前,使
-用未授权内存访问的结果。然而,Meltdown 攻击针对传统的分层保护域,
-而 Foreshadow 考虑了一种非常不同的攻击模型,攻击者的目标不是从用户空间
-读取内核内存,而是破坏最先进的地址空间内隔离区保护域,它不在已经部署
-的用于防御 Meltdown 的内核页表隔离技术的保护之内。Foreshadow 使用了一
-种新的漏洞利用方法,并且基本的攻击完全可以由无特权的攻击者使用,而无需
-用 root 权限访问受害者机器。对于有 root 权限的攻击者,还可以使用一组可
-选的内核级优化技术,进一步降低 Foreshadow 攻击的噪声。
-
-Foreshadow 对 Intel SGX 所追求的安全模型产生了深远的影响,在没有微码补
-丁的情况下,当前的SGX处理器无法保证隔离区的数据保密性,也无法证
-明隔离区执行的完整性,包括英特尔自己的隔离区架构。此外,尽管 SGX
-希望内核级别的攻击者,但现有的 SGX 处理器甚至无法在没有特权的用户空间
-攻击者面前保护隔离区中的秘密数据。
-
-所有先前已知的针对 SGX 的攻击都依赖于软件特定的侧信道泄露或软件漏
-洞。 人们普遍认为,精心编写的隔离区可以通过坚持良好的编码实践,例如
-不使用依赖秘密数据的分支,来防止信息泄露。Intel 认为这些攻击都没有破
-坏 SGX 的安全保证,防止侧信道攻击应该是隔离区开发者的责任。 然
-而,Foreshadow 否定了这一论点,因为它完全依赖于基本的 Intel x86 处理器
-的行为,并且不利用任何软件漏洞,甚至不需要知道受害者隔离区的源代码。
+现代广泛使用的操作系统和应用程序的大小可以轻松地达到数百万行代码,并且
+单个漏洞通常会破坏所有安全保证,所以在安全上,现有的操作系统和应用程序
+难以信任。为了应对这些挑战,学术界和工业界开发了可信执行环境(Trusted
+ Execution Environment, TEE),其中包含一个处理器常规执行环境之外的非
+分层保护模型,用于隔离应用程序,称为隔离区(enclave)。 TEE 利用只含有
+处理器和微码的最小可信计算基(Trusted Computing Base),来保证相互不信
+任的隔离区的保密性和完整性。 每个隔离区的私有处理器和内存状态只可以由
+其内部运行的代码访问,并且在任何特权级别(包括潜在的恶意操作系统和虚拟
+ 机管理程序)上运行的软件和所有其他隔离区都无法访问。除了强大的内存隔
+离外,TEE 通常还提供一个证明(attestation)原语,从而可以从本地或远程,
+在运行时从密码学上验证特定的隔离区已经加载到真正的(因而被认为是安全的)
+TEE 处理器上。
+
+2013 年发布的 Intel 软件防护扩展(Software Guard eXtention, SGX)
+\supercite{sgx},使得 x86 处理器可以使用硬件强制的 TEE 隔离和证明。
+Intel SGX 承诺的强大安全保障,使越来越多的行业参与者将这项技术应用于可
+受攻击者控制的机器上,和需要安全执行的各种应用程序中。Open Whisper
+Systems 依靠 SGX 在 Signal 网络中实现隐私友好的联系人发现功能
+\supercite{signal-sgx} 。微软和 IBM 最近都宣布在其云基础架构中支持 SGX。
+各种现成的蓝光播放器以及 4K Netflix 客户端使用 SGX 对高分辨率视频流实
+施数字版权管理(DRM)。新兴的加密货币\supercite{mobilecoin}和的区块链
+\supercite{sawtooth}技术更是依赖于 SGX 的正确性。
+
+然而,Foreshadow\supercite{foreshadow} 攻击表明,当前的 SGX 实现并没有
+满足它的安全目标。Foreshadow 攻击利用现代 Intel 处理器中的乱序执行机制,
+可以从处理器的缓存中泄露明文的隔离区数据。Foreshadow 和 Meltdown 利用
+相似的处理器漏洞,处理器的控制逻辑允许攻击者在暂态的乱序执行指令回滚之
+前,使用未授权的内存访问的结果。和 Meltdown 攻击针对传统的分层保护域不
+同,Foreshadow 考虑了一种非常不同的攻击模型,攻击者的目标不是从用户空
+间读取内核内存,而是破坏最先进的地址空间内隔离区保护域,它不在已经部署
+的用于防御 Meltdown 的内核页表隔离技术的保护之内。在 Foreshadow 攻击中,
+无特权的普通用户即可完成基本的攻击,而无需以 root 的身份访问受害者机器。
+对于有 root 权限的攻击者,还可以使用一组可选的内核级优化技术,进一步降
+低 Foreshadow 攻击的噪声。
+
+Foreshadow 破坏了 Intel SGX 的安全模型,在没有微码补丁的情况下,当前的
+SGX 处理器无法保证隔离区的数据保密性,也无法证明隔离区执行的完整性,包
+括英特尔自己的隔离区架构。此外,尽管 SGX 期望可以防御内核级别的攻击者,
+但现有的 SGX 处理器甚至无法在没有特权的用户空间攻击者面前保护隔离区中
+的秘密数据。
+
+所有先前已知的针对 SGX 的攻击都依赖于软件特定的侧信道泄露或软件漏洞。
+人们普遍认为,精心编写的隔离区可以通过坚持良好的编码实践,例如不使用依
+赖秘密数据的分支,来防止信息泄露。这些攻击都没有破坏 Intel 定义的 SGX
+的安全保证,防止侧信道攻击应该是隔离区开发者的责任。 然而,Foreshadow
+否定了这一论点,因为它完全依赖于基本的 Intel x86 处理器的行为,并且不
+利用任何软件漏洞,甚至不需要知道受害者隔离区的源代码。
% foreshadow attack
\begin{figure}[htbp]
@@ -211,44 +205,45 @@ Foreshadow 对 Intel SGX 所追求的安全模型产生了深远的影响,在
\label{fig:addr-tran}
\end{figure}
-在现代 Intel x86 处理器中,用一个虚拟内存地址访问内存时,处理器先在TLB
-中查询对应的物理地址,如果 TLB 中没有这个地址对应的项,则会在页表中找到
-虚拟地址对应的页表项,以获得对应的物理地址和访问权限信息。
-如果在虚拟机环境中,则需要如图 \ref{fig:addr-tran} 所示,增加一个扩展
-页表(Extended Page Table,EPT)的访问过程,将客户机的物理地址翻译为底
-层物理机的物理地址。最后,启用了 Intel SGX 的处理器还会进一步检查地址
-翻译的结果,确保这个地址翻译遵守硬件强制的隔离区访问控制限制。如果
-这三个独立的阶段报告一个访问违例,则处理器抛出一个页错误,控制流转向异
-常处理代码,而对于 SGX,大多数的隔离区内存违例会被处理器忽视,将内
-存装载指令得到的值设为 abort page 的值 -1.
+在现代 Intel x86 处理器中,用一个虚拟内存地址访问内存时,处理器先在
+TLB 中查询对应的物理地址,如果 TLB 中没有这个地址对应的项,则会在页表
+中找到虚拟地址对应的页表项,以获得对应的物理地址和访问权限信息。图
+\ref{fig:addr-tran} 展示了访问页表的过程。如果是在虚拟机环境中,则需要
+增加一个扩展页表(Extended Page Table,EPT)的访问过程,将客户机的物理
+地址翻译为底层物理机的物理地址。最后,启用了 Intel SGX 的处理器还会进
+一步检查地址翻译的结果,确保这个地址翻译遵守硬件强制的隔离区访问控制限
+制。如果这三个独立的阶段出现了一个访问违例,则处理器抛出一个页错误,控
+制流转向异常处理代码,而在启用了 SGX 的处理器中,大多数的隔离区内存违
+例会被处理器忽视,将内存装载指令得到的值设为 abort page 的值 -1.
在体系结构层次上,以上的地址翻译过程在文档中有精确的描述。现代处理器为
-了加快地址翻译和内存访问,使用了并行访问和额外的缓存结构。在 Meltdown类
-型的攻击中,可以发现 Intel 的 CPU 将内存访问违例检查放到了指令提交的时
-间,使得在页错误发生之前,未授权的内存内容仍然可以到达流水线中其后执行
-的乱序执行的指令。Meltdown 攻击利用了这个时间窗口,在暂态指令中,将只有
-特权态能访问的内存编码至持久的微体系结构状态。
-
-现代 Intel 处理器使用虚拟地址索引,物理地址标签的一级缓存。如
-图\ref{fig:addr-tran} 所示,这种缓存索引方式使得地址翻译可以和一级缓存
-的查询并行。在得到虚拟地址对应的一级缓存组后,处理器还需要知道是否有某
-一路缓存含有需要的数据,因此处理器要将地址翻译得到的物理地址和缓存每一
-路的物理地址标签对比,在某一个有效的缓存路存在正确的物理地址时,此时一
-级缓存命中,数据返回至处理器的执行单元。
-
-Foreshadow\supercite{foreshadow} 是一种可以读取 Intel SGX 隔离区中秘
-密数据的 Meltdown 型攻击。如果对 SGX 使用 Meltdown 攻击,攻击者读取未授
-权的隔离区内存,不会产生异常,而是读出 abort page 值 -1. 但是 abort
-page 只在页权限检查通过后发生,攻击者可以将该页 present 位清除,即将该
-页设为不存在,此时处理器便会产生异常,但由于一级缓存使用虚拟地址索引,
-因此仍然可以从一级缓存读取该虚拟地址中的数据,从而暂态指令可以泄露 SGX
-隔离区中的数据。
-
-通过将一个页设为不存在,绕过地址翻译,从一级缓存读取数据的攻击方
-式,Intel 将其称为L1终端错误(L1 Terminal
-Fault)\supercite{l1tf}。Foreshadow-NG\supercite{foreshadowNG} 利用相同
-的原理,新增了Foreshadow-OS 和 Foreshadow-VMM 两种 Foreshadow 类型的攻
-击,可以绕过操作系统和虚拟机的隔离。
+了加快地址翻译和内存访问,使用了并行访问和额外的缓存结构。在 Meltdown
+类型的攻击中,可以发现 Intel 的 CPU 将内存访问违例检查放到了指令提交的
+时间,使得在页错误发生之前,未授权的内存内容仍然可以到达流水线中其后执
+行的乱序执行的指令。Meltdown 攻击利用了这个时间窗口,在暂态指令中,将
+只有特权态能访问的内存编码至持久的微体系结构状态。
+
+现代 Intel 处理器使用虚拟地址索引,物理地址标签的一级缓存。如图
+\ref{fig:addr-tran} 所示,这种缓存索引方式使得地址翻译可以和一级缓存的
+查询并行。在得到虚拟地址对应的一级缓存组后,处理器还需要知道是否有某一
+路缓存含有需要的数据,因此处理器要将地址翻译得到的物理地址和这组缓存每
+一路的物理地址标签对比,在某一个有效的缓存路存在正确的物理地址时,
+一级缓存命中,数据返回至处理器的执行单元。
+
+如果启用 SGX 的处理器使用 Meltdown 攻击,攻击者读取未授权的隔离区内存
+时,不会产生异常,而是读出 abort page 值 -1. 但是 abort page 只在页权
+限检查通过后发生,攻击者可以将该页的存在(present)位清除,即将该页设
+为不存在,此时处理器便会产生异常,但由于一级缓存使用虚拟地址索引,因此
+仍然可以从一级缓存读取该虚拟地址中的数据,从而暂态指令可以泄露 SGX 隔
+离区中的数据。
+
+% TODO: 在哪些处理器上能用这些攻击
+
+通过将一个页设为不存在,绕过地址翻译,从一级缓存读取数据的攻击方式,
+Intel 将其称为L1终端错误(L1 Terminal Fault)\supercite{l1tf}。 利用相
+同的原理,Foreshadow-NG\supercite{foreshadowNG} 新增了Foreshadow-OS 和
+Foreshadow-VMM 两种 Foreshadow 类型的攻击,可以绕过操作系统和虚拟机的
+隔离。
% forshadow-OS
@@ -262,44 +257,44 @@ Fault)\supercite{l1tf}。Foreshadow-NG\supercite{foreshadowNG} 利用相同
间解引用未映射的页将导致终端错误。
Foreshadow-OS 利用了这种错误造成的暂态执行的指令。虽然访问页表中标记为
-不存在的页会触发终端错误存在,在页表项中的元数据表示在缓存中的物理地址
-的情况下,处理器仍然将一级数据高速缓存中未授权数据传递到暂态乱序执行中。
-然后可以和其他暂态执行攻击一样,将秘密数据从微体系结构暂态执行域带入体系结
-构状态中,例如,使用基于缓存的隐蔽通道。更糟糕的是,如果操作系统支持大
-于 4KB 的页(例如,2MB 或 1GB),攻击者可以通过无意的映射访问最大页面大
-小的内存范围。由于所有软件本质上共享相同的物理地址空间,因此元数据创建
-的虚拟到物理映射可能指向属于操作系统内核,VMM 内存,SGX
-隔离区,或 SMM 内存的数据。在操作系统通过 munmap 系统调用释放内存时,
-将页表项清零的常见情况下,攻击者可以访问存储在物理地址 0x00 的数据。
+不存在的页会触发终端错误,在页表项中的元数据表示缓存中的物理地址的情况
+下,处理器仍然将一级数据高速缓存中未授权的数据传递到暂态乱序执行中。然
+后可以和其他暂态执行攻击一样,利用缓存等侧信道构造隐蔽信道,将秘密数据
+从微体系结构暂态执行域带入体系结构状态中。如果操作系统支持大于 4KB 的
+页(例如,2MB 或 1GB),攻击者甚至可以访问最大页面大小的内存范围。由于
+所有软件本质上共享相同的物理地址空间,因此元数据创建的虚拟到物理映射可
+能指向属于操作系统内核,VMM 内存,SGX 隔离区,或 SMM 内存的数据。在操
+作系统通过 munmap 系统调用释放内存,将页表项清零的常见情况下,攻击者可
+以访问存储在物理地址 0x00 的数据。
实验结果表明,在一个 i7-6820HQ CPU 上,Foreshadow-OS 通过利用瞬态执行,
可以从已清除存在位的页中读取一级缓存的数据。
% foreshadow-VMM
-虽然上述 Foreshadow-OS 变体允许无特权的攻击者使用未经授权的物理内存位置
-上的数据进行暂态计算,但他们无法直接控制访问哪些物理地址。因此,
-Foreshadow 攻击使用在可以直接控制客户机器物理地址和一级缓存标签比较的
-不可信虚拟机时时,会变得更有破坏性。这种攻击称为 Foreshadow-VMM.
+虽然上述 Foreshadow-OS 变体允许无特权的攻击者使用未经授权的物理内存位
+置上的数据进行暂态计算,但他们无法直接控制访问哪些物理地址。因此,
+Foreshadow 攻击使用在可以直接控制客户机器物理地址和一级缓存标签的比较
+过程的不可信虚拟机时时,会变得更有破坏性。这种攻击称为 Foreshadow-VMM.
-根据 Intel 处理器的架构规范\supercite{intel-spec},客户机物理地址经过基
-于 EPT 的转换过程以找到底层主机物理内存地址。英特尔的分
-析\supercite{l1tf}显示,终端错误发生时,虚拟地址到物理地址处于早期阶段,
-在经过 EPT 转换之前,将转换出来的客户机物理地址传到一级缓存中进行标签比
-较。因此,恶意虚拟机可以控制用于访问一级缓存的暂态指令的物理地址。特别
-的,不可信的恶意客户虚拟机可以在自己的客户页表中修改页表项,指向客户机
-物理内存。该地址不会经过 EPT 转换,和一级缓存中的标签进行比较,就像它是
-主机物理地址一样。
+根据 Intel 处理器的架构规范\supercite{intel-spec},客户机物理地址经过
+基于 EPT 的转换过程以找到底层主机物理内存地址。Intel 的分析
+\supercite{l1tf}显示,终端错误发生时,虚拟地址到物理地址的转换处于早期
+阶段,在经过 EPT 转换之前,将转换出来的客户机物理地址传到一级缓存中进
+行标签比较。因此,恶意虚拟机可以控制用于访问一级缓存的暂态指令的物理地
+址。特别的,不可信的恶意客户虚拟机可以在自己的客户页表中修改页表项,指
+向客户机物理内存。该地址不会经过 EPT 转换,和一级缓存中的标签进行比较,
+就像它是主机物理地址一样。
\begin{figure}[htbp]
\centering
- \includegraphics[width=0.8\textwidth]{foreshadow-vmm.eps}
+ \includegraphics[width=0.6\textwidth]{foreshadow-vmm.eps}
\caption{Foreshadow VMM 的一种使用场景\supercite{foreshadowNG}}
\label{fig:foreshadow-vmm}
\end{figure}
-图 \ref{fig:foreshadow-vmm} 展示了一种情况,一个恶意的虚拟机可以利用瞬
-时执行攻击窃取属于同一处理器核的另一个虚拟机中的数据。这种攻击并不局限
+图 \ref{fig:foreshadow-vmm} 展示了一种情况,一个恶意的虚拟机可以利用暂
+态执行攻击窃取属于同一处理器核的另一个虚拟机中的数据。这种攻击并不局限
于超线程受害者,因为 Foreshadow-VMM 可以提取处理器物理核心一级数据高速
缓存中的任何秘密。
@@ -307,62 +302,60 @@ Foreshadow 攻击使用在可以直接控制客户机器物理地址和一级缓
\subsubsection{延迟浮点寄存器状态还原(LazyFP)攻击}
% introduction
-LazyFP\supercite{lazyfp} 是一个 Meltdown 类型的攻击,它可以跨越进程和虚
-拟机的边界,泄露浮点处理单元(FPU)寄存器的状态。这种攻击利用 Intel 处
-理器处理设备不可用异常(\Fault{NM})的行为。这个异常用于在操作系统中实
-现延迟 FPU 上下文切换的优化。在 LazyFP 攻击中,没有特权的本地执行的代码,
-可以利用 \Fault{NM} 异常的暂态指令,恢复受害者进程的 FPU 寄存器状态。
-由于 AES-NI 的密钥等数据可能存在 FPU 寄存器中,这种攻击导致的数据泄露
-对信息安全是个很大的威胁。
+LazyFP\supercite{lazyfp} 是一个 Meltdown 类型的攻击,它可以跨越进程和
+虚拟机的边界,泄露浮点处理单元(FPU)寄存器的状态。这种攻击利用 Intel
+处理器处理设备不可用异常(\Fault{NM})的行为。这个异常用于在操作系统中
+实现延迟 FPU 上下文切换的优化。在 LazyFP 攻击中,没有特权的本地执行的
+代码,可以利用 \Fault{NM} 异常产生的暂态指令,恢复受害者进程的 FPU 寄
+存器状态。由于 AES-NI 的密钥等数据可能存在 FPU 寄存器中,这种攻击导致
+的数据泄露对信息安全是个很大的威胁。
% background
x87 浮点单元(FPU)是 x86 的处理器的一个扩展,其最初目的是加速浮点数的
-运算。它有自己的一组指令和寄存器。自 1989 年推出 Intel 486DX 以来,它是
-每个 x86 微处理器不可或缺的一部分,而在此之前,它是一个可选的外部协处理
-器。在上下文切换中,向内存保存 FPU 状态和恢复 FPU 的状态曾经是一个成本
-很高的操作,因为内存速度慢并且大小有限。此外,那时 FPU 只在少数程序中被
-使用。在 FPU 不被所有进程使用的情况下,在每个上下文切换时,切换 FPU 状
-态会产生不必要的开销。为了能够减少这种开销,x86 处理器引入了一个控制寄
-存器位 cr0.ts,允许操作系统打开和关闭FPU,当FPU关闭时,它会保持其状态,
-但用户和内核代码都无法访问。
+运算。它有独立于 x86 处理器的一组指令和寄存器。在 1989 年推出 Intel
+486DX 之前,它是一个可选的外部协处理器,此后成为 x86 微处理器不可或缺
+的一部分。在上下文切换中,向内存保存 FPU 状态,以及从内存恢复 FPU 的状
+态,曾经是一个开销很大的操作,因为内存速度慢并且大小有限。此外,那时
+FPU 只在少数程序中被使用。在 FPU 不被所有进程使用的情况下,在每个上下
+文切换时,切换 FPU 状态会产生不必要的开销。为了能够减少这种开销,x86
+处理器引入了一个控制寄存器位 cr0.ts,允许操作系统打开和关闭FPU,当FPU
+关闭时,它会保持其状态,但用户和内核代码都无法访问。
利用 cr0.ts 实现的优化称为延迟 FPU 上下文切换(lazy FPU context
switching)。核心思想是 FPU 寄存器状态仅在必要时进行上下文切换,并保留
在不使用 FPU 的进程中。这样,操作系统可以避免不必要的保存和恢复 FPU 上
下文的成本。
-操作系统跟踪当前 FPU 寄存器状态所属的进程,此进程称为FPU所有者。FPU 可
-以在启用和禁用状态,在 FPU 启用状态下,当前进程是 FPU 所有者,可以自由
-地执行 FPU 指令。当操作系统切换到另一个进程时,FPU 被禁用。在进程尝试执
-行 FPU 指令之前,它将保持禁用状态。由于 FPU 被禁用,使用浮点指令时,处
-理器会生成 \Fault{NM} 异常。操作系统处理 \Fault{NM} 异常的方式取决于当
-前进程是否为FPU 所有者,如果是,则 FPU 寄存器状态属于该进程,操作系统启
-用FPU,该进程再次可以自由执行FPU指令。否则,则操作系统在启用 FPU 的同时,
-将当前FPU 寄存器状态存储到 FPU 所有者进程的状态保存区域,并恢复当前进程
-的FPU 寄存器状态,并将该进程设为 FPU 的所有者。
-
-这个算法在不同操作系统中的实现可能不同,它们的共同点是,使用 FPU 的进程
-切换到不使用 FPU 的进程时,操作系统不需要上下文切换 FPU 寄存器的状态。
-
-虽然延迟 FPU 上下文切换仍然在现代的操作系统中广泛使用,但其基本假设通常
-不再适用。从 Intel MMX 指令集扩展,到后续的 SSE,AVX 和 AVX-512,FPU 寄
-存器状态已经扩展到更大的 SIMD 寄存器。SSE 指令集是 64 位 x86 处理器的必
-须组成部分,并且在几乎所有程序和库中用于实现不同的任务,例如内存复制。
-
-虽然更大的 FPU 寄存器状态使得避免 FPU 上下文切换更具吸引力,但在当前的
-软件中,每个进程最终都会使用 FPU 寄存器并触发 \Fault{NM} 异常。因
-此,Linux 内核已经默认将 FPU 寄存器作为普通上下文切换的一部分进行切换,
-在正常操作中不会生成 \Fault{NM} 异常。
+操作系统跟踪当前 FPU 寄存器状态所属的进程,此进程称为 FPU 所有者。FPU
+可以在启用和禁用状态,在 FPU 启用状态下,当前进程是 FPU 所有者,可以自
+由地执行 FPU 指令。当操作系统切换到另一个进程时,FPU 被禁用。在进程尝
+试执行 FPU 指令之前,它将保持禁用状态。由于 FPU 被禁用,使用浮点指令时,
+处理器会生成 \Fault{NM} 异常。操作系统处理 \Fault{NM} 异常的方式取决于
+当前进程是否为 FPU 所有者,如果是,则 FPU 寄存器状态属于该进程,操作系
+统启用 FPU,该进程再次可以自由执行 FPU 指令。否则,则操作系统在启用
+FPU 的同时,将当前 FPU 寄存器状态存储到 FPU 所有者进程的状态保存区域,
+并恢复当前进程的FPU 寄存器状态,并将该进程设为 FPU 的所有者。这个算法
+在不同操作系统中的实现可能不同,它们的共同点是,使用 FPU 的进程切换到
+不使用 FPU 的进程时,操作系统不需要上下文切换 FPU 寄存器的状态。
+
+虽然延迟 FPU 上下文切换仍然在现代的操作系统中广泛使用,但其基本假设通
+常不再适用。从 Intel MMX 指令集扩展,到后续的 SSE,AVX 和 AVX-512,FPU
+寄存器状态已经扩展到更大的 SIMD 寄存器。SSE 指令集是 64 位 x86 处理器
+的必须组成部分,并且在几乎所有程序和库中用于实现不同的任务,例如内存复
+制。因此,虽然更大的 FPU 寄存器状态使得避免 FPU 上下文切换更具吸引力,
+但在当前的软件中,每个进程最终都会使用 FPU 寄存器并触发 \Fault{NM} 异
+常。因此,Linux 内核已经默认将 FPU 寄存器作为普通上下文切换的一部分进
+行切换,在正常操作中不会生成 \Fault{NM} 异常。
在使用 Intel 的硬件辅助虚拟化技术时,处理器在从客户机切换到管理程序时,
不会切换FPU寄存器状态。虚拟机管理程序负责上下文切换 FPU 寄存器的状态,
并且机制与非虚拟化操作系统的机制相同。因此,延迟 FPU 上下文切换也适用于
虚拟机管理程序。
-在使用延迟 FPU 上下文切换的操作系统中,利用 LazyFP 攻击可以使没有特权的
-攻击者获取同一处理器硬件线程中 FPU 寄存器的数据。以下简单的例子可以泄
-露1比特的数据。
+在使用延迟 FPU 上下文切换的操作系统中,利用 LazyFP 攻击可以使没有特权
+的攻击者获取同一处理器硬件线程中 FPU 寄存器的数据。图 \ref{lst:lazyfp}
+的例子可以泄露1比特的数据。
\begin{figure}
\centering
@@ -376,9 +369,9 @@ mov rax, dword [mem + rax]
\label{lst:lazyfp}
\end{figure}
-在以上代码片段中,由于进程中 FPU 寄存器被禁用,movq 指令产
-生 \Fault{NM} 异常。操作系统会用对应用程序透明的方式处理该异常,恢复进
-程的状态并继续执行。
+在该代码片段中,由于进程中 FPU 寄存器被禁用,movq 指令产生 \Fault{NM}
+异常。操作系统会用对应用程序透明的方式处理该异常,恢复进程的状态并继续
+执行。
而在处理器结束 movq 指令的执行并产生 \Fault{NM} 之前,已经执行了后续指
令,虽然最终这些指令引起的体系结构状态更改会被丢弃,但在缓存中的状态仍
@@ -396,63 +389,23 @@ Spectre 型攻击利用处理器对控制流或数据流的预测,并进行推
暂态指令。Spectre 型攻击中,暂态指令访问的是程序在体系结构层面能访问的
数据,可以绕过软件定义的安全策略,如边界检查等。
-推测式执行的常见形式是控制流的推测式执行。控制流的推测式执行依赖于转移
-预测技术,包含了分支的预测、间接转移目标地址的预测和函数返回地址的预测,
-对应于 Spectre 攻击中 Spectre-PHT, Spectre-BTB, Spectre-RSB. 此外,处
-理器预测装载指令和程序序列之前访问地址未知的存储指令地址不冲突,
-推测式执行这样的装载指令,它对应 Spectre-STL.
-
-%%%% gtran: branch prediction
-
-%% \Todo: 关于处理器执行转移指令的背景知识,是否需要?
-
-%% \Fixme: 需要重新翻译的内容
-
-%% 在推测执行期间,处理器猜测分支指令的可能结果。更好的预测通过增加可成功
-%% 提交的推测性执行操作的数量来提高性能。
-
-%% 现代英特尔处理器的分支预测器,例如Haswell Xeon处理器,具有用于直接和间
-%% 接分支的多种预测机制。间接分支指令可以跳转到在运行时计算的任意目标地址。
-%% 例如,x86指令可以跳转到寄存器,存储器位置或堆栈中的地址,例如“jmp eax”,
-%% “jmp [eax]”和“ret”。 ARM上也支持间接分支(例如,“MOV pc,r14”),MIPS
-%% (例如,“jr \$ ra”),RISC-V(例如,“jalr x0,x1,0”)和其他处理器。与直
-%% 接分支相比,为了补偿额外的灵活性,使用至少两种不同的预测机制来优化间接
-%% 跳转和调用[35]。
+推测式执行的常见形式是控制流的推测式执行。控制流的推测式执行依赖于分支
+预测技术,包含了条件分支的预测、间接转移目标地址的预测和函数返回地址的
+预测,对应于 Spectre 攻击中 Spectre-PHT, Spectre-BTB, Spectre-RSB. 数
+据流的推测式执行也是一种推测式执行的形式,处理器预测装载指令和程序序列
+之前访问地址未知的存储指令地址不冲突,推测式执行这样的装载指令,它对应
+Spectre-STL.
-%% 英特尔[35]描述了处理器的预测
-%% •以静态或单调方式进行“直接呼叫和跳转”,
-%% •“间接呼叫和跳转”要么是单调的,要么是以不同的方式,这取决于最近的程序
-%% 行为,以及
-%% •“条件分支”分支目标以及是否将采用分支。
+Spectre 攻击使得受害者程序在暂态指令中执行在严格按序执行时不会执行的操
+作,这些操作会将秘密信息通过隐蔽信道泄露给攻击者。
-%% 因此,几个处理器组件用于预测分支的结果。分支目标缓冲区(BTB)保持从最
-%% 近执行的分支指令的地址到目标地址的映射[44]。即使在解码分支指令之前,处
-%% 理器也可以使用BTB来预测未来的代码地址。 Evtyushkin等。 [14]分析了英特
-%% 尔Haswell处理器的BTB,并得出结论,只有31个最低有效位的分支地址用于索引
-%% BTB。
-
-%% 对于条件分支,记录目标地址对于预测分支的结果不是必需的,因为目的地通常
-%% 在指令中被编码,同时在运行时确定条件。为了改进预测,处理器维护分支结果
-%% 的记录,包括最近的直接和间接分支。 Bhattacharya等。 [9]分析了近期英特
-%% 尔处理器中分支历史预测的结构。
-
-%% 尽管返回指令是一种间接分支,但是在现代CPU中经常使用用于预测目标地址的
-%% 单独机制。返回堆栈缓冲区(RSB)维护最近使用的调用堆栈部分的副本[15]。
-%% 如果RSB中没有可用数据,则不同的处理器将停止执行或使用BTB作为回退[15]。
-
-%% 分支预测逻辑(例如,BTB和RSB)通常不在物理核心之间共享[19]。因此,处理
-%% 器仅从在同一核上执行的先前分支学习。
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-Spectre 攻击使得受害者程序在推测式地执行在严格按序执行的时不会执行的操
-作,这些操作会通过隐蔽信道将秘密信息泄露给攻击者。
-
-Spectre 攻击通常从设置阶段(setup phase)开始,攻击者执行一些用于训练
-处理器的操作,使得处理器在后续阶段执行可被攻击者利用的错误的推测式执行。
-此外,设置阶段中,攻击者可以操作高速缓存状态,从缓存中去除预测的分支所
-依赖的数据,使得推测式执行中的指令足够多,从而可以执行攻击者希望处理器
-执行的指令。在这个阶段,攻击者还可以进行隐蔽信道的准备,如
-Flush+Reload 攻击中清除探测数组对应缓存行的操作。
+Spectre 攻击通常分为三个阶段。第一个阶段是设置阶段(setup phase),攻
+击者执行一些用于训练处理器的操作,使得处理器在后续的阶段中,产生可被攻
+击者利用的错误的推测式执行。此外,在设置阶段中,需要增大推测式执行的窗
+口,使得推测式执行中的指令足够多,从而可以执行攻击者希望处理器执行的指
+令,实现方式包括操作高速缓存状态,从缓存中去除预测的分支所依赖的数据。
+在这个阶段,攻击者还可以进行隐蔽信道的准备,如Flush+Reload 攻击中清除
+探测数组对应缓存行的操作。
在第二个阶段,处理器在推测式执行中,将受害者上下文中的秘密信息,传送至
微体系结构隐蔽信道。攻击者向受害者通过系统调用等方式发送请求,以出发这个推
@@ -505,23 +458,23 @@ if (x < array1_size)
图\ref{fig:spectre_v1}是边界检查结果和预测的方向的四种组合。在已知边
界检查的结果之前,处理器预测最可能的结果,推测式地执行边界检查之后的代
-码。导致边界检查的结果不能及时得出的原因很多,如边界检查期间发生缓存缺
+码。有很多原因导致边界检查的结果不能及时得出,如边界检查期间发生缓存缺
失,缺少空闲的执行单元,存在复杂的数据依赖。在这些情况下,正确预测的可
以使执行时间更短。
但是,处理器可以在不正确的路径推测式执行指令。在这个例子中,假设攻击者
可以控制以如下方式运行:
-\begin{itemize}
+\begin{enumerate}
\item 选择一个恶意越界的 \verb|x| 的值,使得 \verb|array1[x]| 指向受害
者内存中的某个秘密字节 \verb|k|
\item \verb|array1_size| 和 \verb|array2| 不在缓存中,但 \verb|k| 在缓
存中
\item 此前的操作中接收到的 \verb|x| 值均有效,使得分支预测器预测 if 为
-\end{itemize}
+\end{enumerate}
-这样的缓存条件可以由攻击者构造,例如,通过构造访问模式造成
+攻击者可以构造这样的缓存条件,例如,通过使用一定的模式访问内存,造成
\verb|array1_size| 和 \verb|array2| 被驱逐出缓存,再使受害者在合法的操
作中使用秘密 \verb|k|.
@@ -608,11 +561,11 @@ ARM 处理器上进行验证,确认它们受 Spectre v1 的影响。
%% \verb|TODO|: Spectre v1.1的内容,需要更详细地解释攻击原理
推测式缓冲区溢出(Speculative Buffer Overflow)
-\supercite{spec-buffer-overflow} 是 Spectre-PHT 的另一种形式。处理器存
-在一个存储缓冲区(store buffer),往存储系统写入的数据在指令提交前将写
-入数据的地址和值存放在这个缓冲区中,后续的指令要使用这个地址的值时,可
-以将缓冲区中的数据转发给需要的指令。推测式缓冲区溢出利用了这个特性,例
-如图\ref{lst:spec-buf-overflow}中的程序:
+\supercite{spec-buffer-overflow} 是 Spectre-PHT 的另一种形式,被称为
+Spectre v1.1. 处理器存在一个存储缓冲区(store buffer),往存储系统写入
+的数据在指令提交前将写入数据的地址和值存放在这个缓冲区中,后续的指令要
+使用这个地址的值时,可以将缓冲区中的数据转发给需要的指令。推测式缓冲区
+溢出利用了这个特性,例如图\ref{lst:spec-buf-overflow}中的程序:
\begin{figure}
\begin{minted}{C}
@@ -635,8 +588,8 @@ if (x < len)
\subsubsection{Spectre-BTB}
-Spectre v2 利用间接转移的推测式执行,用于预测间接转移的主要部件是 BTB,
-因此在分类上称为 Spectre-BTB.
+处理器遇到间接转移时,使用 BTB 预测转移的目标地址。Spectre v2 利用间接
+转移的错误推测式执行,这类攻击在分类上称为 Spectre-BTB.
在 Spectre v2 中,攻击者可以对间接转移进行投毒,从而可以利用由此产生的
转移预测错误,从另一个上下文(如另一进程)中读取任意内存。如果由于缓存
@@ -655,8 +608,7 @@ Spectre v2 利用间接转移的推测式执行,用于预测间接转移的主
中 A 中训练,在上下文 B 中,转移预测器根据在 A 中的训练结果进行预测,
导致处理器跳转至攻击者选择的目标地址处进行推测式执行。攻击者可以引导受
害者推测式执行在正确的程序执行中永远不会执行的位置。由于推测性执行带来
-了可测量的副作用,这种攻击对于攻击者来说及其强大,即使在没有可利用的条
-件分支错误预测的情况下,也可以用它泄露受害者的内存。
+了可测量的副作用,这种攻击对于攻击者来说极其强大。
举一个简单的攻击例子,攻击者试图读取受害者的内存,当发生间接转移时,攻
击者可以控制两个寄存器。这在现实的二进制程序中很常见,因为操作从外部接
@@ -757,24 +709,21 @@ Spectre v4 利用的是装载指令的推测式执行。处理器执行装载指
\subsection{NetSpectre}
NetSpectre\supercite{netspectre} 是通过网络进行的 Spectre 攻击,使得
-Spectre 攻击可以用于不运行攻击者控制的代码的系统上,从而更多的设备受到
-Spectre 攻击的影响。
+Spectre 攻击可以用于不运行攻击者控制的代码的系统上,从而将 Spectre 攻
+击的影响扩大至更多的设备。
和本地 Spectre 攻击类似,远程的 Spectre 攻击需要受害者存在 Spectre 组
件代码,当这些代码可以通过网络接口调用时,攻击者可以向受害者发送一系列
-精心构造的请求,通过测量相应时间,泄露受害者内存中的秘密数据。
+精心构造的请求,通过测量响应时间,泄露受害者内存中的秘密数据。
访问存储器的延迟可以反映在网络请求的延迟中,因此攻击者可以通过大量的测
-量,远程地区分缓存是否命中。因此,通过使用 Thrash+Reload,一种基于
+量,区分远程的机器缓存是否命中。因此,通过使用 Thrash+Reload,一种基于
Evict+Reload 的远程缓存攻击方式,将 Spectre 攻击用于网络场景,可以每小
时从目标系统泄露 15 比特数据。通过使用基于 AVX2 指令执行时间的侧信道,
可以在 NetSpectre 中获得更高的性能,在局域网中可以每小时泄露 60 比特。
通过使用 NetSpectre 攻击,攻击者可以破坏远程系统中部署的地址空间布局随
机化(ASLR)防御机制。
-NetSpectre 攻击在网络上使用,需要攻击者访问受害者提供的网络接口,并且
-向受害者发送大量网络数据包。这些操作不一定需要在短时间内进行。
-
在 NetSpectre 攻击中,攻击者需要利用两个 Spectre 组件:泄露组件和传输
组件,这些组件在收到网络数据包时执行。泄漏组件在攻击者控制的内存地址处
访问数据,并根据访问的数据改变一些微体系结构状态。传输组件可以进行任意操作,
@@ -798,17 +747,18 @@ if (x < bitstream_length)
为了在远程攻击中使目标系统在推测式执行中改变微体系结构状态,攻击者采用原始
Spectre 的方法。为了触发远程系统的推测式执行,攻击者进行以下操作:
-\begin{itemize}
+\begin{enumerate}
\item 攻击者发送多个网络数据包,使得攻击者选择的 x 值总是在边界内,训
练分支预测器在后续执行此边界检查的分支时,预测 x 在边界内
\item 攻击者发送一个数据包,使得 x 越界,\verb|bitstream[x]| 是目标系
统中的一个秘密数据位
\item 分支预测器预测边界检查结果为真,推测式执行存储器的访问
-\end{itemize}
+\end{enumerate}
-在图\ref{fig:netspectre_leak}的代码中,虽然 flag 的值没有被修改,但是
-flag 的缓存状态会发生变化。如果 \verb|bitstream[x]| 为 1,则 flag 会进
-入缓存,通过 flag 的缓存状态,可以推断 \verb|bitstream[x]| 的值。
+在图 \ref{fig:netspectre_leak} 的代码中,当 x 越界时,虽然 flag 的值没
+有被修改,但是 flag 的缓存状态会发生变化。如果 \verb|bitstream[x]| 为
+1,则 flag 会进入缓存,通过 flag 的缓存状态,可以推断
+\verb|bitstream[x]| 的值。
传输组件更简单,它只需要在一个操作中使用 flag,它的执行时间取决于 flag
的缓存状态,例如,最简单的一个传输组件是直接返回 flag 的值。由于传输组