From 29f78286a4a82782661c6e9f8ecc1d70939cbe56 Mon Sep 17 00:00:00 2001 From: Iru Cai Date: Wed, 15 May 2019 13:34:15 +0800 Subject: upd --- chap/chap2.tex | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) (limited to 'chap/chap2.tex') 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]) -- cgit v1.2.3