diff options
author | Iru Cai <mytbk920423@gmail.com> | 2019-05-07 15:00:28 +0800 |
---|---|---|
committer | Iru Cai <mytbk920423@gmail.com> | 2019-05-07 17:09:45 +0800 |
commit | a507fd2cff8950735871923dd64f7a1488a13614 (patch) | |
tree | bd02e6d412ed0a6c4e809e6f9af14a35ea552cf2 | |
parent | 9e4edfb6454a861b59faea601e184aad4ead23b6 (diff) | |
download | dissertation-a507fd2cff8950735871923dd64f7a1488a13614.tar.xz |
update
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | chap/chap4.tex | 71 | ||||
-rw-r--r-- | chap/chap5.tex | 78 | ||||
-rw-r--r-- | thesis.bib | 8 | ||||
-rw-r--r-- | thesis.tex | 2 |
5 files changed, 154 insertions, 7 deletions
@@ -5,7 +5,7 @@ # 被编译的主文件的文件名,不包括扩展名。 JOB = thesis # 这个变量的值可以为 latex、pdflatex 或 xelatex。 -LATEX = latex +LATEX = pdflatex -shell-escape BIBTEX = biber -l zh__pinyin --output-safechars DVIPDF = dvipdfmx diff --git a/chap/chap4.tex b/chap/chap4.tex index 406655a..d6df685 100644 --- a/chap/chap4.tex +++ b/chap/chap4.tex @@ -4,6 +4,11 @@ 踪的方法,检测 Spectre 组件指令流中可能泄露秘密数据的访存指令,并使用 InvisiSpec 的方法执行这些访存指令。 +%这个设计有如下特点: +%\begin{itemize} +%\item 它不需要任何软件修改 +%\item + \section{威胁模型} 本文对攻击者做如下假设:攻击者知道受害者程序的代码、进程中的地址分布信 @@ -45,11 +50,65 @@ CSF\supercite{context-sensitive-fencing} 中的译码级信息流追踪框架 DI 则这条指令为不安全的 load \end{itemize} -\section{InvisiSpec的详细设计} +以上 DIFT 实现只考虑了泄露的 load 指令和读取秘密数据的 load 指令存在数 +据相关,此外还要考虑控制相关的情形,如以下例子\supercite{msvc}: + +\begin{minted}{C} +void victim(size_t x, uint8_t k) { + if (x < array1_size) { + if (array1[x] == k) + temp &= array2[0]; + } +} +\end{minted} + +这个例子读取的 \verb|array1[x]| 和攻击者猜测的值 \verb|k| 进行比较,如 +果两个值相等,则会访问 \verb|array2[0]|,即访问 \verb|array2[0]| 的指 +令和访问 \verb|array1[x]| 的指令存在控制相关,对 \verb|array2[0]| 的访 +问可能泄露 \verb|array1[x]| 的数据。因此,如果一条控制指令依赖于被标记 +的寄存器,则对它进行标记,其后的所有 load 指令都认为不安全。 + +\section{可抵抗 Spectre 攻击的微架构的实现} + +以下介绍这种可抵抗 Spectre 攻击的微架构在 gem5 模拟器中的实现。首先分 +析 gem5 中乱序执行处理器的实现,然后分别介绍 InvisiSpec 和本文使用的 +DIFT 方案在 gem5 中的实现。 + +\subsection{gem5 的乱序执行处理器} + +gem5 的乱序执行处理器实现在 FullO3CPU 类中,它又用类实现类处理器的以下 +流水级:取指(Fetch)、译码(Decode)、重命名(Rename)、发射/执行/回 +写(IEW)、提交(Commit)。 + +gem5 的取指和译码阶段由 DefaultFetch 和 DefaultDecode 两个类实现。在 +DefaultFetch 中,取指部件从指令缓存中取出处理器 PC 位置的指令,并用指 +令系统对应的译码器进行译码,再取出指令对应的微指令,将微指令传至译码阶 +段,译码阶段再将其传到重命名阶段。取指阶段取出的指令在 DynInst 类的实 +例中保存。 + +gem5 的重命名阶段由 DefaultRename 类实现,它对指令的源寄存器和目的寄存 +器进行重命名。重命名后,指令的 DynInst 实例中的源寄存器和目的寄存器均 +保存它们对应的物理寄存器,同时还保存目的寄存器原来对应的物理寄存器用于 +恢复。 + +gem5 的发射、执行和回写三个阶段由一个类 DefaultIEW 实现,它模拟了处理 +器将指令发射至功能单元和处理器执行指令的过程。gem5 中用一个专门的语言 +定义了每个指令系统的指令的语义,为每个指令和微指令生成一个 StaticInst +类,里面定义了指令的执行方式。对于存储访问类指令,gem5 用 LSQ 类定义处 +理器中的装载和存储指令队列,这些指令在执行时添加至队列中,进行存储访问 +操作。 + +gem5 的提交阶段由 DefaultCommit 类实现,它提交 ROB 队列头部的指令,更 +新 ROB 的状态。 + +\subsection{InvisiSpec 的实现} + +% 本文使用 InvisiSpec 执行检测为不安全的 load 指令。相对于阻止该 load 指 +% 令的执行,使用 InvisiSpec 执行该指令,可以使依赖于这个指令的指令可以继 +% 续执行,减少性能损失。以下分析 InvisiSpec 的详细设计,在下一节中分析将 +% xSpectre 检测技术和 InvisiSpec 结合的方法。 -本文使用 InvisiSpec 执行检测为不安全的 load 指令。相对于阻止该 load 指 -令的执行,使用 InvisiSpec 执行该指令,可以使依赖于这个指令的指令可以继 -续执行,减少性能损失。以下分析 InvisiSpec 的详细设计,在下一节中分析将 -Spectre 检测技术和 InvisiSpec 结合的方法。 +% InvisiSpec 使用推测式执行缓冲区保存推测式执行中 load 指令得到的数据, +% 这部分代码在。 -\section{可抵抗Spectre攻击的微架构的实现} +\subsection{动态信息流追踪的实现} diff --git a/chap/chap5.tex b/chap/chap5.tex index d35dc81..ff1dc0c 100644 --- a/chap/chap5.tex +++ b/chap/chap5.tex @@ -41,6 +41,84 @@ L2 Cache & 2MB, 16路组相联, 8周期延迟\tabularnewline \subsection{微架构安全性测试} +本文构造一个测试程序对每种配置的处理器进行安全性的测试,用于验证实现的 +方案可以防御 Spectre 攻击。 + +由于 gem5 的 Ruby 存储模型不支持 clflush 指令,因此测试程序使用 +Evict+Reload 的方式进行攻击。由于配置的系统末级缓存为 2MB,可以对一个 +2MB 的存储区域进行访问,以清除缓存内原有内容。 + +具体代码如下: + +\begin{minted}{C} +#include <stdio.h> +#include <stdint.h> +#include <string.h> +#include <x86intrin.h> + +/* default: 64B line size, L1-D 64KB assoc 2, L1-I 32KB assoc 2, L2 2MB assoc 8 */ +#define LLC_SIZE (2 << 20) + +uint8_t dummy[LLC_SIZE]; +size_t array_size = 4; +uint8_t array1[200] = {1, 2, 3, 4}; +uint8_t array2[256 * 64 * 2]; +uint8_t X; +uint8_t array3[4096]; +uint8_t tmp; + +uint8_t victim(size_t idx) +{ + if (idx < array_size) { + return array2[array1[idx] * 64]; + } + return 0; +} + +int main() +{ + unsigned long t[256]; + volatile uint8_t x; + + victim(0); + victim(0); + victim(0); + victim(0); + victim(0); + + memset(dummy, 1, sizeof(dummy)); // flush L2 + X = 123; // set the secret value, and also bring it to cache + + _mm_mfence(); + + size_t attack_idx = &X - array1; + victim(attack_idx); + + for (int i = 0; i < 256; i++) { + unsigned int junk; + unsigned long time1 = __rdtscp(&junk); + x ^= array2[i * 64]; + unsigned long time2 = __rdtscp(&junk); + t[i] = time2 - time1; + } + + printf("attack_idx = %ld\n", attack_idx); + for (int i = 0; i < 256; i++) { + printf("%d: %d, %s\n", i, t[i], (t[i] < 40)? "hit": "miss"); + } +} +\end{minted} + +在以上代码中,攻击者要通过受害者执行的函数 victim 的推测式执行泄露 +victim 在正常执行中无法访问的 X 的值。攻击者先训练 victim 的分支预测器, +清除缓存中原有的内容,之后我们设置 X 为 123,然后攻击者再让 victim 执 +行访问 X,最后扫描 array2 检查其中是否有元素在缓存中命中。 + +在 Baseline 配置中,执行上述程序,可以看到 \verb|array2[123 * 64]| 在 +缓存中命中,在 array2 的其他位置缓存缺失,从而攻击者可以通过 Spectre +攻击得到 X 的值 123. 而在其他配置中,array2 的所有位置都发生缓存缺失, +从而攻击者无法得出 X 的值,说明这些配置都能防御 Spectre 攻击。 + \subsection{SPEC CPU2006的性能评测} 本文对 21 个 SPEC CPU2006 基准测试进行评测,基准测试的数据集使用 ref @@ -34,6 +34,14 @@ year = {2019}, } +@online{msvc, + author = {Paul Kocher}, + title = {Spectre Mitigations in Microsoft's C/C++ Compiler}, + year = {2018}, + month = Feb, + url = {https://www.paulkocher.com/doc/MicrosoftCompilerSpectreMitigation.html}, +} + @misc{meltdownprime, title={MeltdownPrime and SpectrePrime: Automatically-Synthesized Attacks Exploiting Invalidation-Based Coherence Protocols}, author={Caroline Trippel and Daniel Lustig and Margaret Martonosi}, @@ -24,6 +24,8 @@ % 若须在排序中实现更复杂的需求,请参考 biblatex-caspervector 的文档。 \usepackage[backend = biber, style = caspervector, utf8]{biblatex} +\usepackage{minted} + % 对于 linespread 值的计算过程有兴趣的同学可以参考 pkuthss.cls。 \renewcommand*{\bibfont}{\zihao{5}\linespread{1.27}\selectfont} % 按学校要求设定参考文献列表的段间距。 |