APP下载

CPU漏洞熔断、幽灵原理、风险与应对措施

2018-08-27张经宇

移动信息 2018年6期
关键词:幽灵内核字节

张经宇



CPU漏洞熔断、幽灵原理、风险与应对措施

张经宇1,2

1.中国移动通信集团有限公司,北京 100033 2.天津大学微电子学院,天津 300072

分析了Intel、AMD和ARM等CPU芯片存在熔断、幽灵系列等安全漏洞的技术背景、漏洞原理、风险及影响,提出了应对措施和修复方法。

CPU;安全漏洞;熔断;幽灵

1 技术背景

旁路攻击是一种从电子系统物理实现过程中获得信息的攻击方式。电子设备在计算过程中除了输出正常结果外,通常会有其他可观察的特征。其中运行时间、功率消耗、电磁泄漏甚至声音都可以作为信息源,用来进一步进行系统破解。对于个人电脑、手机等,由于可执行未知来源的程序,它的旁路攻击手段可以不需要外部测量设备,主要针对缓存时间、分支预测历史、分支目标缓冲器等,还有装载错误攻击来改变物理内存和CPU的值。

现代CPU的线程之间共享缓存,意味着内核数据和不同程序的数据混合放在一起,只有在计算结果提交时才会检查权限。这就会为不同线程间窃取数据留下隐患,常见的高速缓存隐蔽通道窃取数据方式有Flush+Reload和Evict+Reload[1]。

为了提高CPU执行效率,乱序执行被引入。在传统的顺序执行架构中,指令严格按照顺序执行。由于存储读取速度低于CPU执行速度,因此经常会出现CPU停下来等待数据读取的情况,从而降低整体运行速度。如从内存中提取数据需要超过100个时钟周期,而处理一条指令一般仅需4~5个时钟周期,就会出现CPU等待的现象。乱序执行可以交替执行不同的流水线,从而节省等待时间,保证整体运行速度。预测执行是CPU根据现有信息,利用空闲时间提前执行一些将来可能会使用的指令,如果将来使用,就能大幅提高执行速度。如果将来未用,计算结果便会废弃,并回退到未执行前的状态[2]。分支预测是CPU尝试提前猜测分支(如if-then-else结构)结果来提前执行,可以通过多种算法提高预测准确率。

在微指令被重排序缓冲器(Reorder Buffer)排序后就会转发到统一保留站。没有统一保留站之前CPU每次执行需要从寄存器中读取数据,而现在可以从保留站中提前读取操作数并保存操作结果,这样乱序执行的后续指令可以在第一时间获得需要的数值。

为了实现进程之间的隔离,目前进程均被操作系统分配使用虚拟地址空间,而虚拟地址通过转化表转化到物理地址,转化表中定义了映射和权限[3]。操作系统内核也同样使用虚拟地址空间,但所需的读写权限较高,所以用户进程无法直接访问内核数据,只有CPU在特权模式下可以访问内核地址空间。在将虚拟地址转换为物理地址的同时,CPU会检查虚拟地址的权限位,确认其访问权限。这种安全隔离方式被认为是安全的。所以现在的操作系统都会将整个内核映射到每个用户进程的虚拟地址空间。

2 漏洞原理

2018年1月3日,国外安全研究机构Google Project Zero公布了两组CPU漏洞,即Meltdown(熔断),对应漏洞CVE-2017-5754(乱序执行缓存污染)[1]和Spectre(幽灵),对应漏洞CVE-2017-5753(边界检查绕过)、CVE-2017-5715(分支目标注入)[2]。

熔断攻击是利用乱序执行漏洞和高速缓存旁路通道攻击结合,绕过正常权限检查,让未授权进程读取到其他正在运行进程地址空间的任何数据。幽灵攻击是利用推测执行和微体系结构隐蔽通道的数据泄漏结合,穿透内存隔离边界获取机密信息。这两种攻击窃取数据后传输方式均通过高速缓存Flush+Reload、Evict+Reload,但两种攻击的窃取方式不同[3]。

2.1 熔断攻击

熔断利用了乱序执行,使用了非法内存访问和引发异常之间的时间窗口执行指令。攻击包括三个步骤:攻击者选择的内存地址(但无法访问到)被加载到寄存器里;瞬态指令根据寄存器内容将探测阵列内容加载至高速缓存中;攻击者使用Flush+Reload来确定被访问的探测阵列行数,从而确定所选内存地址的内容,如图1所示。

图1 熔断的核心代码

图1中,rcx内存储的是要访问的核心内存地址,rbx是一个256*4  096(28*212)的探测阵列,2的8次方源于1  byte=8  bit,4  096源于一个内存块是4  kB,从而避免CPU预读取附近内存内容,混淆被读取地址的真实内容。

