From bb46b6237e15f4d7f6ae1bbb96b5675ede9333cb Mon Sep 17 00:00:00 2001 From: Iru Cai Date: Thu, 30 May 2019 11:15:30 +0800 Subject: fixes --- chap/chap1.tex | 10 +++++----- chap/chap2.tex | 37 +++++++++++++++++++------------------ chap/chap3.tex | 21 +++++++++++---------- chap/chap4.tex | 6 +++--- chap/chap5.tex | 14 +++++++------- 5 files changed, 45 insertions(+), 43 deletions(-) diff --git a/chap/chap1.tex b/chap/chap1.tex index e6a55b0..ba1096a 100644 --- a/chap/chap1.tex +++ b/chap/chap1.tex @@ -23,7 +23,7 @@ Tomasulo 算法\supercite{tomasulo},可以识别指令之间的依赖关系, 它使得指令按序提交至体系结构状态中,如果异常发生,则丢弃未提交的指令的 结果。 -超标量处理器设计允许处理器平均没周期执行多于一条指令,它可以在一周期内 +超标量处理器设计允许处理器平均每周期执行多于一条指令,它可以在一周期内 同时分发多个指令至不同的执行单元,进一步开发了程序的指令级并行性。 程序中除了数据相关之外,还存在控制相关。程序中存在大量的分支指令,等待 @@ -47,7 +47,7 @@ Tomasulo 算法\supercite{tomasulo},可以识别指令之间的依赖关系, \end{figure} 图\ref{fig:skylake}是 Intel Skylake 微体系结构的示意图,它是一个乱序执行超标 -量处理器体系结构,每周期最多可以将 6 个微操作发射至 8 组执行单元中执行, +量处理器微体系结构,每周期最多可以将 6 个微操作发射至 8 组执行单元中执行, 它的 ROB 使得流水线中可以同时存在 224 个微操作,它的分支预测器可以预测 分支的方向和目标地址,使处理器在预测的目标处取出指令至指令缓存。 @@ -96,9 +96,9 @@ Microsoft 等软件厂商,均发布了软件补丁或处理器微码更新, Gem5 是一个模拟平台,由 GEMS\supercite{gems} 和 M5\supercite{m5} 两个 模拟器项目合并而成,同时具有这两个模拟器的优点。M5 提供了一个可配置的 框架,支持多种指令系统和多种 CPU模型,GEMS 则提供了一个详细而灵活的存 -储系统,支持多种缓存一致性模型和互联模型。Gem5 支持 X86, ARM, Alpha, +储系统,支持多种缓存一致性模型和互联模型。Gem5 支持 x86, ARM, Alpha, MIPS, RISC-V 等指令系统。作为一个开源的模拟器,学术界和工业界都为 Gem5 -的开发做出贡献,使得 Gem5 称为体系结构研究中最流行的模拟器之一。 +的开发做出贡献,使得 Gem5 成为体系结构研究中最流行的模拟器之一。 \begin{figure}[htbp] \centering @@ -144,7 +144,7 @@ Gem5 模拟器使用 C++ 编写,并集成了 Python,模拟器的核心功能 Spectre 攻击的各个变体。 第三章~\nameref{sec:defense}。对已经提出的 Meltdown 和 -Spectre 攻击的软硬件防御进行分析。 +Spectre 攻击的软硬件防御方法进行分析。 第四章~\nameref{sec:mywork}。提出本文所设计的防御 Spectre 攻击的方法,并描述在 Gem5 模拟器上的实现。 diff --git a/chap/chap2.tex b/chap/chap2.tex index 52d5410..bcdd020 100644 --- a/chap/chap2.tex +++ b/chap/chap2.tex @@ -34,7 +34,7 @@ Diffie-Hellman,RSA 等密码的私钥。\supercite{TimingAttack} 这是最早 \item Prime+Probe: 受害者运行一段程序后,攻击者访问缓存某一组的每一路, 观察访问时间是否有变化 \item Flush+Reload: 攻击者利用 x86 的 clflush 等指令清除一个共享内存地 - 址对应的缓存行,在受害者运行一段程序后,攻击者重新装载该行对应的地址 + 址对应的缓存行,在受害者运行一段程序后,攻击者重新读取该行对应的地址 的数据,通过测量访问时间推断受害者是否访问了这个共享的地址 \end{enumerate} @@ -158,7 +158,7 @@ Meltdown 打破了处理器内存隔离功能提供的所有安全保障。这 其内部运行的代码访问,并且在任何特权级别(包括潜在的恶意操作系统和虚拟 机管理程序)上运行的软件和所有其他隔离区都无法访问。除了强大的内存隔 离外,TEE 通常还提供一个证明(attestation)原语,从而可以从本地或远程, -在运行时从密码学上验证特定的隔离区已经加载到真正的(因而被认为是安全的) +在运行时从密码学上验证特定的隔离区已经加载到真正的(从而被认为是安全的) TEE 处理器上。 2013 年发布的 Intel 软件防护扩展(Software Guard eXtention, SGX) @@ -172,11 +172,11 @@ Systems 依靠 SGX 在 Signal 网络中实现隐私友好的联系人发现功 \supercite{sawtooth}技术更是依赖于 SGX 的正确性。 然而,Foreshadow\supercite{foreshadow} 攻击表明,当前的 SGX 实现并没有 -满足它的安全目标。Foreshadow 攻击利用现代 Intel 处理器中的乱序执行机制, +满足它的安全目标。这种攻击利用现代 Intel 处理器中的乱序执行机制, 可以从处理器的缓存中泄露明文的隔离区数据。Foreshadow 和 Meltdown 利用 相似的处理器漏洞,处理器的控制逻辑允许攻击者在暂态的乱序执行指令回滚之 前,使用未授权的内存访问的结果。和 Meltdown 攻击针对传统的分层保护域不 -同,Foreshadow 考虑了一种非常不同的攻击模型,攻击者的目标不是从用户空 +同,Foreshadow 考虑一种不同的攻击模型,攻击者的目标不是从用户空 间读取内核内存,而是破坏最先进的地址空间内隔离区保护域,它不在已经部署 的用于防御 Meltdown 的内核页表隔离技术的保护之内。在 Foreshadow 攻击中, 无特权的普通用户即可完成基本的攻击,而无需以 root 的身份访问受害者机器。 @@ -189,10 +189,10 @@ SGX 处理器无法保证隔离区的数据保密性,也无法证明隔离区 但现有的 SGX 处理器甚至无法在没有特权的用户空间攻击者面前保护隔离区中 的秘密数据。 -所有先前已知的针对 SGX 的攻击都依赖于软件特定的侧信道泄露或软件漏洞。 -人们普遍认为,精心编写的隔离区可以通过坚持良好的编码实践,例如不使用依 -赖秘密数据的分支,来防止信息泄露。这些攻击都没有破坏 Intel 定义的 SGX -的安全保证,防止侧信道攻击应该是隔离区开发者的责任。 然而,Foreshadow +所有先前的针对 SGX 的攻击都依赖于软件中的侧信道泄露或软件漏洞。 +人们普遍认为,精心编写的隔离区可以通过坚持良好的编码实践防止信息泄露, +例如不使用依赖秘密数据的分支操作。这些攻击都没有破坏 Intel 定义的 SGX +的安全保证。 然而,Foreshadow 否定了这一论点,因为它完全依赖于基本的 Intel x86 处理器的行为,并且不 利用任何软件漏洞,甚至不需要知道受害者隔离区的源代码。 @@ -213,7 +213,7 @@ TLB 中查询对应的物理地址,如果 TLB 中没有这个地址对应的 一步检查地址翻译的结果,确保这个地址翻译遵守硬件强制的隔离区访问控制限 制。如果这三个独立的阶段出现了一个访问违例,则处理器抛出一个页错误,控 制流转向异常处理代码,而在启用了 SGX 的处理器中,大多数的隔离区内存违 -例会被处理器忽视,将内存装载指令得到的值设为 abort page 的值 -1. +例会被处理器忽视,将内存装载指令得到的值设为放弃页(abort page)的值 -1. 在体系结构层次上,以上的地址翻译过程在文档中有精确的描述。现代处理器为 了加快地址翻译和内存访问,使用了并行访问和额外的缓存结构。在 Meltdown @@ -230,16 +230,17 @@ TLB 中查询对应的物理地址,如果 TLB 中没有这个地址对应的 一级缓存命中,数据返回至处理器的执行单元。 如果启用 SGX 的处理器使用 Meltdown 攻击,攻击者读取未授权的隔离区内存 -时,不会产生异常,而是读出 abort page 值 -1. 但是 abort page 只在页权 -限检查通过后发生,攻击者可以将该页的存在(present)位清除,即将该页设 +时,不会产生异常,而是读出放弃页,但是它只在页权 +限检查通过后发生。攻击者可以将该页的存在(present)位清除,即将该页设 为不存在,此时处理器便会产生异常,但由于一级缓存使用虚拟地址索引,因此 仍然可以从一级缓存读取该虚拟地址中的数据,从而暂态指令可以泄露 SGX 隔 离区中的数据。 -% TODO: 在哪些处理器上能用这些攻击 +在 Skylake 微体系结构的 Intel i7-6700 中使用 Foreshadow 攻击, +可以以 81.14\% 的精确度提取一级缓存行的数据。 通过将一个页设为不存在,绕过地址翻译,从一级缓存读取数据的攻击方式, -Intel 将其称为L1终端错误(L1 Terminal Fault)\supercite{l1tf}。 利用相 +Intel 称其为L1终端错误(L1 Terminal Fault)\supercite{l1tf}。 利用相 同的原理,Foreshadow-NG\supercite{foreshadowNG} 新增了Foreshadow-OS 和 Foreshadow-VMM 两种 Foreshadow 类型的攻击,可以绕过操作系统和虚拟机的 隔离。 @@ -294,7 +295,7 @@ Foreshadow 攻击使用在可以直接控制客户机器物理地址和一级缓 图 \ref{fig:foreshadow-vmm} 展示了一种情况,一个恶意的虚拟机可以利用暂 态执行攻击窃取属于同一处理器核的另一个虚拟机中的数据。这种攻击并不局限 -于超线程受害者,因为 Foreshadow-VMM 可以提取处理器物理核心一级数据高速 +于使用 SMT 的情形,因为 Foreshadow-VMM 可以提取处理器物理核心一级数据高速 缓存中的任何秘密。 @@ -318,7 +319,7 @@ x87 浮点单元(FPU)是 x86 的处理器的一个扩展,其最初目的 态,曾经是一个开销很大的操作,因为内存速度慢并且大小有限。此外,那时 FPU 只在少数程序中被使用。在 FPU 不被所有进程使用的情况下,在每个上下 文切换时,切换 FPU 状态会产生不必要的开销。为了能够减少这种开销,x86 -处理器引入了一个控制寄存器位 cr0.ts,允许操作系统打开和关闭FPU,当FPU +处理器引入了一个控制寄存器位 cr0.ts,允许操作系统打开和关闭 FPU,当 FPU 关闭时,它会保持其状态,但用户和内核代码都无法访问。 利用 cr0.ts 实现的优化称为延迟 FPU 上下文切换(lazy FPU context @@ -334,7 +335,7 @@ switching)。核心思想是 FPU 寄存器状态仅在必要时进行上下文 当前进程是否为 FPU 所有者,如果是,则 FPU 寄存器状态属于该进程,操作系 统启用 FPU,该进程再次可以自由执行 FPU 指令。否则,则操作系统在启用 FPU 的同时,将当前 FPU 寄存器状态存储到 FPU 所有者进程的状态保存区域, -并恢复当前进程的FPU 寄存器状态,并将该进程设为 FPU 的所有者。这个算法 +并恢复当前进程的 FPU 寄存器状态,并将该进程设为 FPU 的所有者。这个算法 在不同操作系统中的实现可能不同,它们的共同点是,使用 FPU 的进程切换到 不使用 FPU 的进程时,操作系统不需要上下文切换 FPU 寄存器的状态。 @@ -398,12 +399,12 @@ Spectre-STL. Spectre 攻击使得受害者程序在暂态指令中执行在严格按序执行时不会执行的操 作,这些操作会将秘密信息通过隐蔽信道泄露给攻击者。 -Spectre 攻击通常分为三个阶段。第一个阶段是设置阶段(setup phase),攻 +Spectre 攻击通常分为三个阶段。第一个阶段是设置阶段,攻 击者执行一些用于训练处理器的操作,使得处理器在后续的阶段中,产生可被攻 击者利用的错误的推测式执行。此外,在设置阶段中,需要增大推测式执行的窗 口,使得推测式执行中的指令足够多,从而可以执行攻击者希望处理器执行的指 令,实现方式包括操作高速缓存状态,从缓存中去除预测的分支所依赖的数据。 -在这个阶段,攻击者还可以进行隐蔽信道的准备,如Flush+Reload 攻击中清除 +在这个阶段,攻击者还可以进行隐蔽信道的准备,如 Flush+Reload 攻击中清除 探测数组对应缓存行的操作。 在第二个阶段,处理器在推测式执行中,将受害者上下文中的秘密信息,传送至 diff --git a/chap/chap3.tex b/chap/chap3.tex index 68baf93..5cde315 100644 --- a/chap/chap3.tex +++ b/chap/chap3.tex @@ -14,7 +14,7 @@ Meltdown 攻击的方案。它的作用是在用户空间中去除内核空间 得用户空间的执行的指令无法访问内核空间的存储区域。 防御 Meltdown 型攻击的第二种方法是阻止异常的产生。例如对于 LazyFP,最 -新的 Linux 内核在上下文切换时,对所有进程都会保存和恢复浮点寄存器,从 +新的 Linux 内核在上下文切换时,会保存和恢复所有进程的浮点寄存器,从 而用户程序使用浮点寄存器都不会产生异常,从而消除这种攻击。 \section{Spectre 型攻击的防御} @@ -140,12 +140,12 @@ SafeSpec\supercite{safespec}提出了一种设计原则保护处理器免受推 虽然 SafeSpec 原则上很简单,但必须解决许多与其安全性,复杂性和性能相关的 问题。 -将状态从影子状态移动到提交状态有两种选择。第一种选择是等待分支(Wait +将状态从影子状态移动到提交状态的时机有两种选择。第一种选择是等待分支(Wait For Branch,WFB),当一个指令依赖的所有分支结果都已经得出时,这个指 -令不再是推测式执行的指令。WFB 可以防御 Spectre v1 和 v2,它们依赖于错误 -的分支预测,没有任何错误的推测式执行产生的状态进入提交状态。而 -Meltdown 不依赖于分支预测,因此 WFB 不能防御 Meltdown. 第二种选择是等 -待提交(Wait For Commit,WFC),在指令提交的时候,才将推测式执行产生的 +令不再是推测式执行的指令。WFB 可以防御利用错误分支预测的 Spectre v1 和 v2, +在分支结果得出前,错误的推测式执行产生的结果不会进入提交状态。 +Meltdown 不依赖于分支预测,因此 WFB 不能防御 Meltdown,需要采用等 +待提交(Wait For Commit,WFC)这种选择,在指令提交的时候,才将推测式执行产生的 状态更新至提交状态。 影子状态的大小是另一个设计选择。如果保存影子状态的结构太小,则会导致推 @@ -179,7 +179,7 @@ SafeSpec 原则可以用于在推测式执行中保护缓存和 TLB,方法是 结构移动至缓存。如果指令被丢弃,则释放影子结构对应的一项。在这种设计 中,被丢弃的推测式执行的装载指令不但不会修改缓存中的内容,也不会改变 缓存替换算法的状态。 -\item 指令缓存:构造一种利用指令缓存的 Spectre 攻击是可能的,因此指令 +\item 指令缓存:Spectre 攻击也可以利用指令缓存侧信道,因此指令 缓存也需要保护,方法和数据缓存类似。 \item TLB:TLB 也可以作为隐蔽信道使用,攻击者可以检查访问一个页的时间 判断 TLB 是否命中。现代处理器进行地址翻译是个复杂的过程,在访问页表 @@ -197,7 +197,8 @@ SafeSpec 原则可以用于在推测式执行中保护缓存和 TLB,方法是 InvisiSpec \supercite{invisispec} 使推测式执行产生的副作用在数据缓存中 不可见,从而可以防御利用推测式执行的攻击。它的目标是阻止由推测式执行的 装载操作产生的微体系结构侧信道和隐蔽信道,如缓存占用、缓存行替换算法信息、 -缓存一致性状态等。和 SafeSpec 不同,InvisiSpec 支持多处理器。 +缓存一致性状态等。InvisiSpec 和 SafeSpec 相似,但是考虑了内存一致性, +支持多处理器核的系统。 Spectre 等攻击由暂态指令引起,为了定义 InvisiSpec 的攻击模型, 表\ref{tab:transient_insn}列出了各种攻击中暂态指令的来源。InvisiSpec 关 @@ -443,7 +444,7 @@ DAWG 的目标是阻止任何攻击者和受害者安全域之间的基于缓存 的路之内。在此之上,缓存所带的元数据,如替换策略的状态,也要在保护域内 定义,并安全地划分。 -图\ref{fig:dawg-cache}展示了 DAWG 缓存的结构。处理器中增加几个 MSR,用 +图\ref{fig:dawg-cache}展示了 DAWG 缓存的结构。处理器中增加几个型号特定寄存器(MSR),用 于记录处理器当前所在的保护域,和保护域的策略。每个逻辑核在访问存储器时 均带有一个域标识字段。 @@ -543,7 +544,7 @@ fence 操作的设计上有以下考虑: 条件推测式执行(Conditional Speculation) \supercite{conditional-speculation} 是一种检测推测式执行中的潜在的泄露 数据的指令,并阻止其执行的方法。为了检测可能在推测式执行中泄露数据的指 -令,此工作提出安全依赖(security dependence)的概念,类似于数据依赖和 +令,此工作提出\emph{安全依赖(security dependence)}的概念,类似于数据依赖和 控制依赖,执行存在安全依赖的指令则产生安全冒险。这种新的依赖用于描述具 有潜在的泄漏微体系结构信息的安全风险的推测性执行的指令。对于信道 $c$, 指令 $j$ 安全依赖于指令 $i$,如果: diff --git a/chap/chap4.tex b/chap/chap4.tex index 38ad65d..1d6c758 100644 --- a/chap/chap4.tex +++ b/chap/chap4.tex @@ -197,8 +197,8 @@ void victim(size_t x, uint8_t k) { InvisiSpec\supercite{invisispec} 是使用临时结构存放推测式执行中读取的 数据,从而防止暂态访存指令结果泄露的方法。和 Spectre 攻击的检测机制结 -合后,可以作为单条不安全指令的执行机制。这种方法将不安全指令从内存中读 -到的数据放入推测式执行缓冲区中,后续的指令可以使用这条指令的执行结果, +合后,可以作为单条不安全指令的执行机制。这种方法将不安全的内存读取中取得 +的数据放入推测式执行缓冲区中,后续的指令可以使用这条指令的执行结果, 确保指令流的继续执行。在推测式执行错误时,推测式执行缓冲区的内容会被丢 弃,缓存状态不会改变,因此不会产生侧信道。推测式执行被验证为安全时,缓 冲区中的数据将会更新至存储系统。为类确保不发生访存违例 InvisiSpec 需要 @@ -260,7 +260,7 @@ Gem5 的提交阶段由 DefaultCommit 类实现,它提交 ROB 队列头部的 \end{figure} 图 \ref{fig:load_exec} 是 Gem5 中执行一条装载指令的总体流程。 -在执行阶段,处理器将装载指令传递至 LSQ,装载指令将会按序进入 LQ. Gem5 +在执行阶段,处理器将装载指令传递至 LSQ,装载指令将会按序进入装载队列(LQ)。 Gem5 用指令系统特定的 initiatAcc 方法模拟该指令系统中装载指令访问存储系统的 方式。最后 LSQ 将装载指令的信息封装为一个请求,用 sendTimingReq 将这个 请求发送至存储系统。 diff --git a/chap/chap5.tex b/chap/chap5.tex index f4474ec..201569f 100644 --- a/chap/chap5.tex +++ b/chap/chap5.tex @@ -43,13 +43,13 @@ InvisiSpec 的方案执行,Fence+DIFT 和 IS+DIFT 则是使用动态信息流 \hline 提交宽度 & 8\tabularnewline \hline -ROB & 192\tabularnewline +重排序缓冲区长度 & 192\tabularnewline \hline -LDQ & 32\tabularnewline +装载队列长度 & 32\tabularnewline \hline -STQ & 32\tabularnewline +存储队列长度 & 32\tabularnewline \hline -发射队列大小 & 64\tabularnewline +发射队列长度 & 64\tabularnewline \hline 转移预测 & TournamentBP, 4096 BTB, 16 RAS\tabularnewline \hline @@ -66,8 +66,8 @@ L2 Cache & 2MB, 16路组相联, 8周期延迟\tabularnewline 本文评测每种微体系结构设计的安全性和性能。安全性表现为是否受 Spectre 攻击的影响,本文构造测试程序测试微体系结构的安全性。性能指标使用每个微 -体系结构设计运行基准程序,和 Baseline 的运行时间的比值,平均性能取这些 -比值的几何平均数。 +体系结构设计运行基准程序,和 Baseline 的运行时间的比值,作为相对运行时间。 +性能开销为相对 Baseline 增长的运行时间。平均性能取各个基准程序相对运行时间的几何平均数。 \section{功能验证} @@ -75,7 +75,7 @@ L2 Cache & 2MB, 16路组相联, 8周期延迟\tabularnewline 方案可以防御 Spectre 攻击。 由于 Gem5 的 Ruby 存储模型不支持 clflush 指令,因此测试程序使 -用Evict+Reload 的方式进行攻击。由于配置的系统末级缓存为 2MB,可以对一 +用 Evict+Reload 的方式进行攻击。由于配置的系统末级缓存为 2MB,可以对一 个2MB 的存储区域进行访问,以清除缓存内原有内容,具体代码可 见附件\ref{lst:poc_for_gem5}。 -- cgit v1.2.3