summaryrefslogtreecommitdiff
path: root/chap/chap2.tex
diff options
context:
space:
mode:
Diffstat (limited to 'chap/chap2.tex')
-rw-r--r--chap/chap2.tex27
1 files changed, 20 insertions, 7 deletions
diff --git a/chap/chap2.tex b/chap/chap2.tex
index 69d32d0..1dcfdf2 100644
--- a/chap/chap2.tex
+++ b/chap/chap2.tex
@@ -133,6 +133,8 @@ Meltdown 打破了处理器内存隔离功能提供的所有安全保障。这
以下是一段 Meltdown 攻击的示例代码,通过它可以读取内核地址空间的数据:
+\begin{figure}
+ \centering
\begin{minted}{nasm}
xor rax, rax
retry:
@@ -141,6 +143,9 @@ shl rax, 0xc
jz retry
mov rbx, qword [rbx + rax] ; 访问探测数组
\end{minted}
+\caption{Meltdown 示例代码}
+\label{lst:meltdown}
+\end{figure}
以上 X86 指令读取了以 rcx 为地址的内核空间的数据,在用户态下,这个读取
内核空间数据的指令会产生异常,但是在处理器产生异常之前,这条指令可以将
@@ -204,8 +209,7 @@ Foreshadow 对 Intel SGX 所追求的安全模型产生了深远的影响,在
\begin{figure}[htbp]
\centering
\includegraphics[width=0.8\textwidth]{addr-trans.eps}
- \caption{CPU 的地址翻译过程和 L1 终端错误的原理:图片的下半部分为文
- 档描述的地址翻译过程,上半部分是微架构的行为。\supercite{foreshadowNG}}
+ \caption{地址翻译过程和 L1 终端错误的原理\supercite{foreshadowNG}}
\label{fig:addr-tran}
\end{figure}
@@ -292,8 +296,7 @@ Foreshadow 攻击使用在可以直接控制客户机器物理地址和一级缓
\begin{figure}[htbp]
\centering
\includegraphics[width=0.8\textwidth]{foreshadow-vmm.eps}
- \caption{Foreshadow VMM 的一种使用场景。同一物理核上的虚拟机共享一级
- 缓存,攻击者可以操作其内存访问,读取受害者虚拟机在一级缓存的内容。\supercite{foreshadowNG}}
+ \caption{Foreshadow VMM 的一种使用场景\supercite{foreshadowNG}}
\label{fig:foreshadow-vmm}
\end{figure}
@@ -363,12 +366,17 @@ switching)。核心思想是 FPU 寄存器状态仅在必要时进行上下文
攻击者获取同一处理器硬件线程中 FPU 寄存器的数据。以下简单的例子可以泄
露1比特的数据。
+\begin{figure}
+ \centering
\begin{minted}{nasm}
movq rax, xmm0
and rax, 1
shl rax, 6
mov rax, dword [mem + rax]
\end{minted}
+\caption{LazyFP 示例代码}
+\label{lst:lazyfp}
+\end{figure}
在以上代码片段中,由于进程中 FPU 寄存器被禁用,movq 指令产
生 \Fault{NM} 异常。操作系统会用对应用程序透明的方式处理该异常,恢复进
@@ -469,6 +477,7 @@ Spectre v1 是最早提出的 Spectre 攻击,属于 Spectre-PHT 类型。它
害者程序中的分支,一个例子如下:
\begin{figure}[htbp]
+\centering
\begin{minted}[frame=single,linenos=true]{C}
if (x < array1_size)
y = array2[array1[x] * 4096];
@@ -492,9 +501,7 @@ if (x < array1_size)
\begin{figure}[htbp]
\centering
\includegraphics[width=0.8\textwidth]{spectre_v1.eps}
- \caption{在得出边界检查的正确结果之前,分支预测器使程序从最可能的分
- 支目标继续运行,如果预测结果正确,则可以得到性能提升。但是,如果边
- 界检查预测错误,攻击者在一些情形可以泄露秘密数据。\supercite{spectre}}
+ \caption{边界检查结果和分支预测方向的可能情形\supercite{spectre}}
\label{fig:spectre_v1}
\end{figure}
@@ -609,10 +616,15 @@ ARM 处理器上进行验证,确认它们受 Spectre v1 的影响。
以将缓冲区中的数据转发给需要的指令。推测式缓冲区溢出利用了这个特性,例
如以下程序:
+\begin{figure}
+ \centering
+ \caption{推测式缓冲区溢出}
+ \label{lst:spec-buf-overflow}
\begin{minted}{C}
if (x < len)
a[x] = z;
\end{minted}
+\end{figure}
攻击者给出一个超过数组 \verb|a| 大小的 \verb|x| 时,在推测式执行时,会
将 \verb|a[x]| 的地址和攻击者输入的值 \verb|z| 写入至存储缓冲区。如果
@@ -769,6 +781,7 @@ NetSpectre不会跨越进程边界,而是通过将有效和无效值交替地
包的程序的一部分,其中 x 由攻击者控制,它构成了 NetSpectre 的泄露组件。
\begin{figure}[htbp]
+ \centering
\begin{minted}{C}
if (x < bitstream_length)
if (bitstream[x])