新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变种V3r

2.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攻击的几点总结:

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

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

    1. 数据在内存里面;

    2. 数据在L3/L2缓存里面。

  3. 如果目标地址在页表中建立了映射,而且目标地址内容也缓冲到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攻击分为两个大的步骤:

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

  2. 发起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攻击。

攻击能力分析

V3攻击

V3r攻击

仅可以读取L1d缓存的内核数据

可以读取任意内核数据

缓解方案分析

内核数据在L1d缓存里面

分离页表 + PCID/ASID

有效缓解

有效缓解

没有PCID/ASID支持

分离页表+非Global映射

有效缓解

有效缓解

分离页表+ Global映射

有效缓解*

无效缓解

内核数据不在L1d缓存里面

分离页表 + PCID/ASID

——

有效缓解

没有PCID/ASID支持

分离页表+非Global映射

——

有效缓解

分离页表+ Global映射

——

无效缓解

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

 

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


4. 结语

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

 

参考资料

  1. Meltdown & Spectre 攻击以及缓解措施(一)

    https://mp.weixin.qq.com/s/Gykx7qrRUL6qgE7hT6hhPA

  2. Meltdown & Spectre 攻击以及缓解措施(二) 

    https://mp.weixin.qq.com/s/7kAK5agn09f-l7IKhxt3Jg

  3. Paging https://wiki.osdev.org/Paging

点击“阅读原文”阅览《Meltdown & Spectre 攻击以及缓解措施(二) 》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值