diff options
Diffstat (limited to 'chap/chap3.tex')
-rw-r--r-- | chap/chap3.tex | 236 |
1 files changed, 118 insertions, 118 deletions
diff --git a/chap/chap3.tex b/chap/chap3.tex index 329d223..9e49e95 100644 --- a/chap/chap3.tex +++ b/chap/chap3.tex @@ -1,15 +1,15 @@ \chapter{Meltdown 和 Spectre 攻击的防御方案及分析}\label{sec:defense} Meltdown 和 Spectre 及其多种变体被发现后,研究者提出了多种减轻这些攻击 -的防御方法,它们需要对软件或硬件进行修改。 +的软硬件防御方法。本章讨论并分析已有的防御方法。 \section{Meltdown型攻击的防御} -Meltdown型攻击利用了暂态指令可以读取体系结构层次上不可访问的数据,并且 +Meltdown 型攻击利用了暂态指令可以读取体系结构层次上不可访问的数据,并且 用此数据做计算。因此一种防御方式是使体系结构层次上不可访问的数据,在微 架构层次上仍然不可访问。 -KAISER\supercite{kaiser}是一种已经部署在 Linux 内核上的一种防御 +KAISER\supercite{kaiser} 是一种已经部署在 Linux 内核上的一种防御 Meltdown 攻击的方案。它的作用是在用户空间中去除内核空间的地址映射,使 得用户空间的执行的指令无法访问内核空间的存储区域。 @@ -30,9 +30,9 @@ Intel 和 AMD 都提出了在分支指令后插入 lfence 指令阻止推测式 为一条串行化指令使用,可以在 lfence 指令提交前阻止新的指令执行,从而阻 止了程序在推测式执行中对秘密数据进行操作。 -由于 lfence 性能开销大,LLVM提出推测式装载指令加固(Speculative -Load Hardening)\supercite{spec-load-hardening} 技术,它的做法是将可能 -为 Spectre 组件的代码转为图\ref{fig:SLH}中的代码。 +由于 lfence 性能开销大,LLVM 提出推测式装载加固(Speculative Load + Hardening)\supercite{spec-load-hardening} 技术,它的做法是将可能为 +Spectre 组件的代码转为图 \ref{fig:SLH} 中的代码。 \begin{figure}[htbp] \centering @@ -56,9 +56,9 @@ Load Hardening)\supercite{spec-load-hardening} 技术,它的做法是将可 \label{fig:SLH} \end{figure} -产生的代码在两个分支中,都计算一个分支条件的状态,并将其作为存储访问指 -令或泄露数据指令的一个数据依赖,从而在得出分支结果之前,无法访问或泄露 -一个秘密数据。 +在产生的代码中,一个条件分支的两个分支中,都计算一个分支条件的状态,并 +将其作为存储访问指令或泄露数据指令的一个数据依赖,从而在得出分支结果之 +前,无法访问或泄露一个秘密数据。 retpoline\supercite{retpoline} 是 Google 提出的防御 Spectre-BTB 的方法。 它的作用是把程序中的间接转移指令修改为一个指令序列,最终使用 ret 指令 @@ -111,6 +111,9 @@ Google 为 Chrome 浏览器使用了站点隔离(site isolation)技术,使 \subsection{硬件防御方案} +由于软件防御方案可防御的攻击类型有限,并且性能开销大,因此研究人员提出 +了多种硬件防御方案。 + \subsubsection{SafeSpec} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% gtran %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -168,7 +171,7 @@ SafeSpec 防止推测式执行的产生的值影响提交状态,从而阻止 SafeSpec 原则可以用于在推测式执行中保护缓存和 TLB,方法是在处理器中加 入以下影子结构: -\begin{itemize} +\begin{enumerate} \item 数据缓存:在已有的 Spectre 攻击中都用到了数据缓存作为隐蔽信道。 它的影子结构保存了推测式执行中获取的缓存行。在装载/存储队列中,将获 得了数据的推测式执行的装载指令指向影子结构的对应项,在同一个分支下访 @@ -183,7 +186,7 @@ SafeSpec 原则可以用于在推测式执行中保护缓存和 TLB,方法是 时,页表项也会带入数据缓存,这个过程也使用装载存储队列,因此数据缓存 的保护足够保护这个过程。因此对 TLB 的保护只需要添加 TLB 本身的影子结 构。 -\end{itemize} +\end{enumerate} 使用 MARSSx86 模拟上述 SafeSpec 模型,可以发现运行 SPEC2017 有平均 3\% 的性能提升。性能提升的原因是影子结构增大了有效缓存的容量,避免了错误推 @@ -247,13 +250,13 @@ InvisiSpec 在不同的内存一致性模型下,会使用不同的执行策略 可以导致内存一致性违例,此时处理器需要用恢复机制重新执行这个装载指令及 其后的指令。 -TSO(Total Store Order)是 x86 体系结构所用的内存模型。TSO 允许一个装载 -操作在不同地址的存储操作之前完成,除此之外禁止所有可见的装载和存储的重 -排序。在实现中,为了防止可见的装载指令的重排序,需要确保一个装载操作读 -入的数据,在提交时仍然有效。如果处理器核遇到一个外部的缓存失效请求,则 -需要重新执行这个装载操作。存储指令的顺序由先入先出的写缓冲区保证。 - -RC(Release Consistency)则允许任何访存操作的重排序,除非使用同步指令。 +常见的内存模型有 TSO(Total Store Order) 和 RC (Release Consistency)。 +TSO 是 x86 体系结构所用的内存模型。TSO 允许一个装载操作在不同地址的存 +储操作之前完成,除此之外禁止所有可见的装载和存储的重排序。在实现中,为 +了防止可见的装载指令的重排序,需要确保一个装载操作读入的数据,在提交时 +仍然有效。如果处理器核遇到一个外部的缓存失效请求,则需要重新执行这个装 +载操作。存储指令的顺序由先入先出的写缓冲区保证。RC 则允许同步指令之外 +的任何访存操作的重排序。 InvisiSpec 关注不安全的推测式执行的装载指令(Unsafe Speculative Load,USL),在 Spectre 的攻击模型中,USL 是在未决分支之后的装载指令, @@ -274,7 +277,7 @@ Point),这时其他线程可以看到这个操作在存储系统中的效果 USL 请求的缓存行在 USL 发射时有可能已经在一级缓存中,这个缓存行也被载 入推测式执行缓冲区。处理器可能接收对这一行的失效请求,但是 USL 会忽视 -这个请求,这个失效请求的效果的会在可见时间点处理。 +这个请求,这个失效请求的效果会在可见时间点处理。 %\Todo: InvisiSpec V: INVISISPEC: THWARTING SPECULATION ATTACKS @@ -294,10 +297,11 @@ USL 请求的缓存行在 USL 发射时有可能已经在一级缓存中,这 %当USL发布并且线路加载到SB时,USL请求的线路可能已经在核心的L1缓存中。在这种情况下,核心可能会收到该行的无效。但是,USL忽略了这种失效,因为USL是不可见的,并且这种失效的任何影响都将在可见点处理。 -在可见时间点重新装载数据,有两种操作形式:验证(Validation)和曝光 -(Exposure)。验证操作将 USL 用到的数据,和存储系统中这些数据的最新的值 -做比较,如果不相同,USL 和其后的所有指令都需要重新执行。这个操作用于满 -足内存一致性模型,方法类似于基于值的内存保序方法。\supercite{cain-lapasti} +在可见时间点重新装载数据,有两种操作形式。第一种方式是验证 +(Validation),它将 USL 用到的数据,和存储系统中这些数据的最新的值做 +比较,如果不相同,USL 和其后的所有指令都需要重新执行。这个操作用于满足 +内存一致性模型,方法类似于基于值的内存保序方法。 +\supercite{cain-lapasti} %如果在该窗口期间,核心已经收到USL加载的行的无效,则验证是在可抑制可见性窗口期间(由于内存一致性考虑)使可见的USL可见的方法。验证操作包括将USL使用的实际字节(存储在SB中)与从缓存层次结构加载的最新值进行比较。如果它们不相同,USL及其所有连续指令都会被压扁。这是满足内存一致性模型所必需的。这一步让人想起Cain和Lipasti的基于价值的记忆排序[31]。 @@ -305,9 +309,10 @@ USL 在验证阶段不能提交,需要等待验证结束,在这个时间段 取缓存行并写入缓存,比较推测式执行缓冲区和读入的缓存行中,USL 所要使用 的数据。如果 USL 在 ROB 队头并且 ROB 已满,会导致流水线停顿。 -InvisiSpec 可以识别很多在 USL 可见之前,不会违反内存一致性模型的 USL, -并对它们使用开销较低的曝光操作。这个操作只需要将读取到的一行数据存入缓 -存,当请求发送至存储系统后,指令即可提交,从而不会使流水线停顿。 +为了降低验证操作的开销,对部分 USL,InvisiSpec 使用另一种操作,称为曝 +光(Exposure),它用于在 USL 可见之前,不会违反内存一致性模型的 USL。 +这个操作只需要将读取到的一行数据存入缓存,当请求发送至存储系统后,指令 +即可提交,从而不会使流水线停顿。 %值得庆幸的是,InvisiSpec识别出许多在其抑制可见性窗口期间无法违反内存一致性模型的USL,并允许它们以廉价的曝光可见。 如果在该窗口期间核心已经收到USL加载的行的无效,则这些USL在禁用可见性窗口期间不会被内存一致性模型压扁。 在曝光中,缓存层次结构返回的行只是存储在缓存中而不进行比较。 一旦将行请求发送到缓存层次结构,持续曝光的USL就会退出。 因此,USL不会阻止管道。 @@ -318,7 +323,7 @@ InvisiSpec 可以识别很多在 USL 可见之前,不会违反内存一致性 %当可以使USL可见时,并且总是在它收到其请求的高速缓存行之后,硬件触发验证或暴露事务。这样的事务再次重新请求该行,这次修改缓存层次结构,并将该行带到本地缓存。如第V-A4部分所述,验证和暴露交易的运作方式不同,并且具有不同的性能影响。 InvisiSpec 针对 Spectre 和 Futuristic 两种攻击模型的设计略有不同。对 -于 Spectre 攻击模型,USL 在此前所有的控制流指令得出结果后,则进入可见时 +于 Spectre 攻击模型,USL 在此前所有的控制指令得出结果后,则进入可见时 间点,此时处理器可以为这个指令执行验证或曝光操作。同时这些验证和曝光操 作在时间上可以重叠。 @@ -335,11 +340,12 @@ InvisiSpec 针对 Spectre 和 Futuristic 两种攻击模型的设计略有不同 %我们将这些设计称为InvisiSpec-Spectre(或IS-Spectre)和InvisiSpec-Future(或IS-Future)。它们显示在表II的第一行中。为了进行比较,第二行显示了如何使用基于栅栏的方法防御这些相同的攻击 - 遵循当前提出的防御幽灵的建议[32]。我们将这些设计称为Fence-Spectre和Fence- Future。前者在每个间接或有条件的分支后放置围栏;后者在每次装载前放置围栏。 和基于 fence 的方法相比,InvisiSpec 性能更优,因为和传统的不安全的机器 -相比,装载指令执行的时间不变。通过将更多的验证操作转化为曝光操作,可以 -减少流水线的停顿。最后一个问题是,InvisiSpec 会在存储系统中产生更大的 -流量和缓存端口的竞争。 +相比,装载指令执行的时间不变。InvisiSpec 有几个影响性能的问题。一个是 +验证操作造成的流水线停顿,通过将更多的验证操作转化为曝光操作,可以减少 +流水线的停顿。另一个问题是,InvisiSpec 会在存储系统中产生更大的流量和 +缓存端口的竞争。 -对于 TSO 内存模型,如果一个装载指令之前不存在更老的装载指令或者 fence, +对于 TSO 内存模型,如果一个装载指令之前不存在更早的装载指令或者 fence, 则它不会被对它读取的行的失效请求取消,因此,这些 USL 在可见时间点可以使 用曝光操作。相反,如果一个 USL 之前有其他的装载指令,则需要执行验证操 作。而对于 RC 模型,只有在 USL 之前有 fence 的情况下,才需要执行验证操 @@ -359,17 +365,14 @@ InvisiSpec 针对 Spectre 和 Futuristic 两种攻击模型的设计略有不同 一个 USL 执行两个内存访问,一个在首次发射的时候,另一个在验证或曝光的 时候。如果第一个访问在末级缓存缺失并访问主存,则第二个访问也很可能访问 主存。 - 为了提高性能,InvisiSpec 为每个核添加一个末级缓存推测式执行缓冲区 (LLC-SB),USL 的第一个访问如果来自主存,则将获取的一行同时放入LLC-SB, 此后在验证时,就可以从 LLC-SB 获取数据,而无需访问主存。而在另一个核访 问了这一行时,为了防止 LLC-SB 获取过时的数据,才需要使 LLC-SB 中的这一 行失效,验证和曝光操作将会从存储系统中存有最新数据的地方获取数据。 -%%%%%%%%%%%%%%%%%%% - 在 gem5 模拟器下, 使用 SPEC CPU2006 和 PARSEC 对 InvisiSpec 进行评测, -以 Spectre 为威胁模型,在 TSO 内存模型下,InvisiSpec 平均性能损失为 +在 TSO 内存模型下,以 Spectre 为威胁模型,InvisiSpec 平均性能损失为 21\%,而使用 fence 性能下降 74\%. InvisiSpec 的性能开销来源于三个方面,一个是验证导致的流水线停顿,在大 @@ -384,7 +387,7 @@ InvisiSpec 会增大存储系统中各个缓存之间,和缓存和主存之间 隐蔽信道是在已有的保护机制下,在不允许通信的进程之间传输信息的信道。例 如,当侧信道用于向攻击者传送秘密数据时,这种攻击包含一段在受害者保护域 -内执行的代码,用于访问秘密数据,和一个发送器,用于将秘密传递给攻击者。 +内执行的代码,用于访问秘密数据,以及一个传送器,用于将秘密传递给攻击者。 这些部分构成了一个数据通道,它基于秘密信息调制这个信道。由攻击者控制, 并在受害者保护域之外的接收器,可以监听信道上的信号,并对其进行解码以确 定该秘密。图\ref{fig:dawg-schema}描述了这种攻击模式。 @@ -396,31 +399,32 @@ InvisiSpec 会增大存储系统中各个缓存之间,和缓存和主存之间 \label{fig:dawg-schema} \end{figure} -经典的对 RSA 的攻击中,代码使用了一段依赖于秘密的执行序列,将私密信息通 -过执行序列传送到了指令缓存状态中,这造成了一个攻击者可以推断秘密数据的 -隐蔽信道。在这种情况中,访问秘密数据和传送秘密数据的代码均在已有的 RSA -代码中。共享指令缓存的攻击者可以用一个接收器解码来自缓存信道的信息。 +经典的对 RSA 的攻击\supercite{RemoteTA}中,代码使用了一段依赖于秘密的 +执行序列,将私密信息通过执行序列传送到了指令缓存状态中,这造成了一个攻 +击者可以推断秘密数据的隐蔽信道。在这种情况中,访问秘密数据和传送秘密数 +据的代码均在已有的 RSA代码中。共享指令缓存的攻击者可以用一个接收器解码 +来自缓存信道的信息。 Meltdown 和 Spectre 提供了新了构造数据通道的方式。通过利用错误的推测式 执行,攻击者可以使处理器执行通常无法访问的代码路径。在 Meltdown 中,攻 击者推测式执行一段代码,作为数据通道,它可以非法访问秘密数据,并在异常 发生之前通过微体系结构副作用传输至接受者。在 Spectre 中,攻击者使分支预测器 -预测错误,使处理器沿着攻击者选择的路径推测式执行,这在受害者中形成了数 +预测错误,使处理器沿着攻击者选择的路径进行推测式执行,在受害者中形成了数 据通道。因此,构建数据通道有三种方法: -\begin{itemize} +\begin{enumerate} \item 数据通道在受害者的代码中已经存在,例如对 RSA 的攻击 \item 攻击者编写了这个数据通道,如 Meltdown -\item 攻击者从受害者已有的代码中合成数据通道 -\end{itemize} +\item 攻击者从受害者已有的代码中合成数据通道,如 Spectre +\end{enumerate} -这个框架可以用于除缓存状态之外的侧通道,描述通过分支预测器或 TLB 状态造 +这个框架可以用于描述除缓存状态之外的侧通道,例如通过分支预测器或 TLB 状态造 成的数据泄露。在未来,可能有更多种类的构造数据通道的方法。 DAWG(Dynamically Allocated Way Guard)\supercite{dawg} 是利用保护域之 -间的强隔离防止数据提取的方法,它阻止了任何一对发送器/接收器共享相同的信 +间的强隔离防止数据被攻击者提取的方法,它阻止了任何一对传送器/接收器共享相同的信 道。这是一种用于缓存等组相联结构设计的的安全路划分机制。DAWG 为组相联的 -结构添加保护域信息,以提供强隔离。和 Intel CAT 不同,DAWG 不允许跨保护 +结构添加保护域信息,以提供强隔离。和 Intel CAT \supercite{IntelCAT}不同,DAWG 不允许跨保护 域发生缓存命中。 DAWG 的目标是阻止任何攻击者和受害者安全域之间的基于缓存的信道。实现方 @@ -429,7 +433,7 @@ DAWG 的目标是阻止任何攻击者和受害者安全域之间的基于缓存 \begin{figure}[htbp] \centering - \includegraphics[width=0.8\textwidth]{dawg-cache.pdf} + \includegraphics[width=0.6\textwidth]{dawg-cache.pdf} \caption{DAWG 缓存设计\supercite{dawg}} \label{fig:dawg-cache} \end{figure} @@ -485,36 +489,20 @@ Decoding (CSD)\supercite{context-sensitive-decoding},一种微码翻译机制 的扩展,用于动态按需自定义微操作指令流。CSF 利用 CSD,在微指令流中注入 fence 等微码,阻止不安全指令的推测式执行。 -CSD 是一种根据执行上下文,把指令翻译为不同的自定义的微码的技术。操作系 +CSD 是一种根据执行上下文,把指令翻译为不同的自定义微码的技术。操作系 统、运行时系统等软件可以通过配置 MSR,设定不同的微码翻译模式。它可以在 -不重新编译的情况下,使不安全的程序变为安全的程序,把优化性能的代码变为 -功耗优化的代码。系统软件可以利用已有的微码更新功能将自定义的微码更新至 -寄存器。CSD 可以通过多种事件触发自定义微码翻译模式。 +不重新编译的情况下,使不安全的程序变为安全的程序,把面向性能优化的代码变为 +面向功耗优化的代码。系统软件可以利用已有的微码更新功能将自定义的微码更新至 +处理器中。CSD 可以通过多种事件触发自定义微码翻译模式。 CSF 由以下几个关键部件组成: -\begin{itemize} +\begin{enumerate} \item 微码自定义机制 CSD:使处理器精确地在指令流中插入 fence,减轻推测 式执行中不期望的副作用 \item 译码级信息流追踪(DLIFT)框架:用于检测潜在不安全的执行模式,触 发微码自定义机制 \item 错误训练防御:用于保护分支预测器、返回地址栈等部件 -\end{itemize} - -为了降低 fence 的性能开销,CSF 还提出了3种新的用于防 -御 Spectre 的 fence. 在 fence 操作的设计上有以下考虑: - -\begin{itemize} -\item 作用位置:x86 的 lfence 作用在指令队列阶段,使得后续的指令 - 在lfence 提交前无法进入指令队列后的流水线结构。fence 作用在更晚的阶段 - 的结构,可以减少 fence 对性能的影响,而保护的侧信道更少。 -\item 严格和宽松的 fence:严格的 fence 会阻止所有指令越过 fence,而宽松 - 的 fence 允许某些指令越过它们。例如 lfence 是个严格 - 的 fence,而 sfence 允许存储指令之外的指令越过 fence,是个宽松 - 的 fence. -\end{itemize} - -表 \ref{tab:csffence} 是 CSF 定义的三种 fence,它们防御的 Spectre 变体 -有所不同。 +\end{enumerate} \begin{table} \centering @@ -534,29 +522,40 @@ CFENCE & 缓存控制器 & 宽松 & 无 & v1\tabularnewline \centering \end{table} +为了降低 fence 的性能开销,CSF 还提出了3种新的用于防御 Spectre 的 +fence. 表 \ref{tab:csffence} 列出了它们的特性和防御的攻击种类。在 +fence 操作的设计上有以下考虑: + +\begin{enumerate} +\item 作用位置:x86 的 lfence 作用在指令队列阶段,使得后续的指令 + 在lfence 提交前无法进入指令队列后的流水线结构。fence 作用在更晚的阶段 + 的结构,可以减少 fence 对性能的影响,而保护的侧信道更少。 +\item 严格和宽松的 fence:严格的 fence 会阻止所有指令越过 fence,而宽松 + 的 fence 允许某些指令越过它们。例如 lfence 是个严格 + 的 fence,而 sfence 允许存储指令之外的指令越过 fence,是个宽松 + 的 fence. +\end{enumerate} -CSF 防御 Spectre 的开销在 8\% 以下。 +使用 CSF 和自定义的 fence,防御 Spectre 的开销在 8\% 以下。 \subsubsection{Conditional Speculation} -Conditional Speculation \supercite{conditional-speculation} 是一种检测 -推测式执行中的潜在的泄露数据的访存指令,并阻止其执行的方法。为了检测可 -能在推测式执行中泄露数据的指令,此工作提出安全依赖(security -dependence)的概念,类似于数据依赖和控制依赖,这种新的依赖性用于描述泄 -漏微体系结构信息具有潜在安全风险的推测性执行的指令。对于信道 $c$,指令 $j$ -安全依赖于指令 $i$,如果: +条件推测式执行(Conditional Speculation) +\supercite{conditional-speculation} 是一种检测推测式执行中的潜在的泄露 +数据的指令,并阻止其执行的方法。为了检测可能在推测式执行中泄露数据的指 +令,此工作提出安全依赖(security dependence)的概念,类似于数据依赖和 +控制依赖,执行存在安全依赖的指令则产生安全冒险。这种新的依赖用于描述具 +有潜在的泄漏微体系结构信息的安全风险的推测性执行的指令。对于信道 $c$, +指令 $j$ 安全依赖于指令 $i$,如果: -\begin{itemize} +\begin{enumerate} \item 在程序序列中,指令 $j$ 在 $i$ 之前 \item $j$ 在 $i$ 之前推测式地执行,并且 $j$ 会通过信道 $c$ 泄露数据 -\end{itemize} +\end{enumerate} 因为信息可以从多种信道上泄露,所以安全依赖的定义指定了某种信道。针对缓 存信道,如果指令 $j$ 不修改缓存的内容,则它对于缓存信道不具有安全依赖, -尽管它可能会泄露某些信息。 - -根据以上定义,表\ref{tab:secdep}总结了 Spectre 攻击中的主要的安全依赖。 -Spectre 攻击的安全依赖性来自两种情况,访存-访存推测和分支-访存推测。 +尽管它可能会通过其他信道泄露某些信息。 \begin{table} \centering @@ -579,11 +578,10 @@ SpectrePrime & 条件分支 & 访存\tabularnewline \centering \end{table} +根据以上定义,表 \ref{tab:secdep} 总结了 Spectre 攻击中的主要的安全依赖。 +Spectre 攻击的安全依赖性来自两种情况,分支-访存依赖和访存-访存依赖。 在条件推测式执行的流水线中,在发射队列中引入了安全冒险检测,以识别具有 -安全依赖的可疑的不安全指令。只要在执行阶段确认了真正的冒险,那些不安全 -的推测式执行将会使用现有的重执行和推测式执行恢复机制终止并丢弃。 - -% the following is from gtran +安全依赖的可疑的不安全指令。 \begin{figure}[htbp] \centering @@ -592,9 +590,10 @@ SpectrePrime & 条件分支 & 访存\tabularnewline \label{fig:cond-spec} \end{figure} -安全冒险的检测逻辑用一个矩阵实现。处理器中通常用矩阵跟踪数据依赖,而在 -安全检测中,处理器使用安全依赖矩阵确定要发射的指令是否存在安全相关。添 -加了安全依赖矩阵的发射阶段如图\ref{fig:cond-spec}所示。 +安全冒险的检测逻辑用一个矩阵实现。处理器中通常用矩阵跟踪数据依赖和指令 +的年龄信息,而用于安全检测时,处理器使用安全依赖矩阵确定要发射的指令是 +否存在安全依赖。图 \ref{fig:cond-spec} 展示了一个使用矩阵跟踪数据依赖 +和指令年龄信息,并加入安全依赖矩阵检测安全冒险的发射阶段。 安全依赖矩阵是一个 NxN 比特的数组,其中 N 为发射队列大小,用发射队列的 位置索引。对于指令队列中位置为 X, Y 的指令,如果该矩阵 Matrix 的位 @@ -618,40 +617,41 @@ Matrix[X,Y] {}={} & (IQ[X].opcode == Memory) \\ 在实现中,图\ref{fig:cond-spec}展示了发射队列的三个阶段。第一阶段中,数 据依赖矩阵生成一个依赖向量;第二阶段中,该向量发送至年龄矩阵,用于选择 最老的可发射的指令;在第三阶段,处理器将被选择要发射的指令放进安全依赖 -矩阵,查询它们的安全相关性。当一个将要发射的指令存在安全冒险时,它会被 -标上可疑推测式执行(\emph{suspect speculation})标记。 +矩阵,查询它们的安全依赖性。当一个将要发射的指令存在安全冒险时,它会被 +标上\emph{可疑推测式执行(suspect speculation)}标记。 -在指令 X 发射后,更新向量寄存器中的对应位设为0,在下一周期,依赖矩阵中 -X 对应的一列将会重置,意味着待发射指令和 X 的之间的安全相关被清除。 +在指令 X 发射后,更新向量寄存器(update-vector)中的对应位设为0,在下 +一周期,依赖矩阵中X 对应的一列将会重置,意味着待发射指令和 X 的之间的 +安全相关被清除。 一种简单的冒险消除方式是阻止发射队列中标记了可疑推测式执行指令的执行, 但是这种策略会导致性能下降。为了实现性能,安全性和透明性的平衡,条件推 -测式执行提出了两种过滤机制,以找出错误识别的安全安全冒险。基于缓存命中 -的冒险过滤器针对命中缓存的推测式执行指令。因为它们的推测式执行不会改变 -缓存的内容,所以它们是安全的。另一个提出的过滤器,基于可信页面缓冲区 +测式执行提出了两种过滤机制,以找出错误识别的安全冒险。基于缓存命中 +的冒险过滤器针对命中缓存的推测式执行指令,因为它们的推测式执行不会改变 +缓存的内容,所以它们是安全的。基于可信页面缓冲区 (Trusted Page Buffer, TPBuf)的冒险过滤器,从另一个角度识别安全的推测 推测式执行的指令。对于使用基于共享内存(例如 Flush+Reload)的缓存侧通道 -攻击窃取内存信息的 Spectre 变体,他们对恶意组件的推测式执行具有名 -为 S-Pattern 的共同特征。 TPBuf 从所有推测式执行中捕获 S-Pattern,对于 -任何推测式执行的访存指令,如果它与 S-Pattern 不匹配,则被认为是安全的。 +攻击窃取内存信息的 Spectre 变体,他们对恶意组件的推测式执行具有称 +为\emph{S-模式}的共同特征。 TPBuf 从所有推测式执行中捕获S-模式,对于 +任何推测式执行的访存指令,如果它与S-模式不匹配,则被认为是安全的。 % hit-based -考虑到大多数程序有良好的时间局部性和空间局部性,一级缓存命中的访存请求 +考虑到大多数程序有良好的时间局部性和空间局部性,并且一级缓存命中的访存请求 不会修改缓存的内容,因此可以使用基于缓存命中的冒险过滤器,以减少阻止可 疑推测式执行的指令造成的性能损失。只要访存指令的访问命中一级缓存,则该 指令正常执行,但是如果缓存缺失,则该指令将会重新回到发射队列,直到安全 -依赖得到解决,才可疑重新发射。这个过滤器只需要对一级缓存的控制逻辑做少 -量修改,即不处理标记为可疑推测式执行的访存请求。 +依赖得到解决,才可以重新发射。这个过滤器只需要对一级缓存的控制逻辑做少 +量修改,即不处理标记为可疑推测式执行,并且不命中的访存请求。 % TPBuf 如果一个程序的一级缓存命中率低,则基于缓存命中的冒险过滤器仍然会阻止大 量的推测式执行。对于利用共享内存构造侧信道的 Spectre 攻击方式,并非所有 -的一级缓存缺失都可作为隐蔽信道使用。因此可以使用基于可信页面缓冲区的冒 +的一级缓存缺失都可作为隐蔽信道使用。因此可以使用基于 TPBuf 的冒 险过滤器,检测这些指令中安全的指令。在这些攻击中,Spectre 组件的执行中 包含两个特殊的访存指令,记为 A 和 B,它们有如下的行为: -\begin{itemize} +\begin{enumerate} \item A 推测式地访问敏感数据,B 推测式地访问攻击者和受害者共享的内存区 域,用于构造受害者和攻击者之间的侧信道。通常秘密数据的内存区域和用于 构造侧信道的共享内存区域在不同的内存页,因此它们访问不同的页。 @@ -659,19 +659,19 @@ X 对应的一列将会重置,意味着待发射指令和 X 的之间的安全 器推测式执行中访问 B 造成缓存缺失,重新将缓存行载入一级缓存,攻击者 再探测共享内存的缓存行发现这一变化。因此要通过缓存侧信道泄露信息,需 要 B 在缓存中不命中。 -\item 指令 B 依赖于指令 A,A的结果用于计算共享内存区域的索引。这种设计 - 也是攻击者推断处秘密数据要点。 -\end{itemize} +\item 指令 B 依赖于指令 A,A的结果用于计算共享内存区域的索引。这个特性 + 也是攻击者推断出秘密数据的要求。 +\end{enumerate} 在 TPBuf 过滤器中,以上行为模式称为 S-pattern. 如果观察到推测式执行的 指令序列具有以下特征,则认为它具有 S-pattern: -\begin{itemize} +\begin{enumerate} \item 至少有两个指令 A 和 B 访问不同的内存页 \item 指令 B 导致一级缓存缺失 \item B 依赖于 A \item A 和 B 之间可能有多个指令 -\end{itemize} +\end{enumerate} TPBuf 它记录了所有推测式的存储器访问请求,当一个新的请求在一级缓存中缺 失时,其页地址将会和 TPBuf 中其他访问的页地址比较,如果有至少一个访问访 @@ -679,13 +679,13 @@ TPBuf 它记录了所有推测式的存储器访问请求,当一个新的请 \begin{figure}[htbp] \centering - \includegraphics[width=0.8\textwidth]{tpbuf.eps} + \includegraphics[width=0.6\textwidth]{tpbuf.eps} \caption{TPBuf 的结构\supercite{conditional-speculation}} \label{fig:tpbuf} \end{figure} -TPBuf 的结构如图\ref{fig:tpbuf}所示。TPBuf 的条目和 LSQ 的条目一一对应, +TPBuf 的结构如图 \ref{fig:tpbuf} 所示。TPBuf 的条目和装载存储队列(LSQ)的条目一一对应, 它的条目分配、提交等操作和 LSQ 一起进行。TPBuf 包含了所有进行中的推测式 的访存指令。为了避免攻击者访问未授权的数据,并将其传播到自己的地址空间, 需要先用 TLB 获得访问的物理地址,将其写入 TPBuf 中该访问对应的一 @@ -720,11 +720,11 @@ Spectre 攻击需要分为三个步骤:从存储系统装载秘密数据,将 也不会泄露给攻击者。 因此,SpectreGuard 允许第一步发生,但将第二步延迟至装载秘密数据的指令 -之前所有分支均已解决。并且,在经过软件标记之后,第一步中仅当数据在敏感 +之前所有分支均已解决。并且,在经过软件标记之后,第一步中装载的数据仅当在敏感 内存区域时,才需要延迟转发。当秘密数据不经常访问时,总体开销可以忽略。 敏感数据的标记通过在页表中添加一个位实现,在软件中可以扩展操作系统 -的mmap, mprotect 等接口,或通过运行库、编译器、连接器实现。在微体系结构中, +的mmap, mprotect 等接口,或通过运行库、编译器、链接器实现。在微体系结构中, 指令执行后,执行结果将转发至后续依赖于这个指令的指令,而如果指令是访问 了敏感区域的指令,则推迟它的转发。 @@ -742,18 +742,18 @@ Spectre 攻击需要分为三个步骤:从存储系统装载秘密数据,将 % % Data Oblivious ISA(OISA)是一种 ISA 扩展,用于阻止信息通过侧信道泄露。 % 设计原则: -% \begin{itemize} +% \begin{enumerate} % \item ISA的安全性和微体系结构无关 % \item ISA不会阻止现代微处理器的优化技术 -% \end{itemize} +% \end{enumerate} % % OISA有以下组件: -% \begin{itemize} +% \begin{enumerate} % \item 动态跟踪敏感数据:使用DIFT跟踪程序运行时私密数据在处理器中的传 % 播。所有数据都有 confidential/public 标记,标签在读取操作数时必须 % 解析 % \item 指令定义操作数可以接受 public 还是 public/confidential 数据 -% \end{itemize} +% \end{enumerate} % \end{comment} % % % vim:ts=4:sw=4 |