summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIru Cai <mytbk920423@gmail.com>2019-05-08 11:16:34 +0800
committerIru Cai <mytbk920423@gmail.com>2019-05-08 11:16:34 +0800
commit05a0d7753a2bc32d51d6e8424a7141417efcd860 (patch)
tree1863bf4875860e399383993d9023638063014cbd
parenta507fd2cff8950735871923dd64f7a1488a13614 (diff)
downloaddissertation-05a0d7753a2bc32d51d6e8424a7141417efcd860.tar.xz
upd
-rw-r--r--chap/chap2.tex36
-rw-r--r--chap/chap3.tex21
-rw-r--r--thesis.bib15
3 files changed, 61 insertions, 11 deletions
diff --git a/chap/chap2.tex b/chap/chap2.tex
index d2bcecf..df129b4 100644
--- a/chap/chap2.tex
+++ b/chap/chap2.tex
@@ -99,13 +99,39 @@ Spectre 型攻击利用处理器对控制流或数据流的预测,并进行推
Spectre-PHT 利用分支预测器,攻击者可以训练转移预测器,使得转移预测器执
行一个分支,该分支的指令序列可以泄露受害者地址空间或寄存器的信息。
-Spectre v1 是 Spectre-PHT 类型的 Spectre 攻击。
+Spectre v1 是最早提出的 Spectre 攻击,属于 Spectre-PHT 类型。它利用受
+害者程序中的分支,一个例子如下:
+
+\begin{minted}{C}
+if (x < array1_size)
+ y = array2[array1[x] * 4096];
+\end{minted}
+
+这段程序的 if 条件语句用于判断用户给定的下标 \verb|x| 是否在 array1 界
+内,如果在界外,则无法读取 \verb|array1[x]|. 但是在推测式执行中,瞬时
+指令可以执行读取 \verb|array1[x]| 的操作,并且继续利用读取的值用于访问
+\verb|array2|,导致一个依赖于 \verb|array1[x]| 的地址出现在缓存中。
推测式缓冲区溢出(Speculative Buffer Overflow)
-\supercite{spec-buffer-overflow} 是 Spectre-PHT 的另一种形式。它可以在
-瞬时执行指令流中绕过边界检查,造成缓冲区溢出,从而攻击者可以用类似于缓
-冲区溢出的方式,使程序在推测式执行的过程中,执行攻击者指定的指令流,泄
-露秘密数据。
+\supercite{spec-buffer-overflow} 是 Spectre-PHT 的另一种形式。处理器存
+在一个存储缓冲区(store buffer),往存储系统写入的数据在指令提交前将写
+入数据的地址和值存放在这个缓冲区中,后续的指令要使用这个地址的值时,可
+以将缓冲区中的数据转发给需要的指令。推测式缓冲区溢出利用了这个特性,例
+如以下程序:
+
+\begin{minted}{C}
+if (x < len)
+ a[x] = z;
+\end{minted}
+
+攻击者给出一个超过数组 \verb|a| 大小的 \verb|x| 时,在推测式执行时,会
+将 \verb|a[x]| 的地址和攻击者输入的值 \verb|z| 写入至存储缓冲区。如果
+\verb|a[x]| 的地址是一个函数在栈中存放的返回地址,这段程序之后有返回指
+令,返回指令就会从存储缓冲区读取这个函数的返回地址,并从这个地址开始执
+行指令,从而攻击者可以使程序在推测式执行时执行以 \verb|z| 为地址开始的
+指令流。通过构造输入 \verb|x| 和 \verb|z|,攻击者可以使处理器在推测式
+执行中执行攻击者指定的代码,这些代码可能会将程序中的秘密数据泄露在微架
+构状态中。
\subsubsection{Spectre-BTB}
diff --git a/chap/chap3.tex b/chap/chap3.tex
index 742d095..8fe2c08 100644
--- a/chap/chap3.tex
+++ b/chap/chap3.tex
@@ -38,20 +38,29 @@ retpoline\supercite{retpoline} 是 Google 提出的防御 Spectre-BTB 的方法
完成跳转,从而使用 RSB 而不是 BTB 来进行间接转移的转移预测。
% index masking
-Linux 在使用了数组边界检查的条件代码块中使用 array\_index\_nospec 宏
-\supercite{linux-spec},使得在推测式执行的过程中,数组的索引始终在界内,
-避免了推测式的访问秘密数据。
+Webkit 在数组访问中使用 index masking\supercite{webkit} 方法,它让数组
+下标和一个值进行与操作,去掉下标高位的1,将数组下标控制在一定范围内,
+防止处理器在推测式执行中访问数组指定范围之外的数据。Linux 构造了一个粒
+度更细的 array\_index\_nospec 宏\supercite{linux-spec},使得在推测式执
+行的过程中,数组的索引始终在界内,避免了推测式的访问秘密数据。
% poison value
+Webkit 还使用了指针投毒(pointer poisoning)的方式,它考虑分支用于做类
+型检查的情形。对于不同类型的数据,Webkit 将这种类型的指针和一个类型对
+应的值异或,要使用的时候再异或这个值得到指向数据的指针,如果类型不匹配,
+则得到的指针会指向一个程序无法访问的内存区域。通过这种方法,程序在推测
+式执行中无法通过这种指针访问到程序中的数据,从而避免了秘密数据的泄露。
-% site isolation
+% site isolation, FIXME: needs citing
Google 为 Chrome 浏览器使用了站点隔离(site isolation)技术,使得浏览
器用不同的进程访问不同的网站,从而攻击者无法通过用 Javascript 通过侧信
道攻击获取另一站点相关的数据。
% timer reduction
-降低计时器精度可以降低计时攻击所用侧信道的精度,具体方式包括降低
-Javascript 引擎的计时器的精度。
+降低计时器精度可以降低计时攻击所用侧信道的精度,一个例子是在浏览器中降
+低 Javascript 引擎中 performance.now 等计时器的精度。
+\supercite{webkit} 但是相关研究发现,攻击者可以使用其他方式构造高精度
+的计时器\supercite{js-timer},因此降低计时器精度不是一个有效的防御方法。
\subsection{硬件防御方案}
diff --git a/thesis.bib b/thesis.bib
index 7af7564..3f763de 100644
--- a/thesis.bib
+++ b/thesis.bib
@@ -175,6 +175,21 @@
year = {2018},
}
+@online{webkit,
+ title = {What Spectre and Meltdown Mean For WebKit},
+ url = {https://webkit.org/blog/8048/what-spectre-and-meltdown-mean-for-webkit/},
+ author = {Filip Pizlo},
+ year = {2018},
+ month = Jan
+}
+
+@inproceedings{js-timer,
+ title={Fantastic Timers and Where to Find Them: High-Resolution Microarchitectural Attacks in JavaScript},
+ author={Michael Schwarz and Cl{\'e}mentine Maurice and Daniel Gruss and Stefan Mangard},
+ booktitle={Financial Cryptography},
+ year={2017}
+}
+
@online{spec-load-hardening,
title={Speculative Load Hardening},
author={Chandler Carruth},