summaryrefslogtreecommitdiff
path: root/chap/chap2.tex
blob: 0326ef9ee5fcb86fd91d3578f42dc52006f52e9e (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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
% Copyright (c) 2014,2016 Casper Ti. Vector
% Public domain.

\chapter{Meltdown和Spectre攻击}

本章首先介绍侧信道攻击,之后对已有的 Meltdown 和 Spectre 攻击的各种变
体进行分类讲解,最后简单地介绍已有攻击的其他使用形式。

\section{侧信道攻击}

侧信道攻击是利用计算的过程对环境产生的影响,从而获取秘密数据的技术。
1996年,Paul Kocher 发现通过对私钥的操作进行计时,可以找出
Diffie-Hellman,RSA 等密码的私钥。\supercite{TimingAttack} 这是最早的
侧信道攻击的研究。之后研究者发现了更多侧信道,如功耗
\supercite{MOP2010}、电磁辐射\supercite{EMpower}、温度
\supercite{hutter}、噪声\supercite{acoustic}等。

现代计算机系统采用多种优化手段,优化可以作用于处理的数据的值、数据的位
置、数据存放位置的访问频率等,攻击者可以通过这些优化产生的效果,推断出
计算机系统处理的秘密数据的值。基于软件的微架构侧信道攻击
\supercite{gruss}利用微架构优化造成的时间区别,这种攻击不需要物理访问
计算机系统,只需要在系统上运行代码。

高速缓存计时攻击是一种重要的侧信道攻击的方式。当高速缓存中存在一个地址
的数据时,访问这个地址的时间更短,利用这个性质,攻击者可以得知一个地址
是否曾经被访问过。缓存计时攻击的常见形式有:

\begin{itemize}
\item Evict+Time: 攻击者清除一个缓存组,然后对一个算法的运行进行计时,
  检查它的运行时间是否受到影响
\item Prime+Probe: 受害者运行一段程序后,攻击者访问缓存某一组的每一路,
  观察访问时间是否有变化
\item Flush+Reload: 攻击者利用 x86 的 clflush 等指令清除一个共享内存地
  址对应的缓存行,在受害者运行一段程序后,攻击者重新装载该行对应的地址
  的数据,通过测量访问时间推断受害者是否访问了这个共享的地址
\end{itemize}

\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} 攻击利用这个异常,利用这个方法,攻击者可以读
出一个处理器核此前运行的使用了浮点寄存器的程序中的浮点寄存器的值。

\subsection{Spectre型攻击}

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

推测式执行的常见形式是控制流的推测式执行。控制流的推测式执行依赖于转移
预测技术,包含了分支的预测、间接转移目标地址的预测和函数返回地址的预测,
对应于 Spectre 攻击中 Spectre-PHT, Spectre-BTB, Spectre-RSB. 此外,处
理器预测 load 指令和程序序列之前访问地址未知的 store 指令地址不冲突,
推测式执行这样的 load 指令,它对应 Spectre-STL.

\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 和之后的指令。在推测式执行的过程中,瞬时
指令可以泄露这个地址中的旧值。

\section{Meltdown 和 Spectre 的其他形式}

在研究 Meltdown 和 Spectre 攻击的过程中,研究者还发现了一起其他的攻击
形式,它们基于已有的 Meltdown 和 Spectre 攻击,使用不同的利用方式。

\subsection{MeltdownPrime 和 SpectrePrime}

MeltdownPrime 和 SpectrePrime \supercite{meltdownprime} 是一种使用
Prime+Probe 方式进行 Meltdown 和 Spectre 攻击的形式。通过利用缓存一致
性协议的缓存行失效机制,可以达到和 Flush+Reload 方式的同等精度。

\subsection{NetSpectre}

NetSpectre \supercite{netspectre} 是通过网络使用 Spectre 的攻击方法,
这种攻击方式将 Spectre 由本地攻击扩展到远程攻击,使得不会运行攻击者控
制的代码的设备也受到 Spectre 攻击的威胁。

在 NetSpectre 攻击中,攻击者利用两中 NetSpectre 组件,一个是泄露组件
(leak gadget),通过改变微架构状态,泄露秘密数据;一个是传送组件
(transmit gadget),它将微架构状态的改变通过网络传送给攻击者,攻击者
可以通过网络数据包的延迟,推断出微架构状态,从而获取秘密数据。

NetSpectre 可以在局域网,或者 Google cloud 等云平台中使用。利用
Evict+Reload 缓存信道,每小时可以泄露 15 比特。利用基于 AVX 的隐蔽信道,
可以每小时泄露 60 比特。

\subsection{SgxPectre}

SgxPectre \supercite{sgxpectre} 将 Spectre 攻击用于泄露 Intel SGX 环境
中的数据。通过在 SGX enclave 之外污染 BTB,可以改变 SGX enclave 中的控
制流,进行 Spectre-BTB 攻击。

% vim:ts=4:sw=4