1.关于芯片侧信道
2018年新年伊始,Spectre、Meltdown(著名的的“幽灵”“熔断”)横空出世,这犹如打开了芯片侧信道的潘多拉魔盒,自此以后,关于芯片的各种变种,亦或者新型侧信道漏洞如雨后春笋般涌现。个人不完全整理了历史上一些主要的芯片侧信道缺陷(注:请参考附件),总共有32个缺陷,其呈现出如下特征:
33个中有25个利用的是现代CPU中常见的预测执行(注:预测执行,乱序执行界限已经模糊化,统一称为预测执行)技术,占比76%。
可以这样说,自从幽灵、熔断之后,基于预测执行的侧信道攻击成为了各路研究者的研究热点。
2.啥是预测执行?
推测执行(亦作预测执行、投机性执行,英语:Speculativeexecution)是优化技术的一类,采用这个技术的计算机系统会根据现有信息,利用空转时间提前执行一些将来可能用得上,也可能用不上的指令。如果指令执行完成后发现用不上,系统会抛弃计算结果,并回退执行期间造成的副作用(如缓存)。
1)顺序执行第8行,获取用户的值bad;
2)执行第10行,判断bad值是否满足条件;
1)多次正确执行该段代码一定次数n;
2)当n+1次时,执行完第8行,取得bad的值后,尚未执行第10行判断逻辑时,CPU便会将11行的代码arr1->data[bad]的值取出,装载到Cache中(因为已经经过了n次正确的取值,CPU想当然地以为第n+1次仍然是正确的,因此提前将bad处的偏移值取出备用。此时的bad值可以是任意的,可以偏移至任何位置,这也是攻击者利用预测执行想达到的目的);
注:该代码逻辑是Spectre V1的可利用逻辑,其他的变种代码利用逻辑可能不同,但是原理是相同的:如变种4可利用的代码逻辑更加普遍。详细可以参考附件汇总表格。
另外需要注意的是,虽然CPU提前执行了许多的代码逻辑,但是这些都是CPU微架构层级的变化,相关数据也是存储在cache中,事后会及时擦除,因此用户是完全无感知的。
在上述“预测执行”逻辑的第2、3步骤中间,存在一个攻击窗口:就是当预测执行的结果存在cache中,同时尚未执行到第11行时,数据尚未擦除,是存在于Cache中的,此时攻击者就可以利用侧信道的方式去读取这些数据,从而引起信息泄露。
我们分别在第3节和第4节回答这两个问题。首先是第一个问题。
3.CPU 的缓存机制
在第2节中我们提到,CPU预测执行存储的数据是保存在CPU Cache中的,Cache中的数据,用户或者攻击者是无法直接读取的(CPU有地址校验功能,会触发异常),因此攻击者只能是通过一种“绕弯弯”的方法间接的推测出Cache中存储的数据。而这个“绕弯弯”的方法就是所谓的“侧信道”(会在第4节详细介绍)。
CPU的Cache又是个什么东东?接下来我们以Spectre V1所用利用的L1D缓存来说明。
MDS推测一些特殊的寄存器等。详细可以参考附录表格。
上图为一个双核CPU的示意图。图中core1和core2分别是该CPU的两个核,Cache(缓存)处于CPU和主要内存(RAM)之间,每一个核都有各自的缓存,同时该2个核也共享缓存。各级缓存的相关信息可以参考下表。
Cache类型 |
共享对象 |
Cache大小 |
L1 |
同一个core共享 |
64K per core |
L2 |
同一个core共享 |
256K per core |
L3(也称LLC) |
同一个物理核(本例core1+core2)共享 |
最大8M |
-
L1层缓存,分为I-Cache和D-Cache。前者用于缓存指令,后者用于缓存数据。Spectre V1利用的是后者,即L1 D-Cache; -
L1和L2层,都是同一个core共享,这意味着该核上的所有应用、所有VM Guest等都共享该区域,这也为后续的信息泄露提供了通道;
-
L3层,也称为LLC(即最终层),通常是一个物理核所有核心都共享的缓存区域。
缓存的共享特性使得攻击者利用侧信道方式推测他人数据成为了可能。
一个进程想要获取另外一个进程的数据,由于系统设置、隔离等原因,是无法实现的。也可以这样广义的理解,一个core上有2个虚拟设备:Guest1和Guest2,由于VM和OS的保护,位于Guest1的攻击者无法直接获取Guest2的数据。但是由于Guest1和Guest2共享一段缓存,这就成为了二者的联系纽带,也成为了攻击者的攻击路径。
而攻击者也无权直接读取Cache中的数据,只能采取“侧信道”的方式。
4.侧信道
侧信道攻击,英文名字为Side-Channel attack,又称为旁道攻击、边信道攻击等。通常指的是采用非直接的方式进行攻击获取敏感信息的攻击方式。以下列举了一些常见的侧信道攻击方式:
-
缓存攻击:通过获取对缓存的访问权而获取缓存内的一些敏感信息;
-
计时攻击:通过设备运算的用时来推断出所使用的运算操作,或者通过对比运算的时间推定数据位于哪个存储设备,或者利用通信的时间差进行数据窃取;
-
基于功耗监控的旁路攻击:同一设备不同的硬件电路单元的运作功耗也是不一样的,因此一个程序运行时的功耗会随着程序使用哪一种硬件电路单元而变动,据此推断出数据输出位于哪一个硬件单元,进而窃取数据;
-
声学密码分析:通过捕捉设备在运算时泄漏的声学信号捉取信息(与功率分析类似);
-
电磁攻击:设备运算时会泄漏电磁辐射,经过得当分析的话可解析出这些泄漏的电磁辐射中包含的信息(比如文本、声音、图像等)。
CPU领域的缓存侧信道属于上述的第一种。而缓存侧信道最常见的攻击方式有主要有3种:Flush + Reload、Prime + Probe和Evict + Time,下面分别介绍。
Flush + Reload
该种方式需要3个步骤:
尝试访问目标数据地址,并测量时间,若时间很快(小于某个阈值),则可认为目标数据被受害者使用并保存在Cache中,成为Cache Hit;若时间很慢(大于某个阈值),则可认为受害者未使用这个地址,称为Cache Miss。
Prime + Probe
该种方式同样需要3个步骤:
重新访问攻击者之前填充的数据,若访问时间较长,则表示该地址被受害者使用了(攻击者在缓存中的数据被刷没了);若访问时间较短,表明受害者未使用(攻击者数据仍在缓存中),据此可以得到受害者的使用地址。
Evict + Time
该种方法与Prime+Probe类似。同样需要3个步骤:
再次运行受害者程序,并计算执行时间,与之前对比,若时间变长,表明受害者程序使用了与攻击者相同的地址。
了解完这3种缓存侧信道之后,细心的你可能会发现一个共同点,它们最后一个步骤都是采用计时(Timing) 的方式来推测受害者是否使用了该地址。而这也是缓存提高运算速度的根本原因:提前将数据缓存,提高运行速度。但是这个缓存的时间窗口也为攻击者提供了攻击契机。
那么预测执行和侧信道结合起来是啥样的?
5.预测执行+侧信道
下面以Spectre及其变种结合Flush+Reload看下整个过程。
为了增加攻击的成功率,攻击者一般有个所谓的训练的过程,就是让CPU预测执行到要攻击的代码行位置(这是预测执行的特点,会智能的根据以往执行记录,着重执行特定的代码行)。
其他类型的“预测执行”+缓存侧信道组合,原理大同小异。
其他侧信道
至此,本文讲的都是攻击者如何获取预测执行技术在Cache中短暂存储得敏感数据。是“预测执行”+“侧信道”的组合。实际上,不是只有“预测执行”技术可被侧信道利用,还有一些别的方式也是可以利用的。在第一节中,近年的案例中有有24%是没有用到“预测执行”的。比如:
-
TLBleed利用的是SMT/HT技术下,TLB共享的特性来推测数据;
-
PortSmash利用的是SMT/HT技术中的执行引擎共享来推测数据;
-
NetCAT利用的是Intel中独有的DDIO功能的缓存机制;
-
TPM-FAIL利用的是加密签名算法中的时序差别来推测数据;
-
VoltJockey利用的是电压异常引发的故障注入来推测数据。
当然还有一些比较特别的“侧信道”,比如针对Nvidia GPU的侧信道攻击,是通过监控用户的web活动, 检测键盘敲击日志,内存嗅探等来获取用户的敏感信息。
6.危害
“预测执行”+“侧信道”的组合对芯片带来的冲击是非常巨大的,为攻击者的攻击又指明了一个方向。
-
对于物理机单用户来说,其实这类缺陷影响不大,因为此类缺陷的利用一般都是需要恶意程序本地执行,而通过其他技术获取用户的机密数据相比利用预测执行技术显得更加的容易,没必要如此大费周章,投入产出比显得很低;
-
对于云服务提供商来说,影响就大的多。其提供的服务是直接面向租户的,攻击者可能就是其中一个租户,其可以完全操作自己的Guest,然后通过该类型攻击获取Host的数据,或者同一物理上其他租户的数据。
7.缓解技术
(4)Google提出的Retpoline技术,使用返回操作进行来回反弹的结构,形象地表现出在需要保护的内容中,相关的预测执行是通过“无休止地”反弹而避免被窥探到。
上述这些缓解技术中,一般都伴有较大的性能开销,因此在部署时需要综合考虑安全与性能的关系。
检测技术
云服务提供商可以在后台部署检测工具被动检测侧信道攻击。检测工具的一般思路是检测Host Cache的访问事件,若发现异常场景,如短时间内频繁读取,可以告警,然后人工排查处理。由此可以实现无差别侧信道检测。
8.结语
本文针对近年来频发的芯片侧信道类缺陷进行简单分析,并发表个人看法,以期给相关同学以参考。文中若有任何错误,请不吝指正。
原文始发于微信公众号(华为安全应急响应中心):漫话芯片侧信道
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论