当执行第四条指令时,CPU对其做权限检查,并发现用户级权限无法访问核心地址从而触发异常。但由于乱序执行的缘故,第五、六、七条指令已经在第四条指令从内存读取数据期间执行了。第五条指令是指将读取的数据乘以4  096,而第七条指令是指根据读取的数据内容,将探测阵列该行数的内容加载到寄存器里(期间也会加载到高速缓存里)。由于使用了前文所述的统一保留站,在CPU读取数据的第一时间(还没有进行权限确认时),数据就已经被后续指令读取。虽然在权限确认后这些指令带来的所有操作状态改变已全部恢复,管线清空,但由于高速缓存没有被清空,其中的部分探测阵列还在,就为下一步的Flush+Reload提供了便利。

Flush+Reload的原理为:逐行读取探测阵列(256行,4  096列)并对读取用时计时。由于攻击代码之前已经读取过一行内容,可以发现相比其他行,该行的内容读取用时特别短。该行的行数,就是想要的内容字节。这样的过程重复多次,即可将全部需要的内容逐个字节地读取出来。

假设需要读取的内容是“123456789”,需要通过熔断攻击方式探测出来。第一个字节内容是“1”,根据ASCII码表对应49,那么核心攻击代码的第七条指令就会把探测矩阵的第49行内容读取到高速缓存中,在后期Flush+Reload过程中,第49行也会读取得特别快,从而识别到该字节内容是“1”,然后将要访问的内存地址加一后读取下一个字节,从而逐个字节读取出该内容。

2.2 幽灵攻击

幽灵5753攻击分为三步:首先攻击者训练CPU的分支预测器,确保分支预测在下一次循环时顺利执行;然后把分支条件清出高速缓存,诱使CPU推测并错误执行恶意代码,从而泄露机密信息;最后通过隐蔽通道将机密信息传输出来。最后一步是与熔断相同的Flush+Reload过程,不再复述[2]。

当具有分支预测的CPU遇到类似IF语句的分支条件语句时,由于判断条件可能并不在CPU的寄存器或高速缓存中,因此为了避免等待,CPU会根据以往判断的结果预测本次的结果。

在现在Intel、AMD的CPU中,分支预测机制为全局分支预测,包含两个层次:内部是饱和计数器。只有连续选择“真”两次,才可以将预测方向从原有强“假”改变至“真”,反之亦然。外部是全局预测历史寄存器,包含了分支结果历史、不同分支之间的关联关系(当分支0、1是真时,分支2是假)等。这意味着训练分支预测器需要比2次更多的次数,才可以确保分支预测选择“真”,保证攻击程序持续读取机密信息。在幽灵的原理验证代码中,训练次数为5次。

图2 幽灵的核心代码

在幽灵的核心代码(见图2)中,array1是某一长度较短的数组,array1_size是array1的长度,array2是探测数组,数组长度256*512,用途和熔断基本相同。幽灵为了读取机密,需要将array1[x]指向机密字节的地址,即x=机密字节地址-array1的开始地址。但这超出了array1的边界,在正常的代码执行会触发异常,机密读取不到,所以需要绕过边界检查。核心代码就是为了这个目的编写,绕过边界检查需要:

(2)array1_size和array2不在CPU的高速缓存中,而秘密字节内容被缓存。

高速缓存的要求可以通过大量读取不相干的内存数据来冲洗,或者在X86中使用CLFLUSH指令,清除包含指定信息的缓存线。

核心代码执行时,CPU会先将x与array1_size进行对比,由于array1_size不在高速缓存中,需要从内存中提取,用时较长。CPU会根据训练结果假定该判断条件为真,读取秘密字节内容并计算array1[x]*256,将array2[array1[x]*256]的内容读取到高速缓存中。此时array1_size被读取到,发现判断预测错误,CPU就将CPU状态回置,寄存器相应内容清空,但是高速缓存中仍然保留了array2[array1[x]*256]的内容,再通过第三步的Flush-Reload即可读出机密字节。

3 漏洞风险及影响

经过各方的测试,熔断、幽灵攻击影响到1995年以后Intel生产的CPU、除Cortex-M型号之外的ARM及部分AMDCPU芯片。使用上述处理器的各类操作系统和云计算平台均受影响,广泛涉及目前大部分的PC、手机、平板电脑等。其中公有云平台由于存在多个租户共用一台宿主机的情况,虚机到虚机、虚机到主机是漏洞攻击的薄弱点,需要尽快完成升级补丁。

由于熔断、幽灵漏洞的攻击目的均为窃取机密数据,所以未对任何系统的正常运行造成较大影响(实施攻击时会导致短时CPU利用率飙高,但并没有长期影响)。

4 修复方法

主要通过内核页表隔离(KPTI)来防护熔断漏洞,KPTI可以不再映射内核内存至用户进程空间,从而杜绝了窃取内核数据的可能性。目前可以通过操作系统内核补丁程序修复。

