summaryrefslogtreecommitdiff
path: root/chap/chap3.tex
blob: b0cd193f0b06b0cd715d92d9e0c3178dd588fb8c (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
% Copyright (c) 2014,2016,2018 Casper Ti. Vector
% Public domain.

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

Meltdown 和 Spectre 及其多种变体被发现后,研究者提出了多种减轻这些攻击
的防御方法,它们需要对软件或硬件进行修改。也有研究者提出通过修改现有的
指令系统,使得用这种指令系统的程序不受 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
Linux 在使用了数组边界检查的条件代码块中使用 array\_index\_nospec 宏
\supercite{linux-spec},使得在推测式执行的过程中,数组的索引始终在界内,
避免了推测式的访问秘密数据。

% poison value

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

% timer reduction
降低计时器精度可以降低计时攻击所用侧信道的精度,具体方式包括降低
Javascript 引擎的计时器的精度。


\subsection{硬件防御方案}

\subsubsection{SafeSpec}

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

\subsubsection{InvisiSpec}

\supercite{invisispec}

\subsubsection{DAWG}

\supercite{dawg}

\subsubsection{Context-Sensitive Fencing}

\supercite{context-sensitive-fencing}

\subsubsection{Conditional Speculation}

\supercite{conditional-speculation}

% vim:ts=4:sw=4