\chapter{可抵抗Spectre攻击的微架构的设计与实现}\label{sec:mywork}

本章讲解本文提出的一种防御 Spectre 攻击的方法，该方法使用动态信息流追
踪的方法，检测 Spectre 组件指令流中可能泄露秘密数据的访存指令，并使用
InvisiSpec 的方法执行这些访存指令。

\section{威胁模型}

本文对攻击者做如下假设：攻击者知道受害者程序的代码、进程中的地址分布信
息，攻击者和受害者可以在同一进程，共享同一处理器核，或在不同处理器核上。

本文设计的方法用于防御利用控制流推测式执行的 Spectre-PHT, Spectre-BTB,
Spectre-RSB 攻击，此方法可以扩展至 Spectre-STL 攻击。攻击者在 Spectre
攻击中使用高速缓存作为隐蔽信道，其他信道不在本文的考虑范围。本文不考虑
其他的侧信道攻击。本文针对攻击者通过 Spectre 攻击获取内存中秘密数据的
情形，不考虑攻击者通过攻击获取寄存器中秘密数据的情形。

\section{基于动态信息流追踪的Spectre检测方法}

动态信息流追踪（Dynamic Information Flow Tracking）\supercite{dift}是
一种硬件安全策略，通过识别可疑的信息流，并限制可疑信息的使用，保护程序
的安全。它最早用于防止攻击者利用缓冲区溢出攻击执行恶意代码，也可以用于
检测跨站脚本攻击、SQL注入等攻击。\supercite{raksha}

DIFT 可以作为 Spectre 攻击的检测手段之一。Spectre 的论文中指出处理器可
以追踪数据是否在推测式执行中获取，进而阻止在后续可能泄露这个数据的操作
中使用，作为阻止数据进入隐蔽信道的方法。\supercite{spectre}
CSF\supercite{context-sensitive-fencing} 中的译码级信息流追踪框架 DIFT，
用于追踪处理器使用的数据是否来源于用户输入，从而处理器可以根据此信息判
断是否需要插入 fence 微码。OISA\supercite{oisa} 在指令系统的定义中即包
含了 DIFT 技术，用于追踪一个数据是否为秘密数据。

本文使用 DIFT 检测 Spectre 组件中泄露数据的 load 指令。详细设计如下：

\begin{itemize}
\item 为每个物理寄存器添加一位标记，表示这个寄存器的数据是否来自于推测
  式执行中从内存读取的数据
\item 如果在推测式执行中，一条指令从内存中读取了数据，则设置这条指令的
  目的寄存器的标志为1
\item 对于非访存指令，如果存在标记为1的源寄存器，则设置这条指令的目的
  寄存器标志为1，否则设置标志为0
\item 当一条指令之前所有分支指令执行完成，确认推测式执行正确后，设置这
  条指令的目的寄存器标志为0
\item 在推测式执行的过程中执行 load 指令时，如果存在标记为1的源寄存器，
  则这条指令为不安全的 load
\end{itemize}

\section{InvisiSpec的详细设计}

本文使用 InvisiSpec 执行检测为不安全的 load 指令。相对于阻止该 load 指
令的执行，使用 InvisiSpec 执行该指令，可以使依赖于这个指令的指令可以继
续执行，减少性能损失。以下分析 InvisiSpec 的详细设计，在下一节中分析将
Spectre 检测技术和 InvisiSpec 结合的方法。

\section{可抵抗Spectre攻击的微架构的实现}
