summaryrefslogtreecommitdiff
path: root/chap/chap3.tex
blob: 8fe2c08e6c0364f3c1d761e94f926df41d987f73 (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
173
174
175
176
177
178
179
180
181
182
183
184
% Copyright (c) 2014,2016,2018 Casper Ti. Vector
% Public domain.

\chapter{Meltdown和Spectre攻击的防御方案分析}\label{sec:defense}

Meltdown 和 Spectre 及其多种变体被发现后,研究者提出了多种减轻这些攻击
的防御方法,它们需要对软件或硬件进行修改。也有研究者提出通过修改现有的
指令系统\supercite{oisa},使得用这种指令系统的程序不受 Spectre 攻击的
影响。

\section{Meltdown型攻击的防御}

Meltdown型攻击利用了瞬时指令可以读取体系结构层次上不可访问的数据,并且用此数据做计算。因此一种防御方式是使体系结构层次上不可访问的数据,在微架构层次上仍然不可访问。

KAISER\supercite{kaiser}是一种已经部署在 Linux 内核上的一种防御
Meltdown 攻击的方案。它的作用是在用户空间中去除内核空间的地址映射,使
得用户空间的执行的指令无法访问内核空间的存储区域。

防御 Meltdown 型攻击的第二种方法是阻止异常的产生。例如对于 LazyFP,最
新的 Linux 内核在上下文切换时,对所有进程都会保存和恢复浮点寄存器,从
而用户程序使用浮点寄存器都不会产生异常,从而消除这种攻击。

\section{Spectre型攻击的防御}

Spectre 型攻击的防御方案可以分为三类:阻止推测式执行、防止瞬时指令访问
秘密数据、切断隐蔽信道或降低隐蔽信道的精度。研究者在软件和硬件方面都提
出了防御方案。

\subsection{软件防御方案}

为了防御Spectre v1,Intel和AMD建议在分支指令后插入lfence指令阻止推测式
执行。由于lfence性能开销大,LLVM提出推测式装载指令加固(Speculative
  Load Hardening)\supercite{spec-load-hardening} 技术,它的作用是在指
令流中添加数据相关,使得装载指令使用的地址依赖于分支结果。

retpoline\supercite{retpoline} 是 Google 提出的防御 Spectre-BTB 的方法。
它的作用是把程序中的间接转移指令修改为一个指令序列,最终使用 ret 指令
完成跳转,从而使用 RSB 而不是 BTB 来进行间接转移的转移预测。

% index masking
Webkit 在数组访问中使用 index masking\supercite{webkit} 方法,它让数组
下标和一个值进行与操作,去掉下标高位的1,将数组下标控制在一定范围内,
防止处理器在推测式执行中访问数组指定范围之外的数据。Linux 构造了一个粒
度更细的 array\_index\_nospec 宏\supercite{linux-spec},使得在推测式执
行的过程中,数组的索引始终在界内,避免了推测式的访问秘密数据。

% poison value
Webkit 还使用了指针投毒(pointer poisoning)的方式,它考虑分支用于做类
型检查的情形。对于不同类型的数据,Webkit 将这种类型的指针和一个类型对
应的值异或,要使用的时候再异或这个值得到指向数据的指针,如果类型不匹配,
则得到的指针会指向一个程序无法访问的内存区域。通过这种方法,程序在推测
式执行中无法通过这种指针访问到程序中的数据,从而避免了秘密数据的泄露。

% site isolation, FIXME: needs citing
Google 为 Chrome 浏览器使用了站点隔离(site isolation)技术,使得浏览
器用不同的进程访问不同的网站,从而攻击者无法通过用 Javascript 通过侧信
道攻击获取另一站点相关的数据。

% timer reduction
降低计时器精度可以降低计时攻击所用侧信道的精度,一个例子是在浏览器中降
低 Javascript 引擎中 performance.now 等计时器的精度。
\supercite{webkit} 但是相关研究发现,攻击者可以使用其他方式构造高精度
的计时器\supercite{js-timer},因此降低计时器精度不是一个有效的防御方法。


\subsection{硬件防御方案}

\subsubsection{SafeSpec}

SafeSpec\supercite{safespec} 提出了一种设计准则:使用临时结构保存推测式执行产
生的状态,而不影响处理器的主要微架构状态。在实现中,SafeSpec 为缓存和
TLB 添加了影子结构,推测式执行的指令对缓存和 TLB 修改临时写入至相应的
影子结构,直到此前分支正确或指令提交时,再将影子结构的数据更新至主结构。

\subsubsection{InvisiSpec}

InvisiSpec\supercite{invisispec} 和 SafeSpec 类似,使用一个称为推测式
执行缓冲区(Speculative Buffer)的结构存放推测式执行的 load 指令从存储
系统中获取的数据,直到这条指令安全的时候再让它更新缓存。和 SafeSpec 不
同的是,InvisiSpec 考虑了缓存一致性和存储一致性的问题,在 load 指令确
认安全之后,增加一个验证的步骤,确认使用没有违反存储一致性。

在 gem5 模拟器下, 使用 SPEC CPU2006 和 PARSEC 对 InvisiSpec 进行评测,
以 Spectre 为威胁模型,在 TSO 内存模型下,InvisiSpec 平均性能损失为
21\%,而使用 fence 性能下降 74\%.

\subsubsection{DAWG}

Dynamic Allocated Way Guard(DAWG)\supercite{dawg} 是一种防御缓存侧信道
攻击的缓存设计。DAWG让不同的程序使用不同的安全域,一个安全域中的程序只
能使用缓存中的某些路,和 Intel CAT 允许程序在缓存任意一路命中不同,
DAWG 不允许程序在安全域规定的路之外中发生缓存命中。

在 zsim 模拟器中使用 SPEC CPU2006, PARSEC, GAPBS 进行模拟,相对于
Intel CAT,在不同的评测程序和划分方式下,大多数程序性能下降为 4\%\~7\%.

DAWG 的主要缺点是需要操作系统的支持。此外,DAWG 不能防御 NetSpectre 等可
在同一安全域内进行的攻击。

\subsubsection{Context-Sensitive Fencing}

Context-Sensitive Fencing(CSF)\supercite{context-sensitive-fencing} 是
一种微码级防御多种类型 Spectre 攻击的方法。它基于 Context-Sensitive
Decoding (CSD)\supercite{context-sensitive-decoding},一种微码翻译机制
的扩展,用于动态按需自定义微操作指令流。CSF 利用 CSD,在微指令流中注入
fence 等微码,阻止不安全指令的推测式执行。为了降低 fence 的性能开销,
CSF 还提出了3种新的用于防御 Spectre 的 fence.

CSF 由以下几个关键部件组成:
\begin{itemize}
\item 微码自定义机制 CSD:使处理器精确地在指令流中插入 fence,减轻推测
  式执行中不期望的副作用
\item 译码级信息流追踪(DLIFT)框架:用于检测潜在不安全的执行模式,触
  发微码自定义机制
\item 错误训练防御:用于保护分支预测器、返回地址栈等部件
\end{itemize}

CSF 防御 Spectre 的开销在 8\% 以下。

\subsubsection{Conditional Speculation}

Conditional Speculation\supercite{conditional-speculation} 是一种检测
推测式执行中的潜在的泄露数据的访存指令,并阻止其执行的方法。为了检测可
能泄露数据的访存指令,此工作提出安全相关(security dependence)的概念,
对于信道 $c$,指令 $j$ 安全依赖于指令 $i$,如果:

\begin{itemize}
\item 在程序序列中,指令 $j$ 在 $i$ 之前
\item $j$ 在 $i$ 之前推测式地执行,并且 $j$ 会通过信道 $c$ 泄露数据
\end{itemize}

存在安全相关的指令可能泄露数据,处理器对其做出标记。为了减少阻止存在安
全相关的指令执行造成的性能损失,可以使用两个过滤器进一步检测指令是否可
以安全执行:

\begin{itemize}
\item 基于缓存命中的过滤器:如果访存指令在缓存中命中,这样的指令不会修
  改缓存的内容,从而不会泄露数据,这样的指令可以执行。
\item 基于可以页的过滤器:考虑 Flush+Reload 等常见的基于共享内存的高速
  缓存侧信道攻击,在一个 Spectre 组件中,存在两个内存访问操作,一个访
  问秘密数据,一个泄露秘密数据,泄露数据的访存操作访问了攻击者和受害者
  共享的内存区域,和秘密数据位于不同的物理页。根据这个性质,在遇到一个
  被标记的访存指令时,可以检测它是否和访存队列中已有的指令是否访问相同
  的物理页,判断指令是否安全。
\end{itemize}

在 gem5 模拟器中用 SPEC CPU2006 进行评测,平均性能开销为 6.8\%.

\subsubsection{SpectreGuard}

SpectreGuard\supercite{spectreguard} 是一种软硬件结合防御 Spectre 攻击
的方法。软件在页表中标记一个页是否存在秘密数据,如果一条指令在推测式执
行中读取了带标记的页中的数据,处理器则禁止这条指令将读取的值转发至其他
指令,直到这条指令之前的所有预测都已验证,确认推测式执行正确。

在 gem5 模拟器中用 SPEC CPU2006 评测,如果标记内存的所有页,则
SpectreGuard 的平均性能开销为 20\%, 而如果标记堆区域,则性能开销减少至
8\%. 在使用 OpenSSL 的合成基准测试中,如果只标记私钥为秘密数据,则性能
可以接近原处理器的性能。

% \begin{comment}
% 
%   MI6: Secure Enclave in a Speculative Out-of-Order processor
% 
%   abs: 一个考虑了Spectre等攻击设计的enclave方案
% 
% 
%   Data Oblivious ISA(OISA)是一种 ISA 扩展,用于阻止信息通过侧信道泄露。
%   设计原则:
%   \begin{itemize}
%   \item ISA的安全性和微架构无关
%   \item ISA不会阻止现代微处理器的优化技术
%   \end{itemize}
% 
%   OISA有以下组件:
%   \begin{itemize}
%   \item 动态跟踪敏感数据:使用DIFT跟踪程序运行时私密数据在处理器中的传
%     播。所有数据都有 confidential/public 标记,标签在读取操作数时必须
%     解析
%   \item 指令定义操作数可以接受 public 还是 public/confidential 数据
%   \end{itemize}
% \end{comment}
% 
% % vim:ts=4:sw=4