CPU缓存侧信道攻击

2018年年初,多个独立的安全研究团队披露了现代CPU架构的若干严重漏洞,在业界造成了极大地影响,至今仍余波未了。在这些漏洞的利用方式中,针对CPU缓存的侧信道攻击技术是主要方式。什么是针对CPU缓存的侧信道攻击?黑客会如何利用侧信道攻击技术?

密码是一种用来混淆的技术,它将正常的(可识别的)信息转变为无法识别的信息。现阶段用户的隐私信息大多是依靠加密技术实现,如登录网站、电子邮箱、银行取款等等。用户信息的安全性依靠于加密算法的安全性。然而理论上的安全并不等同于物理实现上的安全。

关于侧信道攻击

侧信道攻击是利用密码算法执行过程中泄漏的与内部运算紧密相关的多种物理状态信息如声光信息、功耗、电磁辐射以及运行时间等,再结合统计学手段等进行攻击。近年来,侧信道技术已经逐渐地从设备外部深入到计算机内部的CPU、高速缓存(Cache)、分支预测单元等等得到其中蕴含的敏感信息(如密钥)。Cache攻击是一种新型的侧信道分析技术,它可以跨平台、跨CPU、突破安全边界对目标设备进行攻击,对现有安全防护造成极大的威胁。另外,由于Cache侧信道攻击可以利用cache共享实施攻击,因此具有不易发现且极难防御的特点。

Cache是什么?

Cache的学名是中央处理单元高速缓冲存储器,由静态存储芯片(SRAM)组成,容量比较小但速度比主存高得多, 接近于CPU的速度。主要由三大部分组成:

➡Cache存储体:存放由主存调入的指令与数据块。

➡地址转换部件:建立目录表以实现主存地址到缓存地址的转换。

➡替换部件:在缓存已满时按一定策略进行数据块替换,并修改地址转换部件。

Cache的作用

冯.诺依曼体系结构是现代计算机的基础,现在大多计算机仍是冯.诺依曼计算机的组织结构。一个典型的冯诺依曼系统如图1所示,包含下面几大件:计算机由控制器、运算器、存储器、输入设备、输出设备五部分组成。然而由于计算机技术发展,主存储器速度比CPU处理速度慢得多,使得CPU的高速处理能力不能充分发挥,整个计算机系统的工作效率受到影响。为了缓和中央处理器和主存储器之间速度不匹配的矛盾,计算机系统加入了Cache模块,现代计算机CPU与内存和Cache基本关系如图2所示 。CPU在Cache中找到有用的数据被称为命中,当Cache中没有CPU所需的数据时(这时称为未命中),CPU才访问内存。

https://i-blog.csdnimg.cn/blog_migrate/ef224d0611b3cd549e9f1f3e4fe80f60.png

图1 冯诺依曼体系结构

https://i-blog.csdnimg.cn/blog_migrate/6568e370f3f120c81950313aecdbc082.png图2 最简单的高速缓存配置图

Cache结构

一般处理器的cache分三层,其架构如下图3所示,L1 Cache一般分为Data Cache(数据缓存)和Instruction Cache(指令缓存),为每个核单独占有。L2 Cache一般是每个核心单独占有,或者两个核心共享。L3 Cache一般在多核CPU中是所有核心CPU共用。访问时间关系为T­(内存)>T­­(L3)>T(L2)>T(L1)。

https://i-blog.csdnimg.cn/blog_migrate/10e5ee93a4a762d97e036cfdddbf1b49.png

​图3 Intel cache架构

如下为Intel Sandy Bridge架构处理器实图,可以看到多核共享的L3 Cache:

Cache侧信道攻击原理

多核之间cache数据共享,而cache命中和失效对应响应时间有差别,攻击者可以通过访问时间的差异,推测cache中的信息,从而获得隐私数据。根据采集信息不同,cache侧信道攻击可分为时序驱动攻击、访问驱动攻击以及踪迹驱动攻击。时序驱动攻击需要获得目标攻击系统详细配置参数,重建对照环境,利用统计分析方法,对照采集到的密码算法一次加密/解密的整体时间,推测密钥。踪迹驱动攻击需采集密码算法执行过程中所有cache访问命中和失效序列,再结合明文或密文推测密钥,一般通过功耗检测手段进行,但该手段需要特殊的信息采集设备而且需要物理接触密码设备,实现起来比较复杂。访问驱动攻击通过采集加密或解密过程中访问的cache组集合,再利用数学分析方法推测密钥,可以远程实现,攻击实现可行性较强。目前,Cache侧信道攻击包含四种方法,分别为Flush-Reload方法、Flush-Flush方法、Prime-Probe方法和Evict-Time方法。下面将对每类方法原理进行说明,并引用IAIK项目flush_flush [1]中的代码来解释关键行为点。

