From 05a0d7753a2bc32d51d6e8424a7141417efcd860 Mon Sep 17 00:00:00 2001
From: Iru Cai <mytbk920423@gmail.com>
Date: Wed, 8 May 2019 11:16:34 +0800
Subject: upd

---
 chap/chap2.tex | 36 +++++++++++++++++++++++++++++++-----
 1 file changed, 31 insertions(+), 5 deletions(-)

(limited to 'chap/chap2.tex')

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}
 
-- 
cgit v1.2.3

