APP下载

详解Meltdown&Spectre攻击

2018-11-09

网络安全和信息化 2018年2期
关键词:内核攻击者性能

安全研究人员发现CPU芯片硬件层面执行加速机制,也就是乱序执行(Out-of-Orderexecution)和推测执行(Speculative Execution),会引起 CPU缓存的污染,从而攻击者可以发起基于cache的侧信道攻击偷取数据。目前主要涉及到两种攻击方法,分别为 Meltdown和 Spectre。Spectre涉及CVE编号CVE-2017-5753和CVE-2017-5715,而 Meltdown涉及 CVE编号CVE-2017-5754。

由于Meltdown和Spectre的攻击是针对CPU硬件的缺陷进行的攻击,因此它们的攻击范围特别广,存在于各种操作系统和云平台上。近二十年的CPU/OS/VMM基本都受影响,包括从云端到桌面到移动,对业界产生巨大冲击。

这一漏洞主要用于偷取隐私数据,包括口令、证书和其他保密数据,甚至完整的内存镜像。值得庆幸的是这些攻击不能修改数据。影响范围包括:

CPU处理器:近二十年的Intel、AMD、ARM等处理器都有影响,其中对Intel处理器的影响尤为严重;

操作系统:Windows、Linux、Android、iOS 和macOS等;

虚拟机管理器:KVM、Xen等。

本文主要关注Intel CPU Meltdown和Spectre在不同场景下的攻击及缓解措施,这些内容对AMD/ARM的攻防也有重要的借鉴价值。这些漏洞虽然影响广泛,但利用复杂,限制也很大。

攻击的场景

Meltdown和Spectre具体有三个变种:

变种 1(V1)Spectre:绕过边界检查(CVE-2017-5753);

变种 2(V2)Spectre:分支预测注入(CVE-2017-5715);

变种 3(V3)Meltdown:乱序执行的CPU缓存污染(CVE-2017-5754)。

典型的场景威胁:

1.对虚拟机管理器VMM的攻击(A1):攻击者在VMM管理的一个VM中,完全控制此VM,比如拥有这个VM Kernel级别的权限,可以直接与VMM进行交互。攻击者通过利用这些漏洞,可以获取VMM的敏感数据,或者获取同一物理主机下的其他VM内的数据。

2.对操作系统内核的攻击(A2):攻击者是用户空间的一个应用程序,拥有任意的代码执行能力。攻击者通过利用这些漏洞,可获取内核内的敏感数据,甚至包括内核缓冲区的文件或网络数据。

3.对用户空间其他用户数据的攻击(A3):攻击者是用户空间的一个应用程序,拥有任意的代码执行能力。攻击者通过利用这些漏洞,获取同一操作系统下的其他进程的数据,包括跨Docker的攻击。

浏览器对用户空间其他用户数据的攻击(A3w):攻击者只能通过网站页面影响浏览器发起攻击,可通过利用JavaScript、或Web Assembly等机制。

V3c组合攻击:如果将V3攻击置于V1/V2的预测执行路径上,可以完成V3攻击,但不会触发Kernel能感知的页面异常,我们称之为V3c组合攻击。V3c组合攻击的发现意味着A2攻击场景下,要抵抗V3攻击,必须要打内核补丁。

攻击的防御与缓解

防护措施都是有成本的,防护方可根据自己的场景来选择必要的防护措施。

公有云VMM的运营者,应该保障VMM不受恶意攻击,即A1层面的防护是必须要做到的,特别是V2攻击。使用Xen的厂商也要关注V3攻击的防御。

图1 加入LFENCE指令在判断语句之后,防止后面的代码执行推测运行机制

云上租户可以根据自己的需求进行防护。由于A2.V3防护的KPTI补丁有较为明显的性能损耗,所以如果云上租户在同一个VM内部没有数据敏感级别区隔,而且对性能要求较高,那么可以继续使用原始内核。如果云上租户在同一个VM内部有多级数据敏感区隔,而且可执行代码不固定,并能接受额外的性能损耗,那么推荐使用打了安全补丁的内核。

对于普通PC用户,最大的威胁来自于浏览器访问恶意网址以及感染上恶意代码。这些防护与传统PC安全没有太大的区别,及时升级即可。

缓解方案

1.边界检查绕过的缓解——V1的缓解

V1攻击高度依赖于特殊的代码片段(Gadget)。因此,简单有效的软件解决方案就是插入一个Barrier来阻止推测运行机制在这段特殊代码里面执行。Barrier可以选用LFENCE指令。而MFENCE同样可以,不过它的性能损失比LFENCE大,实例如图1所示。

