summaryrefslogtreecommitdiff
path: root/chap/chap2.tex
blob: 7470ae6ed06db501d8bb3bb58d56deb173542ec6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
% Copyright (c) 2014,2016 Casper Ti. Vector
% Public domain.

\chapter{Meltdown和Spectre攻击}

\section{侧信道攻击}

\section{Meltdown和Spectre攻击}

Meltdown\supercite{meltdown} 和 Spectre\supercite{spectre} 是最早发现
的两个利用瞬时指令的攻击。此后发现了更多的 Meltdown 和 Spectre 的变体。
为了找出更多的攻击类型和分析它们的防御方案,Claudio Canella 等人对这些
攻击及其防御做了系统性的研究\supercite{systematic},将所有瞬时执行攻击
分为 Meltdown型攻击和 Spectre 型攻击两类。

\subsection{Meltdown型攻击}

Meltdown型攻击利用的是处理器异常产生的瞬时指令,这些指令使用了体系结构
层次上不可访问的数据,从而绕过硬件的安全策略,泄露体系结构层次上不可访
问的数据。

\subsubsection{Meltdown}

操作系统将内核地址空间映射至每个用户进程的地址空间中。处理器执行访存指
令时,在将虚拟地址翻译为物理地址的时候,检查地址对应的权限位,判断用户
是否可访问该地址。Meltdown攻击中,攻击者让处理器从用户不可访问的内核地
址装载数据至寄存器,由于所有内核地址都可以翻译为合法的物理地址,处理器
可以读取内核地址空间的数据,在产生异常前,攻击者构造的瞬时指令序列可以
将读取到的数据通过隐蔽信道发送给攻击者。

\subsubsection{Foreshadow}

Foreshadow\supercite{foreshadow} 是一种可以读取 Intel SGX enclave 中秘
密数据的Meltdown 型攻击。如果对 SGX 使用 Meltdown 攻击,攻击者读取未授
权的 enclave 内存,不会产生异常,而是读出 abort page 值 -1. 但是 abort
page 只在页权限检查通过后发生,攻击者可以将该页 present 位清除,即将该
页设为不存在,此时处理器便会产生异常,但由于一级缓存使用虚拟地址索引,
因此仍然可以从一级缓存读取该虚拟地址中的数据,从而瞬时指令可以泄露 SGX
enclave 中的数据。

通过将一个页设为不存在,绕过地址翻译,从一级缓存读取数据的攻击方式,
Intel 将其称为L1终端错误(L1 Terminal Fault)\supercite{l1tf}。
Foreshadow-NG\supercite{foreshadowNG} 利用这种攻击方法,可以绕过操作系
统和虚拟机的隔离。

\subsubsection{LazyFP}

由于浮点寄存器和内存交换数据进行操作有一定开销,大部分应用程序不做浮点
运算,因此部分操作系统在进行上下文切换时不保存浮点寄存器。操作系统在恢
复用户态程序的运行之前,对处理器设置禁用浮点寄存器,程序使用了浮点指令
后,触发异常,操作系统才对浮点寄存器进行保存和恢复。
LazyFP\supercite{lazyfp} 攻击利用这个异常,利用这个方法,攻击者可以读
出一个处理器核此前运行的使用了浮点寄存器的程序中的浮点寄存器的值。
\parencite{lazyfp}

\subsection{Spectre型攻击}

Spectre 型攻击利用处理器对控制流或数据流的预测,并进行推测式执行产生的
瞬时指令。Spectre 型攻击中,瞬时指令访问的是程序在体系结构层面能访问的
数据,可以绕过软件定义的安全策略,如边界检查等。

\subsubsection{Spectre-PHT}

Spectre-PHT 利用分支预测器,攻击者可以训练转移预测器,使得转移预测器执
行一个分支,该分支的指令序列可以泄露受害者地址空间或寄存器的信息。

Spectre v1 是 Spectre-PHT 类型的 Spectre 攻击。

推测式缓冲区溢出(Speculative Buffer Overflow)
\supercite{spec-buffer-overflow} 是 Spectre-PHT 的另一种形式。

\subsubsection{Spectre-BTB}

Spectre-BTB 利用间接转移,包含的攻击为 Spectre v2. 攻击者寻找受害者地
址空间中的一个组件(gadget),它可以通过隐蔽信道泄露受害者地址空间中的
数据。攻击者训练处理器的 BTB 使得受害者的间接转移指令的预测的目标地址
为该组件的地址,从而受害者推测式执行这个组件的指令。训练 BTB 的过程可
以在攻击者的地址空间中进行。

\subsubsection{Spectre-RSB}

返回栈(RSB)用于预测程序函数调用的返回地址。如果 RSB 中的返回地址和实
际返回地址不同,则会产生错误的推测式执行,
SpectreRSB\supercite{spectre-returns}\supercite{ret2spec} 利用了这种错
误的推测式执行进行攻击。

Spectre-RSB 的利用方式包括使 RSB 溢出,及污染 RSB. RSB 的大小为普通程
序函数调用深度,调用深度超过 RSB 的大小时,会造成RSB 溢出,覆盖其中最
老的条目,在函数返回时,会发生 RSB 下溢出。而有的处理器在 RSB 为空时,
使用 BTB 进行转移预测,攻击者可以用 Spectre-BTB 的攻击方式进行攻击。污
染 RSB 的方法包括在处理器的不同上下文中使用 RSB,推测式污染 RSB 等。

\subsubsection{Spectre-STL}

Spectre v4 利用的是 load 指令的推测式执行。处理器执行 load 指令时,如
果此前有地址未知的 store 指令,会认为这个 load 指令和这些地址未知的
store 指令地址不同,并推测式执行这个 load 指令,将其地址中的值装入目的
寄存器。如果在计算出 store 的地址后,发现和已执行 load 访问了相同数据,
则处理器需要重新执行这个 load 和之后的指令。在推测式执行的过程中,瞬时
指令可以泄露这个地址中的旧值。

% vim:ts=4:sw=4