From 0e3832910186595fcb9b5f4857a61e491788018a Mon Sep 17 00:00:00 2001 From: Iru Cai Date: Thu, 30 May 2019 15:03:03 +0800 Subject: update and clean up --- chap/chap2.tex | 98 +++++----------------------------------------------------- 1 file changed, 7 insertions(+), 91 deletions(-) diff --git a/chap/chap2.tex b/chap/chap2.tex index 9d1c73b..0d7fefe 100644 --- a/chap/chap2.tex +++ b/chap/chap2.tex @@ -55,7 +55,7 @@ Spectre\supercite{spectre} 是最早发现的两个利用暂态指令的攻击 Meltdown 型攻击利用的是处理器异常产生的暂态指令,这些指令使用了体系结构 层次上不可访问的数据,从而绕过硬件的安全策略,泄露体系结构层次上不可访 -问的数据。 +问的数据。\supercite{systematic} \subsubsection{“熔断”(Meltdown)攻击} @@ -200,7 +200,7 @@ SGX 处理器无法保证隔离区的数据保密性,也无法证明隔离区 \end{figure} 在现代 Intel x86 处理器中,用一个虚拟内存地址访问内存时,处理器先在 -TLB 中查询对应的物理地址,如果 TLB 中没有这个地址对应的项,则会在页表 +变换旁路缓冲器(TLB)中查询对应的物理地址,如果 TLB 中没有这个地址对应的项,则会在页表 中找到虚拟地址对应的页表项,以获得对应的物理地址和访问权限信息。图 \ref{fig:addr-tran} 展示了访问页表的过程。如果是在虚拟机环境中,则需要 增加一个扩展页表(Extended Page Table,EPT)的访问过程,将客户机的物理 @@ -231,8 +231,8 @@ TLB 中查询对应的物理地址,如果 TLB 中没有这个地址对应的 仍然可以从一级缓存读取该虚拟地址中的数据,从而暂态指令可以泄露 SGX 隔 离区中的数据。 -在 Skylake 微体系结构的 Intel i7-6700 中使用 Foreshadow 攻击, -可以以 81.14\% 的精确度提取一级缓存行的数据。 +在 Skylake 微体系结构的 Intel Core i7-6700 中使用 Foreshadow 攻击, +可以以 81.14\% 的精确度提取一级缓存中缓存行的数据。 通过将一个页设为不存在,绕过地址翻译,从一级缓存读取数据的攻击方式, Intel 称其为L1终端错误(L1 Terminal Fault)\supercite{l1tf}。 利用相 @@ -262,7 +262,7 @@ Foreshadow-OS 利用了这种错误造成的暂态执行的指令。虽然访问 作系统通过 munmap 系统调用释放内存,将页表项清零的常见情况下,攻击者可 以访问存储在物理地址 0x00 的数据。 -实验结果表明,在一个 i7-6820HQ CPU 上,Foreshadow-OS 通过利用瞬态执行, +实验结果表明,在一个 Intel Core i7-6820HQ CPU 上,Foreshadow-OS 通过利用瞬态执行, 可以从已清除存在位的页中读取一级缓存的数据。 % foreshadow-VMM @@ -382,7 +382,7 @@ mov rax, dword [mem + rax] Spectre 型攻击利用处理器对控制流或数据流的预测,并进行推测式执行产生的 暂态指令。Spectre 型攻击中,暂态指令访问的是程序在体系结构层面能访问的 -数据,可以绕过软件定义的安全策略,如边界检查等。 +数据,可以绕过软件定义的安全策略,如边界检查等。\supercite{systematic} 推测式执行的常见形式是控制流的推测式执行。控制流的推测式执行依赖于分支 预测技术,包含了条件分支的预测、间接转移目标地址的预测和函数返回地址的 @@ -394,7 +394,7 @@ Spectre-STL. Spectre 攻击使得受害者程序在暂态指令中执行在严格按序执行时不会执行的操 作,这些操作会将秘密信息通过隐蔽信道泄露给攻击者。 -Spectre 攻击通常分为三个阶段。第一个阶段是设置阶段,攻 +Spectre 攻击通常分为三个阶段。\supercite{spectre}第一个阶段是设置阶段,攻 击者执行一些用于训练处理器的操作,使得处理器在后续的阶段中,产生可被攻 击者利用的错误的推测式执行。此外,在设置阶段中,需要增大推测式执行的窗 口,使得推测式执行中的指令足够多,从而可以执行攻击者希望处理器执行的指 @@ -412,8 +412,6 @@ Spectre 攻击通常分为三个阶段。第一个阶段是设置阶段,攻 复过程的工作之一是对此前清除的缓存行对应的内存地址进行访问计时,从而推 断出敏感数据。 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - \subsubsection{Spectre-PHT} Spectre-PHT 利用分支预测器,攻击者可以训练转移预测器,使得转移预测器执 @@ -432,14 +430,6 @@ if (x < array1_size) \label{lst:spectre_v1} \end{figure} -%%%%%%%%%%%%%%%%%%%%%%% gtran: spectre v1 %%%%%%%%%%%%%%%%%%%%%%%%%%% - -% \verb|TODO|: Spectre 论文中 Spectre v1 的内容 - -% \verb|TODO|: 解释 Spectre 攻击中这段代码的运行方式,关于在 Javascript 和 eBPF 下的攻击 - -% \Fixme: 重新翻译 - 这段代码 x 的值做边界检查,确保后续执行代码的安全性,同时该检查也防止 处理器读取 array1 数组外的敏感内容。否则,越界的数组下标 x 可能触发异 常,也可以通过构造 x 用于访问敏感数据。 @@ -496,65 +486,6 @@ ARM 处理器上进行验证,确认它们受 Spectre v1 的影响。 除了使用原生的机器指令,利用 JavaScript 和 Linux 内核的 eBPF 的 JIT 编 译器也可以进行 Spectre 攻击。 -%% 我们在JavaScript中开发了一个概念验证,并在Google Chrome版本62.0.3202中 -%% 对其进行了测试,该版本允许网站从其运行的进程中读取私有内存。代码如清单 -%% 2所示。 - -%% 在分支预测器错误引用过程中,索引(通过位操作)设置为范围内值。在最后一 -%% 次迭代中,index被设置为simpleByteArray的越界地址。我们使用变量 -%% localJunk来确保不优化操作。根据ECMAScript 5.1 Section 11.10 [13],“| -%% 0”操作将值转换为32位整数,作为JavaScript解释器的优化提示。与其他优化的 -%% JavaScript引擎一样,V8执行即时编译以将JavaScript转换为机器语言。虚拟操 -%% 作放在清单2中的代码中,以使simpleByteArray.length存储在本地内存中,以 -%% 便在攻击期间将其从缓存中删除。有关D8的结果反汇编输出,请参见清单3。 - -%% 由于无法从JavaScript访问clflush指令,我们使用缓存逐出[27,51],即,我们 -%% 以某种方式访问​​其他存储器位置,以便之后逐出目标存储器位置。泄漏的结果通 -%% 过probeTable [n * 4096]的缓存状态传递,n∈0..255,因此攻击者必须驱逐这 -%% 256个缓存行。长度参数(JavaScript代码中的simpleByteArray.length和反汇 -%% 编中的[ebp-0xe0])也需要逐出。 JavaScript不提供对rdtscp指令的访问,并 -%% 且Chrome故意降低其高分辨率计时器的准确性以使用performance.now()[62] -%% 来阻止定时攻击。但是,HTML5的Web Workers功能使创建一个单独的线程变得简 -%% 单,该线程反复递减共享内存位置中的值[24,60]。这种方法产生了一个提供足 -%% 够分辨率的高分辨率计时器。 - -%% 作为利用条件分支的第三个例子,我们开发了一个可靠的概念验证,它通过滥用 -%% eBPF(扩展BPF)接口从未修改的Linux内核泄漏内核内存,而没有针对Specter -%% 的补丁。 eBPF是一个基于伯克利数据包过滤器(BPF)[49]的Linux内核接口, -%% 可用于各种目的,包括根据数据包内容过滤数据包。 eBPF允许非特权用户在内 -%% 核的上下文中触发解释或JIT编译以及随后执行用户提供的,内核验证的eBPF字 -%% 节码。攻击的基本概念类似于针对JavaScript的攻击概念。 - -%% 在此次攻击中,我们仅将eBPF代码用于推测性执行的代码。我们在用户空间中使 -%% 用本机代码来获取隐藏的信道信息。这与上面的JavaScript示例不同,后者的两 -%% 个函数都是用脚本语言实现的。为了推测性地访问用户空间内存中依赖于机密的 -%% 位置,我们对内核内存中的数组执行推测性的越界内存访问,其索引足够大,以 -%% 便访问用户空间内存。概念验证假定目标处理器不支持超级用户模式访问保护 -%% (SMAP)。但是,没有这种假设的攻击也是可能的。它在Intel Xeon Haswell -%% E5-1650 v3上进行了测试,它在默认解释模式和eBPF的非默认JIT编译模式下都 -%% 可以使用。在高度优化的实现中,我们能够在此设置中泄漏高达2000B / s。它 -%% 还在AMD PRO A8-9600 R7处理器上进行了测试,它只能在非默认的JIT编译模式 -%% 下工作。我们将调查原因留给未来的工作。 - -%% eBPF子系统管理存储在内核内存中的数据结构。用户可以请求创建这些数据结构, -%% 然后可以从eBPF字节码访问这些数据结构。为了强制执行这些操作的内存安全性, -%% 内核存储与每个此类数据结构相关联的一些元数据,并对此元数据执行检查。特 -%% 别地,元数据包括数据结构的大小(在创建数据结构时设置一次并用于防止越界 -%% 访问)以及加载到内核中的eBPF程序的引用数量。引用计数跟踪引用数据结构的 -%% 多少eBPF程序正在运行,确保不释放属于数据结构的内存 -%% 加载的eBPF程序引用它。 - -%% 我们通过滥用错误共享来增加边界检查的延迟与eBPF管理的阵列的长度。内核将 -%% 数组长度和引用计数存储在同一缓存行中,允许攻击者将包含数组长度的缓存行 -%% 移动到处于Modified状态的另一个物理CPU核心(参见[16,53])。这是通过加载 -%% 和丢弃引用另一个物理内核上的eBPF阵列的eBPF程序来完成的,这会导致内核在 -%% 另一个物理内核上递增和递减阵列的引用计数器。这种攻击在Haswell CPU上实 -%% 现了大约5000B / s的泄漏率。 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%% \verb|TODO|: Spectre v1.1的内容,需要更详细地解释攻击原理 - 推测式缓冲区溢出(Speculative Buffer Overflow) \supercite{spec-buffer-overflow} 是 Spectre-PHT 的另一种形式,被称为 Spectre v1.1. 处理器存在一个存储缓冲区(store buffer),往存储系统写入 @@ -618,21 +549,6 @@ if (x < len) 在内存中映射了很大的共享库,攻击者有足够多的空间找到这样的组件,而不需 要搜索受害者程序的代码。 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% gtran %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%% \verb|TODO|: Spectre 的论文中关于 Spectre v2 一节的剩余内容,一直到实验结果部 -%% 分 - -%% \Fixme: 重新翻译以下内容 - -%% 许多其他攻击是可能的,这取决于对手所知道或控制的状态,对手所寻求的信息 -%% 所在的位置(例如,寄存器,堆栈,内存等),对手控制推测执行的能力,指令 -%% 序列可用于形成小工具,以及哪些渠道可能会泄漏来自投机操作的信息。例如, -%% 如果攻击者可以简单地在将来自寄存器中指定的地址的存储器带入高速缓存的指 -%% 令中诱导推测执行,则在寄存器中返回秘密值的加密函数可能变得可利用。同样, -%% 尽管上面的示例假设攻击者控制两个寄存器,但攻击者控制单个寄存器,堆栈上 -%% 的值或内存值对于某些小工具来说已足够。 - Spectre v2 的攻击方式和面向返回编程(ROP)\supercite{ret2libc} 有相似 之处。在ROP 中,攻击者从受害程序所用的 C 库等代码中寻找大量的指令序列, 合并到一起形成一个组件,攻击者可以构造出能进行任意计算的组件。而在 -- cgit v1.2.3