幽灵变体1(CVE-2017-5753):主要通过静态分析来防护,一旦系统发现有攻击代码时会暂停CPU分支预测功能,从而防止窃取数据。目前也可以通过操作系统内核补丁程序修复,由于漏洞可以通过网页浏览器的JavaScript执行,系统内核补丁会加强浏览器防护。

幽灵变体2(CVE-2017-5715):由于该漏洞允许虚拟机非法读取宿主机数据,修补最为复杂。Google提供了用Retpoline分支代替间接分支的软件防护方法,但需要将全部涉及代码重新编码编译,工作量巨大故不常被使用。而Intel在新的微码中提供了间接分支限制预测(IBRS)、单线程间接分支预测器(STIBP)、间接分支预测器屏障(IBPB)三个硬件防护方式。可以通过强制刷新分支预测缓存、禁用单CPU中多个同级线程互相影响分支预测的情况。这些硬件防护手段虽然带来约20%性能损失,但由于简单易行,被各大厂商广泛使用[4]。

对于云环境中需要升级物理CPU的微码、安装虚拟机操作系统、虚拟化层的操作系统的安全补丁,物理机里也需要升级CPU微码及安装操作系统补丁。目前Intel、AMD已经向主流PC厂家提供了微码修补程序,用户通过下载升级最新的BIOS就可以完成升级微码工作。即使硬件厂家暂时没有推出的BIOS升级包,根据微软的官方说明,通过将虚拟机与宿主机操作系统使用的CPU物理核之间进行强行隔离以及虚拟机之间的物理核独占分配,也可以对5715漏洞做到有效防护[5]。

目前的熔断、幽灵的安全补丁都不同程度地造成系统性能下降及其他稳定性问题。根据Intel的官方说明,在旧CPU上的变体2相关BIOS升级可能导致意外重启及系统稳定性问题,建议在充分测试确认影响可接受后再全面升级[6]。

5 结束语

近几年来,虽然各种安全漏洞层出不穷,但像熔断、幽灵漏洞这样从根本上挑战现有芯片结构和运行方式的还是非常罕见的。因此,需要从根本上改变芯片及软件的设计思想,在进一步挖掘芯片制式、结构、算法潜力的同时,安全问题不容忽视。同时,由于目前的安全补丁均导致性能下降,短期内对云平台及用户不可避免地会造成影响。安全与性能之间的平衡与取舍,值得每个IT、通信从业者思考。

[1] Moritz Lipp,Michael Schwarz,Daniel Gruss,Thomas Prescher,Werner Haas,Stefan Mangard,Paul Kocher,Daniel Genkin,Yuval Yarom,Mike Hamburg. Meltdown[J]. Unpublished,2018.

[2] Paul Kocher,Daniel Genkin,Daniel Gruss,Werner Haas,Mike Hamburg,Moritz Lipp,Stefan Mangard,Thomas Prescher,Michael Schwarz,Yuval Yarom. Spectre Attacks:Exploiting Speculative Execution[J]. Unpublished,2018.

[3]Jann Horn. Project Zero. Reading privileged memory with a side-channel[J/OL]. https://googleprojectzero. blogspot.com/2018/01/reading-privileged-memory-with-side. html.

[4]Leslie Culbertson.Addressing New Research for Side-Channel Analysis[J/OL].https://newsroom.intel. com/editorials/addressing-new-research-for-side-channel-analysis/.

[5] Justin Hall. Alternative protection for Windows Server 2016 Hyper-V Hosts against the speculative execution side-channel vulnerabilities[J/OL].https://docs.microsoft. com/en-us/virtualization/hyper-v-on-windows/cve-2017-5715-and-hyper-v-hosts.

[6] Microsoft. Windows Server guidance to protect against speculative execution side-channel vulnerabilities[J/OL]. https://support.microsoft.com/en- us/help/4072698/windows-server-guidance-to-protect-against-the-speculative-execution.

The Principle Risks and Mitigation of CPU Vulnerabilities Meltdown and Spectre

Zhang Jingyu1、2

1.China Mobile Communication Group Co., Ltd., Beijing 100033 2.School of Microelectronics,Tianjin University, Tianjin 300072

The technical background, principle of vulnerabilities, risks and the impact of the security vulnerability Meltdown and Spectre, which could attack Intel, AMD and ARM CPU, is analyzed. The countermeasures and mitigation options are proposed.

CPU; security vulnerability; Meltdown; Spectre

TP309

A

张经宇(1988—),山西忻州人,工程师,在读博士,主要从事信息与通信工程领域的研究与维护维修工作。

猜你喜欢

幽灵内核字节
多内核操作系统综述①
No.8 字节跳动将推出独立出口电商APP
强化『高新』内核 打造农业『硅谷』
活化非遗文化 承启设计内核
快把我哥带走
微软发布新Edge浏览器预览版下载换装Chrome内核
No.10 “字节跳动手机”要来了?
人类进入“泽它时代”
1916年的幽灵