漫话芯片侧信道

admin 2023年4月4日20:21:50评论59 views字数 5223阅读17分24秒阅读模式

1.关于芯片侧信道

2018年新年伊始,SpectreMeltdown(著名的的幽灵”“熔断)横空出世,这犹如打开了芯片侧信道的潘多拉魔盒,自此以后,关于芯片的各种变种,亦或者新型侧信道漏洞如雨后春笋般涌现。个人不完全整理了历史上一些主要的芯片侧信道缺陷(注:请参考附件),总共有32个缺陷,其呈现出如下特征:

漫话芯片侧信道

33个中有25个利用的是现代CPU中常见的预测执行(注:预测执行,乱序执行界限已经模糊化,统一称为预测执行)技术,占比76%

可以这样说,自从幽灵、熔断之后,基于预测执行的侧信道攻击成为了各路研究者的研究热点。

漫话芯片侧信道

涉及的芯片厂商如图所示,本文基于IntelARM的侧信道案例,力求浅显易懂的描述其攻击原理,并总结当前对于该类型攻击的常见技术缓解原理。

2.啥是预测执行?

在上文中,我们提到,近年来76%的芯片侧信道都是基于预测执行技术的。那么啥是预测执行呢?我们先看下维基是如何通俗描述的:

推测执行亦作预测执行、投机性执行,英语:Speculativeexecution是优化技术的一类,采用这个技术的计算机系统会根据现有信息,利用空转时间提前执行一些将来可能用得上,也可能用不上的指令。如果指令执行完成后发现用不上,系统会抛弃计算结果,并回退执行期间造成的副作用如缓存)。

推测执行的目标是在处理器系统资源过剩的情况下并行处理其他任务。推测执行无处不在。流水处理器的分支预测、数值预测、预读取内存和文件、以及数据库系统的乐观并发控制等机能中都采用到了推测执行。注:链接:https://zh.wikipedia.org/wiki/%E6%8E%A8%E6%B5%8B%E6%89%A7%E8%A1%8C
由此,我们可以看到,这是一种速度优化技术,当代CPU大多使用了预测执行技术用于提升其性能。我们接下来通过一段代码来了解下CPU中是如何实现预测执行的。

漫话芯片侧信道

上述代码,按照正常的顺序逻辑是这样的:

1)顺序执行第8行,获取用户的值bad

2)执行第10行,判断bad值是否满足条件;

3)若满足,则执行第11行,取出数组的值。
而按照预测执行的逻辑是这样的(注:以spectre V1为例):

1)多次正确执行该段代码一定次数n

2)n+1次时,执行完第8行,取得bad的值后,尚未执行第10行判断逻辑时,CPU便会将11行的代码arr1->data[bad]的值取出,装载到Cache中(因为已经经过了n次正确的取值,CPU想当然地以为第n+1次仍然是正确的,因此提前将bad处的偏移值取出备用。此时的bad值可以是任意的,可以偏移至任何位置,这也是攻击者利用预测执行想达到的目的);

3)执行至11行,执行条件判断,若bad不符合条件,则CPU会回滚,擦除Cahce中的数据。
上述这个预测执行逻辑实际是一个经过训练后的逻辑,训练的目的是希望预测执行尽量按照攻击者的想法去执行,以方便后续的攻击。在实际的未经过训练的预测执行逻辑中,这种提前执行的语句是随机的,无序的。

注:该代码逻辑是Spectre V1的可利用逻辑,其他的变种代码利用逻辑可能不同,但是原理是相同的:如变种4可利用的代码逻辑更加普遍。详细可以参考附件汇总表格

另外需要注意的是,虽然CPU提前执行了许多的代码逻辑,但是这些都是CPU微架构层级的变化,相关数据也是存储在cache中,事后会及时擦除,因此用户是完全无感知的。

在上述预测执行逻辑的第23步骤中间,存在一个攻击窗口:就是当预测执行的结果存在cache中,同时尚未执行到第11行时,数据尚未擦除,是存在于Cache中的,此时攻击者就可以利用侧信道的方式去读取这些数据,从而引起信息泄露。

那么问题来了,
第一:为啥不能直接读取呢,而要采用一种所谓侧信道的方法?
第二:而侧信道又是个啥子来?

我们分别在第3节和第4节回答这个问题。首先是第一个问题。

3.CPU 的缓存机制

在第2节中我们提到,CPU预测执行存储的数据是保存在CPU Cache中的,Cache中的数据,用户或者攻击者是无法直接读取的CPU有地址校验功能,会触发异常,因此攻击者只能是通过一种绕弯弯的方法间接的推测出Cache中存储的数据。而这个绕弯弯的方法就是所谓的侧信道会在第4节详细介绍

CPUCache又是个什么东东?接下来我们以Spectre V1所用利用的L1D缓存来说明。

注:Spectre V1利用侧信道推测的是CPU L1D缓存中的数据,其他变种利用的数据存储介质可能不同,如Lazy FP State Restore推测的是进程寄存器中的数据;BranchScope推测的是BPUPHTPattern History Table);

MDS推测一些特殊的寄存器等。详细可以参考附录表格。

漫话芯片侧信道

上图为一个双核CPU的示意图。图中core1core2分别是该CPU的两个核,Cache缓存处于CPU和主要内存RAM)之间,每一个核都有各自的缓存,同时该2个核也共享缓存。各级缓存的相关信息可以参考下表。

Cache类型

共享对象

Cache大小

L1

同一个core共享

64K per core

L2

同一个core共享

256K per core

L3(也称LLC)

同一个物理核(本例core1+core2)共享

最大8M

