% 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
Linux 在使用了数组边界检查的条件代码块中使用 array\_index\_nospec 宏
\supercite{linux-spec}，使得在推测式执行的过程中，数组的索引始终在界内，
避免了推测式的访问秘密数据。

% poison value

% site isolation
Google 为 Chrome 浏览器使用了站点隔离（site isolation）技术，使得浏览
器用不同的进程访问不同的网站，从而攻击者无法通过用 Javascript 通过侧信
道攻击获取另一站点相关的数据。

% timer reduction
降低计时器精度可以降低计时攻击所用侧信道的精度，具体方式包括降低
Javascript 引擎的计时器的精度。


\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
