% Copyright (c) 2014,2016,2018 Casper Ti. Vector % Public domain. \chapter{Meltdown和Spectre攻击的防御方案分析}\label{sec:defense} Meltdown 和 Spectre 及其多种变体被发现后,研究者提出了多种减轻这些攻击 的防御方法,它们需要对软件或硬件进行修改。也有研究者提出通过修改现有的 指令系统\supercite{oisa},使得用这种指令系统的程序不受 Spectre 攻击的 影响。 \section{Meltdown型攻击的防御} Meltdown型攻击利用了瞬时指令可以读取体系结构层次上不可访问的数据,并且用此数据做计算。因此一种防御方式是使体系结构层次上不可访问的数据,在微架构层次上仍然不可访问。 KAISER\supercite{kaiser}是一种已经部署在 Linux 内核上的一种防御 Meltdown 攻击的方案。它的作用是在用户空间中去除内核空间的地址映射,使 得用户空间的执行的指令无法访问内核空间的存储区域。 防御 Meltdown 型攻击的第二种方法是阻止异常的产生。例如对于 LazyFP,最 新的 Linux 内核在上下文切换时,对所有进程都会保存和恢复浮点寄存器,从 而用户程序使用浮点寄存器都不会产生异常,从而消除这种攻击。 \section{Spectre型攻击的防御} Spectre 型攻击的防御方案可以分为三类:阻止推测式执行、防止瞬时指令访问 秘密数据、切断隐蔽信道或降低隐蔽信道的精度。研究者在软件和硬件方面都提 出了防御方案。 \subsection{软件防御方案} 为了防御Spectre v1,Intel和AMD建议在分支指令后插入lfence指令阻止推测式 执行。由于lfence性能开销大,LLVM提出推测式装载指令加固(Speculative Load Hardening)\supercite{spec-load-hardening} 技术,它的作用是在指 令流中添加数据相关,使得装载指令使用的地址依赖于分支结果。 retpoline\supercite{retpoline} 是 Google 提出的防御 Spectre-BTB 的方法。 它的作用是把程序中的间接转移指令修改为一个指令序列,最终使用 ret 指令 完成跳转,从而使用 RSB 而不是 BTB 来进行间接转移的转移预测。 % index masking Webkit 在数组访问中使用 index masking\supercite{webkit} 方法,它让数组 下标和一个值进行与操作,去掉下标高位的1,将数组下标控制在一定范围内, 防止处理器在推测式执行中访问数组指定范围之外的数据。Linux 构造了一个粒 度更细的 array\_index\_nospec 宏\supercite{linux-spec},使得在推测式执 行的过程中,数组的索引始终在界内,避免了推测式的访问秘密数据。 % poison value Webkit 还使用了指针投毒(pointer poisoning)的方式,它考虑分支用于做类 型检查的情形。对于不同类型的数据,Webkit 将这种类型的指针和一个类型对 应的值异或,要使用的时候再异或这个值得到指向数据的指针,如果类型不匹配, 则得到的指针会指向一个程序无法访问的内存区域。通过这种方法,程序在推测 式执行中无法通过这种指针访问到程序中的数据,从而避免了秘密数据的泄露。 % site isolation, FIXME: needs citing Google 为 Chrome 浏览器使用了站点隔离(site isolation)技术,使得浏览 器用不同的进程访问不同的网站,从而攻击者无法通过用 Javascript 通过侧信 道攻击获取另一站点相关的数据。 % timer reduction 降低计时器精度可以降低计时攻击所用侧信道的精度,一个例子是在浏览器中降 低 Javascript 引擎中 performance.now 等计时器的精度。 \supercite{webkit} 但是相关研究发现,攻击者可以使用其他方式构造高精度 的计时器\supercite{js-timer},因此降低计时器精度不是一个有效的防御方法。 \subsection{硬件防御方案} \subsubsection{SafeSpec} SafeSpec\supercite{safespec} 提出了一种设计准则:使用临时结构保存推测式执行产 生的状态,而不影响处理器的主要微架构状态。在实现中,SafeSpec 为缓存和 TLB 添加了影子结构,推测式执行的指令对缓存和 TLB 修改临时写入至相应的 影子结构,直到此前分支正确或指令提交时,再将影子结构的数据更新至主结构。 \subsubsection{InvisiSpec} InvisiSpec\supercite{invisispec} 和 SafeSpec 类似,使用一个称为推测式 执行缓冲区(Speculative Buffer)的结构存放推测式执行的 load 指令从存储 系统中获取的数据,直到这条指令安全的时候再让它更新缓存。和 SafeSpec 不 同的是,InvisiSpec 考虑了缓存一致性和存储一致性的问题,在 load 指令确 认安全之后,增加一个验证的步骤,确认使用没有违反存储一致性。 在 gem5 模拟器下, 使用 SPEC CPU2006 和 PARSEC 对 InvisiSpec 进行评测, 以 Spectre 为威胁模型,在 TSO 内存模型下,InvisiSpec 平均性能损失为 21\%,而使用 fence 性能下降 74\%. \subsubsection{DAWG} Dynamic Allocated Way Guard(DAWG)\supercite{dawg} 是一种防御缓存侧信道 攻击的缓存设计。DAWG让不同的程序使用不同的安全域,一个安全域中的程序只 能使用缓存中的某些路,和 Intel CAT 允许程序在缓存任意一路命中不同, DAWG 不允许程序在安全域规定的路之外中发生缓存命中。 在 zsim 模拟器中使用 SPEC CPU2006, PARSEC, GAPBS 进行模拟,相对于 Intel CAT,在不同的评测程序和划分方式下,大多数程序性能下降为 4\%\~7\%. DAWG 的主要缺点是需要操作系统的支持。此外,DAWG 不能防御 NetSpectre 等可 在同一安全域内进行的攻击。 \subsubsection{Context-Sensitive Fencing} Context-Sensitive Fencing(CSF)\supercite{context-sensitive-fencing} 是 一种微码级防御多种类型 Spectre 攻击的方法。它基于 Context-Sensitive Decoding (CSD)\supercite{context-sensitive-decoding},一种微码翻译机制 的扩展,用于动态按需自定义微操作指令流。CSF 利用 CSD,在微指令流中注入 fence 等微码,阻止不安全指令的推测式执行。为了降低 fence 的性能开销, CSF 还提出了3种新的用于防御 Spectre 的 fence. CSF 由以下几个关键部件组成: \begin{itemize} \item 微码自定义机制 CSD:使处理器精确地在指令流中插入 fence,减轻推测 式执行中不期望的副作用 \item 译码级信息流追踪(DLIFT)框架:用于检测潜在不安全的执行模式,触 发微码自定义机制 \item 错误训练防御:用于保护分支预测器、返回地址栈等部件 \end{itemize} CSF 防御 Spectre 的开销在 8\% 以下。 \subsubsection{Conditional Speculation} Conditional Speculation\supercite{conditional-speculation} 是一种检测 推测式执行中的潜在的泄露数据的访存指令,并阻止其执行的方法。为了检测可 能泄露数据的访存指令,此工作提出安全相关(security dependence)的概念, 对于信道 $c$,指令 $j$ 安全依赖于指令 $i$,如果: \begin{itemize} \item 在程序序列中,指令 $j$ 在 $i$ 之前 \item $j$ 在 $i$ 之前推测式地执行,并且 $j$ 会通过信道 $c$ 泄露数据 \end{itemize} 存在安全相关的指令可能泄露数据,处理器对其做出标记。为了减少阻止存在安 全相关的指令执行造成的性能损失,可以使用两个过滤器进一步检测指令是否可 以安全执行: \begin{itemize} \item 基于缓存命中的过滤器:如果访存指令在缓存中命中,这样的指令不会修 改缓存的内容,从而不会泄露数据,这样的指令可以执行。 \item 基于可以页的过滤器:考虑 Flush+Reload 等常见的基于共享内存的高速 缓存侧信道攻击,在一个 Spectre 组件中,存在两个内存访问操作,一个访 问秘密数据,一个泄露秘密数据,泄露数据的访存操作访问了攻击者和受害者 共享的内存区域,和秘密数据位于不同的物理页。根据这个性质,在遇到一个 被标记的访存指令时,可以检测它是否和访存队列中已有的指令是否访问相同 的物理页,判断指令是否安全。 \end{itemize} 在 gem5 模拟器中用 SPEC CPU2006 进行评测,平均性能开销为 6.8\%. \subsubsection{SpectreGuard} SpectreGuard\supercite{spectreguard} 是一种软硬件结合防御 Spectre 攻击 的方法。软件在页表中标记一个页是否存在秘密数据,如果一条指令在推测式执 行中读取了带标记的页中的数据,处理器则禁止这条指令将读取的值转发至其他 指令,直到这条指令之前的所有预测都已验证,确认推测式执行正确。 在 gem5 模拟器中用 SPEC CPU2006 评测,如果标记内存的所有页,则 SpectreGuard 的平均性能开销为 20\%, 而如果标记堆区域,则性能开销减少至 8\%. 在使用 OpenSSL 的合成基准测试中,如果只标记私钥为秘密数据,则性能 可以接近原处理器的性能。 % \begin{comment} % % MI6: Secure Enclave in a Speculative Out-of-Order processor % % abs: 一个考虑了Spectre等攻击设计的enclave方案 % % % Data Oblivious ISA(OISA)是一种 ISA 扩展,用于阻止信息通过侧信道泄露。 % 设计原则: % \begin{itemize} % \item ISA的安全性和微架构无关 % \item ISA不会阻止现代微处理器的优化技术 % \end{itemize} % % OISA有以下组件: % \begin{itemize} % \item 动态跟踪敏感数据:使用DIFT跟踪程序运行时私密数据在处理器中的传 % 播。所有数据都有 confidential/public 标记,标签在读取操作数时必须 % 解析 % \item 指令定义操作数可以接受 public 还是 public/confidential 数据 % \end{itemize} % \end{comment} % % % vim:ts=4:sw=4