1 Flush-Reload

Flush-Reload(FR)方法是prime-probe方法的变种,基于共享内存实现,是一种跨内核、跨虚拟机的Cache 探测方法。在Flush 阶段,攻击者将监控的内存块从cache中驱逐出去,然后在Trigger阶段等待目标用户访问共享内存。在Reload阶段,攻击者重新加载监控的共享内存块。如果在等待的期间,目标虚拟机访问过的内存块不需要重新加载,时间将会较短,因为这些数据已经被缓存在cache中。根据加载时间长短,可判定目标虚拟机访问过的数据。Flush-Reload具体步骤如下:

步骤1. Flush:将共享内存中特定位置映射的cache数据驱逐

步骤2. Trigger:等待目标虚拟机响应服务请求,更新Cache

步骤3. Reload:重新加载Flush阶段驱逐的内存块,测量并记录cache组的重载时间

示例代码说明:

下面这段代码实现了Flush+Reload攻击。通过rdtsc_begin和rdtsc_end来标记访问目标内存的开始和结束时间,从而计算出访问时长。然后再判断该时长是否小于一个Cache命中的临界值,最终便可知道该内存是否被目标程序访问过:

 

2 Flush-Flush

与Flush-Reload不同的是,Flush-Flush攻击是基于clflush指令执行时间的长短来实施攻击的。如果数据没在Cache中则clflush指令执行时间会比较短,反之若有数据在cache中则执行时间会比较长。与其它Cache攻击不同,Flush Flush侧信道攻击技术在整个攻击过程中是不需要对内存进行存取的,因此该攻击技术更加隐蔽。然而根据我们的经验,由于有无数据情况下Cache被flush的时间差别其实并非特别明显,因此在攻击过程中数据判断的精度并不高。

Flush-Flush具体步骤如下:

步骤1:通过flush清空Cache原始数据

步骤2:等待目标进程运行,更新Cache,并刷新共享缓存行,测量刷新时间

步骤3:根据测量时间判断原始数据是否被缓存

该方法攻击原理如图所示:

示例代码说明:

下面这段代码实现了Flush-Flush攻击。代码主要通过rdtsc()来标记flush(addr)运行前后的时间点,计算出清理目标Cache数据所需的时间。如果flush(对应clflush指令)执行的时间较长,则表示数据被缓存,如果时间较短则表示数据未被缓存。

3 Prime-Probe

Prime-Probe方法具体步骤如下:

步骤1. Prime: 攻击者用预先准备的数据填充特定多个cache 组

步骤2. Trigger: 等待目标虚拟机响应服务请求,将cache数据更新

步骤3. Probe: 重新读取Prime 阶段填充的数据,测量并记录各个cache 组读取时间

该方法攻击原理如图所示:

示例代码说明:

4 Evict-Time

Evict-Time具体步骤如下

步骤2:等待目标程序运行,并记录其运行时间(运行过程有可能使用到第一步所说的Cache数据)

步骤3:使用Evict方法覆盖Cache上的数据

步骤4:然后再运行一次该函数,并第二次记录执行时间,如果时间不一致且执行时间变长则说明程序运行时读取了第一步所说的Cache数据(Cache未命中)

与其他三种侧信道攻击技术相比,Evict-Time不是当前主流的侧信道攻击技术。

应用场景最广泛的是Prime-Probe,而Flush-Rload和Flush-Flush要用到SSE2指令clflush,因此受到一定限制,在JavaScript和非Intel CPU中无法使用。但同时,Prime-Probe也有缺点,在攻击速度、攻击稳定性方面,则不如Flush-Reload和Flush-Flush。