对于Linux系统,禁用eBPF机制可以阻断现有PoC攻击,使得攻击者无法通过eBPF接口注入V1 gadget到内核空间,从而显著提升Exploit的构造难度。Intel的一个分析报告指出,可以作为V1攻击的代码片段在Linux内核中很少。这样使得攻击者发起V1攻击的可行性降低。

2.跳转目标注入攻击的缓解——V2的缓解

对于跳转目标注入攻击,有两个可行的缓解方案。

RSB填充+BTB刷新。这是一个纯软件解决方案,其核心思想就是对跳转目标的Buffer,即RSB和BTB进行清理,使得攻击者注入的跳转目标不再有效。因为RSB是一个32个槽的循环Buffer,因此只需要32个虚假的call指令就可以把整个RSB清理一遍。BTB的槽从1K到16K不等,而且从虚拟地址到BTB索引的映射函数f(x)还不公开,因此要清除BTB,需要首先使用逆向工程方法找到f(x),然后根据f(x)找到1K到16K的虚拟地址来对应每个BTB的槽。最后发起1K到16K个虚假的call/jmp把所有BTB的槽清空(实例代码如图2所示)。需要指出,该方案的性能开销很大。

微码升级+系统软件(VMM/Kernel)补丁。这个缓解方案需要CPU微码升级和系统软件(VMM/Kernel)更新。CPU微码的升级提供了三个新的接口给系统软件:

Indirect Branch Restricted Speculation(IBRS)。当IBRS被设置上时,高优先级代码不会使用低优先级的跳转地址。比如VMM不会使用任何VM提供的地址,Kernel也不会使用任何用户进程提供的地址。

Single Thread Indirect Branch Predictors(STIBP)。当STIBP被设置上时,同一物理CPU上的两个HyperThreading逻辑内核直接的跳转地址不再共享。

Indirect Branch Predictor Barrier(IBPB)。当IBPB被设置时,之前的跳转地址不会影响之后的跳转预测。这个功能一般用于从高优先级到低优先级切换上下文的时候。比如VMM回到VM或Kernel回到用户空间。

图2 BTB Flushing,使用 1K或16K跳转来清空BTB

这三个功能是否支持可以用CPUID加ax=0x7来检测。返回结果中rdx的第26位表明这三个新功能是否支持。对系统软件(VMM/Kernel)的更新,各个操作系统已经发布了相关的补丁。

如果无法得到微码升级,可以考虑使用Retpoline指令替换技术进行防御,替换掉容易被V2攻击的间接跳转和间接调用指令。

此外,类似于V1,Linux下关闭eBPF也可以有效的提升V2攻击的难度。

3.Meltdown攻击的缓解措施——V3的缓解

抵御Meltdown攻击最有效的方式就是KAISER/KPTI。KAISER/KPTI方案中要求操作系统维护两个页表,一个页表给用户程序使用,一个给Kernel自己使用。并且确保程序所使用的页表不会映射高优先级的页面,即不会映射Kernel的页面。KAISER/KPTI方案最早提出时是为了侧信道攻击对内核地址随机化(KASLR)的影响,该方案恰巧也可以用来抵御Meltdown攻击。

两个页表的切换,会导致CR3的重新加载,从而引起TLB刷新,进而降低内存的访问速度。如果某些应用场景需要大量的内核和用户空间切换(两个页表之间的切换),会造成较高的性能开销。为了降低这些性能开销,Kernel需要使用充分的利用PCID特性,把TLB的刷新降低。

结语

本文针对Meltdown和Spectre攻击及其缓解措施进行了总结。由于防护措施都是有成本的,本文给防护方提供一个指南,可以根据自己的场景来选择必要的防护措施。本文也指出一些组合攻击方式,比标准攻击威胁更大。因此需要尽快部署相关防护措施。

猜你喜欢

内核攻击者性能
多内核操作系统综述①
机动能力受限的目标-攻击-防御定性微分对策
强化『高新』内核 打造农业『硅谷』
活化非遗文化 承启设计内核
提供将近80 Gbps的带宽性能 DisplayPort 2.0正式发布
Linux内核mmap保护机制研究
正面迎接批判
Al-Se双元置换的基于LGPS的thio-LISICON的制备与性能表征
有限次重复博弈下的网络攻击行为研究
强韧化PBT/PC共混物的制备与性能