summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIru Cai <mytbk920423@gmail.com>2019-05-07 15:00:28 +0800
committerIru Cai <mytbk920423@gmail.com>2019-05-07 17:09:45 +0800
commita507fd2cff8950735871923dd64f7a1488a13614 (patch)
treebd02e6d412ed0a6c4e809e6f9af14a35ea552cf2
parent9e4edfb6454a861b59faea601e184aad4ead23b6 (diff)
downloaddissertation-a507fd2cff8950735871923dd64f7a1488a13614.tar.xz
update
-rw-r--r--Makefile2
-rw-r--r--chap/chap4.tex71
-rw-r--r--chap/chap5.tex78
-rw-r--r--thesis.bib8
-rw-r--r--thesis.tex2
5 files changed, 154 insertions, 7 deletions
diff --git a/Makefile b/Makefile
index 7437115..1c7b234 100644
--- a/Makefile
+++ b/Makefile
@@ -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
diff --git a/thesis.bib b/thesis.bib
index 3db1a1f..7af7564 100644
--- a/thesis.bib
+++ b/thesis.bib
@@ -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},
diff --git a/thesis.tex b/thesis.tex
index 6642e19..5d58b50 100644
--- a/thesis.tex
+++ b/thesis.tex
@@ -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}
% 按学校要求设定参考文献列表的段间距。