在支持clflush指令的环境中,Flush-Flush和Flush-Reload都可以使用,主要的区别是Flush-Flush无需访问内存,使用的CPU指令更少,速度也更快,也更不容易被检测。但flush-flush精度上要求更高,因为clflush指令的执行时间一般在100多个时钟周期,相较于数据未被缓存,数据被缓存时,clflush执行时间只会增加10多个时钟周期,因此Flush Flush更容易受到其它程序噪音的影响。

 

Cache侧信道的攻击发展

1998 年,Kesley 等人首次提出Cache 命中率可用于密钥分析的思想,颠覆了传统密钥分析方法,引起了研究人员的广泛关注。之后,研究人员以数据缓存、指令缓存作为研究对象,提出了多种可行的Cache 侧信道攻击方法,对算法安全性带来了严重威胁。但大部分研究成果都是基于单机非虚拟化环境。直到2009年,Ristenpart等人首次提出在云环境中存在跨虚拟机cache侧信道攻击的安全威胁,并利用Prime-Probe 方法在Amazon EC2 云平台中探测得到同驻虚拟机的Cache 负载状态信息以及用户击键间隔时间信息等。2014年,Yarom提出第一个跨内核的cache侧信道攻击Flush-reload。其利用Intel X86处理器系统共享内存的漏洞,通过监测内存得到CPU处理的cache line。此种攻击主要利用L3层cache实现攻击,同时并不需要共享执行core。2015年,Liu和Irazoqu使Prime-Probe攻击可以应用于跨内核的cache侧信道攻击。2016年,Irazaqui提出第一个可以跨CPU的AMD平台的cache攻击。攻击环境逐渐从单核转为跨核,从微处理器转到云环境。

 

攻击实例

在2015CCS大会上,Yossef Oren等人利用不安全的网站链接,探测得到用户的鼠标和网页活动信息,甚至可以利用受害者的正在访问的网页信息。此种攻击可移植性强,不用安装恶意软件,可行性较高,攻击原理如图6所示。

图6 利用Java的cache侧信道攻击原理

在Europe 2016 Blackhat上,Moritz Lipp等人演示了如何从cache中得到信息确定用户正在输入的字符,演示情况如图7所示,用户输入字符,攻击者可以很快获得相应的信息。

图7 Moritz Lipp演示在智能手机上的cache 侧信道攻击

在USA 2016 Blackhat上,Taylor Hornby等人演示了如何从cache的侧信道信息中得到其他用户正在浏览的网页,演示现场图如图8所示。

图8 Taylor Hornby演示如何获取受害者正在浏览的网页

此外,伴随着云服务越来越贴近生活,云用户持续增多。云环境中同驻虚拟机cache资源共享也成为cache侧信道攻击的目标,近几年针对云上安全的研究也逐渐增多。在CHES 2016,Inci,M.等人成功实现了在亚马逊云上得到用户RSA私钥,现场如图9所示。

图9 Inci,M等人在CHES上讲解攻击原理

在2016 USENIX, Moritz Lipp等人上演示了如何在拥有trustzone安全环境的安卓手机上实施cache攻击,得到精准的用户信息,部分成果如图10 所示。

图10 利用cache模版侧信道攻击得到用户输入信息

在arXiv 2017 ,Schwarz,M等人在Malware Guard Extension: Using SGX to Conceal Cache Attacks一文中,利用SGX来隐藏cache攻击(Intel声称的SGX可以消除侧信道攻击,并且推荐使用SGX保护加密计算),得到用户的私钥。一条迹的数据可以恢复96%的私钥,11条迹可以恢复全部的私钥,其攻击原理如图11所示。

图11 在SGX可信执行环境下的cache侧信道攻击原理

 

总结

Cache侧信道攻击方法严重威胁加密算法的安全性,而且随着云服务技术的大规模应用,虚拟化技术的普及,使得Cache侧信道远程攻击更为隐蔽从而也更具攻击力。Cache攻击逐渐渗透到我们的日常应用中,智能手机的可信环境在此种攻击方法下也存在严重安全隐患。安全问题日益突出,用户的隐私需要更加完善的安全措施来保护。希望更多地研究学者加入我们的队伍中,为隐私保驾护航。

 

 

  • 12
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

网络空间发展与战略研究中心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值