注:上表中的Cache大小是以Intel Sandy Bridge架构为例说明。
上表中:
  • L1层缓存,分为I-CacheD-Cache。前者用于缓存指令,后者用于缓存数据。Spectre V1利用的是后者L1 D-Cache
  • L1L2层,都是同一个core共享,这意味着该核上的所有应用、所有VM Guest等都共享该区域,这也为后续的信息泄露提供了通道;

  • L3层,也称为LLC即最终层,通常是一个物理核所有核心都共享的缓存区域。

    缓存的共享特性使得攻击者利用侧信道方式推测他人数据成为了可能。

漫话芯片侧信道

一个进程想要获取另外一个进程的数据,由于系统设置、隔离等原因,是无法实现的。也可以这样广义的理解,一个core上有2个虚拟设备:Guest1Guest2,由于VMOS的保护,位于Guest1的攻击者无法直接获取Guest2的数据。但是由于Guest1Guest2共享一段缓存,这就成为了二者的联系纽带,也成为了攻击者的攻击路径。

而攻击者也无权直接读取Cache中的数据,只能采取侧信道的方式。

4.侧信道

侧信道攻击,英文名字为Side-Channel attack,又称为旁道攻击、边信道攻击等。通常指的是采用非直接的方式进行攻击获取敏感信息的攻击方式。以下列举了一些常见的侧信道攻击方式:

  • 缓存攻击:通过获取对缓存的访问权而获取缓存内的一些敏感信息;

  • 计时攻击:通过设备运算的用时来推断出所使用的运算操作,或者通过对比运算的时间推定数据位于哪个存储设备,或者利用通信的时间差进行数据窃取;

  • 基于功耗监控的旁路攻击:同一设备不同的硬件电路单元的运作功耗也是不一样的,因此一个程序运行时的功耗会随着程序使用哪一种硬件电路单元而变动,据此推断出数据输出位于哪一个硬件单元,进而窃取数据;

  • 声学密码分析:通过捕捉设备在运算时泄漏的声学信号捉取信息(与功率分析类似);

  • 电磁攻击:设备运算时会泄漏电磁辐射,经过得当分析的话可解析出这些泄漏的电磁辐射中包含的信息比如文本、声音、图像等)。

CPU领域的缓存侧信道属于上述的第一种而缓存侧信道最常见的攻击方式有主要有3种:Flush + Reload、Prime + Probe和Evict + Time,下面分别介绍。

Flush + Reload

漫话芯片侧信道

该种方式需要3个步骤: 

步骤1:FLUSH
将共享Cache清空( FLUSH ); 
步骤2WAITING
将共享Cache清空( FLUSH );
步骤2:WAITING
等待受害者(目标)程序执行;
步骤3:RELOAD

尝试访问目标数据地址,并测量时间,若时间很快(小于某个阈值),则可认为目标数据被受害者使用并保存在Cache中,成为Cache Hit;若时间很慢(大于某个阈值),则可认为受害者未使用这个地址,称为Cache Miss。

Prime + Probe

漫话芯片侧信道

该种方式同样需要3个步骤:

步骤1:Prime
将共享Cache填充攻击者自己的数据;
步骤2WAITING
等待受害者(目标)程序执行;
步骤3Probe

重新访问攻击者之前填充的数据,若访问时间较长,则表示该地址被受害者使用了攻击者在缓存中的数据被刷没了;若访问时间较短,表明受害者未使用攻击者数据仍在缓存中),据此可以得到受害者的使用地址。

Evict + Time

该种方法与Prime+Probe类似。同样需要3个步骤:

步骤1:受害者在Cache中执行程序,并计算执行时间;
步骤2:Evict
攻击者确定一行为比较感兴趣的行,并将数据逐出;
步骤3:Time

再次运行受害者程序,并计算执行时间,与之前对比,若时间变长,表明受害者程序使用了与攻击者相同的地址。

了解完这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.缓解技术

自从幽灵、熔断爆发以来,IntelARM一直致力于预测执行类侧信道攻击的缓解,综合观察25个相关变种,可以将相关技术分成以下几类:
(1)识别易被利用的代码模式,结合微码和OS层级的补丁,当执行到这些代码处时,动态的关闭预测执行技术。如Spectre V1,变种4Spectre1.1
(2)识别易被利用的代码模式,结合微码和OS层级的补丁,当执行到这些代码处时,清除或者刷新缓存/寄存器数据攻击者即使攻击,获取的也是些垃圾数据。如Spectre V2SpectreRSBMDS等。
(3)使用KPTI技术,维护2组页表,内核模式与之前相同;用户模式下使用的第2组页表包含用户空间的副本和最小的内核空间,用于处理系统调用和中断集。如Meltdown等。

漫话芯片侧信道

(4)Google提出的Retpoline技术,使用返回操作进行来回反弹的结构,形象地表现出在需要保护的内容中,相关的预测执行是通过无休止地反弹而避免被窥探到。

上述这些缓解技术中,一般都伴有较大的性能开销,因此在部署时需要综合考虑安全与性能的关系。

检测技术

云服务提供商可以在后台部署检测工具被动检测侧信道攻击。检测工具的一般思路是检测Host Cache的访问事件,若发现异常场景,如短时间内频繁读取,可以告警,然后人工排查处理。由此可以实现无差别侧信道检测。

8.结语

本文针对近年来频发的芯片侧信道类缺陷进行简单分析,并发表个人看法,以期给相关同学以参考。文中若有任何错误,请不吝指正。


原文始发于微信公众号(华为安全应急响应中心):漫话芯片侧信道

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年4月4日20:21:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   漫话芯片侧信道https://cn-sec.com/archives/1653354.html

发表评论

匿名网友 填写信息