新Meltdown变种V3r攻击以及缓解措施(三)

本文作者程越强、陈兆丰、张煜龙、韦韬

1.引言

在上一篇中[1][2],我们主要介绍了Meltdown和Spectre的原理,以及其在Intel和ARM平台下的攻击及缓解措施。本文主要描述和分析我们独立发现的Meltdown新变种攻击和缓解措施。传统的Meltdown(V3)攻击可以让一个用户程序(App)获取内核里面的数据(D),但是这种攻击具有很强的约束条件——只能获取已经存在于当前CPU(即App当前占用的CPU)的L1d缓存里面的内核数据。如果目标数据D不在当前CPU的L1d缓存,V3攻击无法获取目标内核数据。也就是说传统的V3攻击没有让App获取任意内核数据的能力。针对V3的局限,我们独立发现的一种新的 Meltdown变种(命名为 V3r)可以克服这种不足,允许App稳定的获取任意内核地址。文章最后讨论对V3r攻击的缓解措施。

2. Meltdown变种V3r2.1 Meltdown攻击回顾

2.1.1 V3攻击

传统V3攻击可以被用于从用户态读取内核态数据。通常来说,如果用户态程序直接访问内核的内存区域会直接产生一个页错误(由于页表权限限制)。然而,在特定条件下,攻击者可以利用推测执行机制来间接获取内核内存区域的内容。例如,在某些实现中,推测执行的指令序列会将缓存在L1d 缓存中的数据传递给随后的指令进行操作(并影响缓存的状态)。这会导致用户态程序能通过Cache侧信道的方式推测得到内核态数据。

图1:典型的Meltdown攻击代码样例。

2.1.2 V3c组合攻击

原始的V3攻击,将会产生page fault,容易被kernel感知到,从而可以通过host intrusion detection system(HIDS)进行探测。传统上,可以通过Intel Transactional SynchronizationExtensions (TSX)来截获异常,避免产生kernel异常。然而由于TSX历史上的bug,很多云端服务器并不开启TSX,导致该方法并不普适。

我们经过实验后发现,可以将V3攻击置于V1/V2的预测执行路径上,由于这是预测执行,所以不会触发内核异常,但该预测执行依然会触发cache加载操作。即V1/V2->V3的这种攻击方式,可以完成V3攻击,但不会触发kernel能感知的页面异常,我们称之为V3c组合攻击。

2.1.3 V3/V3c攻击小结

关于传统Meltdown(V3)攻击和V3c攻击的几点总结:

目标地址如果没有在页表中建立映射(mapping),那么V3/V3c攻击不能成功。

如果目标地址在页表中建立了映射,但是目标地址内容没有缓冲到CPU的L1d缓存中,V3/V3c攻击不能成功。数据不在L1d缓存包括:

数据在内存里面;

数据在L3/L2缓存里面。

如果目标地址在页表中建立了映射,而且目标地址内容也缓冲到CPU的L1d缓存中,这个时候V3/V3c攻击才会成功。

很多PoC示例当中,攻击者可以通过用户程序获取sys_call_table的内容,这就是因为系统调用经常会访问sys_call_table,从而导致sys_call_table的部分内容很大概率会被缓存到L1d缓存里面,从而使得V3/V3c成功。如果对于任意选择的内核地址,传统的V3和V3c就无能为力了。

2.2最新变种V3r攻击

针对传统V3/V3c不能够可靠的读取任意内核数据的缺点,我们提出了V3r攻击。该攻击可以可靠的读取任意内核数据。具体来讲,V3r攻击分为两个大的步骤:

加载目标内容:应用程序通过内核接口(比如系统调用)触发特殊推测执行事件,把目标地址上的数据加载到L1d缓存里面。

发起V3/V3c攻击:应用程序发起传统V3或V3c攻击,读取被放入L1d缓存里面的数据。

2.2.1利用推测执行加载目标内容

由于安全和隐私方面的考虑,主流内核都不允许普通应用程序读取任何内核地址内容。因此我们需要一些特殊的方法来加载目标内容。目前我们选择的主要方法就是:推测执行。需要了解技术细节,可以参考我们之前对Spectre(V1/V2)介绍的介绍[1][2]。

V1攻击的gadget要求过于严格(要求两次连续的数组访问,其中第一次为越界访问),因此实际攻击场景十分有限。我们的攻击方法受到V1攻击的启发,但是大大削弱了对gadget的要求——仅仅需要一个越界访问。通过这个gadget,可以实现以下两个效果:(1)目标地址上的数据加载进L1d缓存,(2)建立指向该地址页的TLB映射。第二个效果(即TLB映射的建立)提供了用户进程复用该TLB映射的可能性,给缓解方案提出了更高的要求。这样的代码(如图2所示)带内核代码里面大量存在,因此攻击者可以根据场景的需要,选择适合自己的gadget。

图2:可以被V3r利用的典型代码片段(gadget)。注意这里的x必须为攻击者能够控制。

目前PoC代码已经在Linux 4.4.0 with Intel CPUE3-1280 v6和MacOS 10.12.6 (16G1036) with Intel CPUi7-4870HQ上面实验成功,允许一个非特权级程序可靠的读取任意内核地址。

3. V3r的缓解

目前对V3的主要缓解方案就是KPTI——即分离页表防护。这个方法可以结合PCID或ASID的硬件特性,降低性能损耗。

KPTI方案仍然是缓解V3r攻击的有效方案。但这里需要指出的是PCID/ASID不仅仅提供性能帮助,在安全上面也可以很好的实现页表隔离。在没有PCID/ASID支持的CPU上面,如果页表的配置还保留原先的设置——内核页面为Global映射[3],那样的系统将遭受V3r攻击。

表1:对V3和V3r的攻击能力和缓解方案分析。注意加星号“有效缓解*”为:当TLB对于该内核区域映射仍在,则缓解方案无效;其余任何时候方案都有效(超线程的情况下也一样)。

从表1里面我们可以很容易发现,V3r的攻击能力比V3要更强,而且缓解方案也要求的更强。如果页表的配置没有有效的清除所有的global映射,那么该段内核地址将遭受V3r攻击。

4.结语

本文对Meltdown(V3)及其新变种V3r攻击及缓解措施进行了总结。传统V3具有极强的场景限制——仅仅能够读取缓存在L1d里面的内核数据,而V3r能够允许攻击者读取任意内核地址。而且缓解方案也需要更强的条件,如果页表配置稍有不慎,可能内核数据仍然遭受V3r的攻击。由于该新变种的存在,V3系列的攻击威胁大大提高,希望有关厂商尽快部署相关解决方案,并且仔细审查页表配置。

参考资料

Meltdown & Spectre攻击以及缓解措施(一)https://mp.weixin.qq.com/s/Gykx7qrRUL6qgE7hT6hhPA

Meltdown & Spectre 攻击以及缓解措施(二)https://mp.weixin.qq.com/s/7kAK5agn09f-l7IKhxt3Jg

Paginghttps://wiki.osdev.org/Paging

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180306B1ILT100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券