本文出自公众号“腾讯安全联合实验室”

澳门新葡萄京官网注册 1

一、背景:

        
1月4日,国外爆出了整个一代处理器都存在的灾难性漏洞:Meltdown和Spectre。

几乎影响了全球20年内所有cpu处理器;这两个漏洞可以使攻击者通过利用并行运行进程的方式来破坏处理器的特权内存,通俗的来说:攻击者能够窃取系统中任何数据。

        
目前,所有安全厂商都对这两个漏洞详细信息以及攻击方式进行复现和验证,但是讲解的都非常专业,难懂。所以我从网上搜寻了多个分析文章,结合个人简单理解,提取了如下一些内容,简单介绍下这次的漏洞:

(由于本人对硬件技术了解有限以及目前爆出来的资料不是很全面,下面分析内容仅供参考)

一 漏洞背景和影响

1月4日,国外安全研究机构公布了两组CPU漏洞:

  • Meltdown(熔断),对应漏洞CVE-2017-5754

  • Spectre(幽灵),对应漏洞CVE-2017-5753/CVE-2017-5715

由于漏洞严重而且影响范围广泛,引起了全球的关注。利用Meltdown漏洞,低权限用户可以访问内核的内容,获取本地操作系统底层的信息;当用户通过浏览器访问了包含Spectre恶意利用程序的网站时,用户的如帐号,密码,邮箱等个人隐私信息可能会被泄漏;在云服务场景中,利用Spectre可以突破用户间的隔离,窃取其他用户的数据。Meltdown漏洞影响几乎所有的Intel
CPU和部分ARM CPU,而Spectre则影响所有的Intel CPU和AMD CPU,以及主流的ARM
CPU。从个人电脑、服务器、云计算机服务器到移动端的智能手机,都受到这两组硬件漏洞的影响。

澳门新葡萄京官网注册 2

这两组漏洞来源于芯片厂商为了提高CPU性能而引入的新特性。现代CPU为了提高处理性能,会采用乱序执行(Out-of-Order
Execution)和预测执行(SpeculativePrediction)。乱序执行是指CPU并不是严格按照指令的顺序串行执行,而是根据相关性对指令进行分组并行执行,最后汇总处理各组指令执行的结果。预测执行是CPU根据当前掌握的信息预测某个条件判断的结果,然后选择对应的分支提前执行。乱序执行和预测执行在遇到异常或发现分支预测错误时,CPU会丢弃之前执行的结果,将CPU的状态恢复到乱序执行或预测执行前的正确状态,然后选择对应正确的指令继续执行。这种异常处理机制保证了程序能够正确的执行,但是问题在于,CPU恢复状态时并不会恢复CPU缓存的内容,而这两组漏洞正是利用了这一设计上的缺陷进行测信道攻击。

0x00 漏洞简评

虽然计算机经过了这么多年的发展,但至今仍构筑在最初的冯氏体系上。因而很自然的,CPU
就成了提升速度的关键瓶颈,除了依赖早期摩尔定律那样的集成电路技术外,性能优化也是其中重要的一环。

而谈及计算机性能优化就不得不提 Cache 机制,此次的 CPU
漏洞简言之就是没处理好
Cache(广义)未命中的情况,借助侧信道攻击可导致信息的泄露,从而使得原有内核态与用户态隔离、进程间隔离的保护机制能被轻易绕过。

随着 CPU 漏洞事件的不断发酵,更多技术细节也开始浮出水面,最新研究表明自
95 年后生产的现代 CPU 都可能存在这些问题。

对无打算更换 CPU
的普通用户来说应该及时更新补丁,性能上必然会受影响,但还不至于太显著。当然,这次事件也给出了一个漏洞挖掘的好思路,芯片安全应该引起我们更多的关注。

二、简单易懂的描述下这一次的漏洞:

         首先这次的两个漏洞原理比较类似,通俗的比喻一下:

        
我想要知道我同事的昨天的行踪,那么我就试探的对同事说:我昨天看见了你和一个女生在一起逛街,你们是不是。。。?
虽然我昨天压根儿什么都没看到,但是我说完,他愣了一会(愣神比较久),回了一句:我凭什么要告诉你?!虽然他没有承认,但是显然我已经知道了答案。

        
这次的漏洞也是同理,利用了CPU的两个特殊的机制:其中Meltdown利用了CPU的乱序执行,Spectre利用了CPU的预测执行。

        
Spectre预测执行:在整个OS系统中,某个应用程序(恶意软件)去询问操作系统:“用户刚才登录的密码第一个数字是1吗?”操作系统回复:“不关你的事,你没有权限知道。”

这个过程本身是没有问题的,但是问题出在:操作系统虽然没有明确的回复,但是他心里想了一遍这个答案,尤其是当对方问到一个正确的数字时,他回答的稍微犹豫了几毫秒,这个事情被恶意软件注意到了,就可以通过反复的提问,最后猜到了密码是什么。

       
Meltdown乱序执行:假设有abc三个地址,其中a地址没有访问的权限,但是b和c可以访问,此时执行下面这个条件表达式:

         x= a?b:c

        
表面看来,由于a地址无法访问,所以系统会直接报错!但实际上,CPU为了加快执行速度,会采用多流水线作业方式。它会在检查a是否可访问的同时,预先就往下执行了。等到权限检查结果回来,已经根据a的结果完成了b或者c的加载,只是还没有赋给x而已。经过加载的b或者c会在缓存里。虽然报错了,但如果再次访问就会比较快。于是再次访问b和c,根据返回的时间快慢,就可以猜到a的内容!

二 漏洞原理解析

1、Meltdown漏洞原理

乱序执行可以简单的分为三个阶段,如下图所示:

澳门新葡萄京官网注册 3

每个阶段执行的操作如下:

1)获取指令,解码后存放到执行缓冲区Reservations Stations

2)乱序执行指令,结果保存在一个结果序列中

3)退休期Retired
Circle,重新排列结果序列及安全检查(如地址访问的权限检查),提交结果到寄存器

结合Meltdown利用的代码片段来看:

; rcx = kernel address
; rbx = probe array
1  mov al, byte [rcx]
2  shl rax, 0xc
3  mov rbx, qword [rbx + rax]

Meltdown漏洞的利用过程有4个步骤:

1)指令获取解码

2)乱序执行3条指令,指令2和指令3要等指令1中的读取内存地址的内容完成后才开始执行,指令3会将要访问的rbx数组元素所在的页加载到CPU
Cache中。

3)对2)的结果进行重新排列,对1-3条指令进行安全检测,发现访问违例,会丢弃当前执行的所有结果,恢复CPU状态到乱序执行之前的状态,但是并不会恢复CPU
Cache的状态

4)通过缓存测信道攻击,可以知道哪一个数组元素被访问过,也即对应的内存页存放在CPU
Cache中,从而推测出内核地址的内容

2、Spectre漏洞原理

与Meltdown类似,Spectre的原理是,当CPU发现分支预测错误时会丢弃分支执行的结果,恢复CPU的状态,但是不会恢复CPU
Cache的状态,利用这一点可以突破进程间的访问限制(如浏览器沙箱)获取其他进程的数据。

Spectre的利用代码片段:

if (x < array1_size) {
y = array2[array1[x] * 256];
// do something using Y that is
// observable when speculatively executed
}

具体攻击过程可以分为三个阶段:

1)训练CPU的分支预测单元使其在运行利用代码时会进行特定的预测执行

2)预测执行使得CPU将要访问的地址的内容读取到CPU Cache中

3)通过缓存测信道攻击,可以知道哪一个数组元素被访问过,也即对应的内存页存放在CPU
Cache中,从而推测出地址的内容。

0x01 概述

Google Project Zero 公布的 Meltdown(CVE-2017-5754)与
Specter(CVE-2017-5753、CVE-2017-5715)两组漏洞几乎影响所有的主流
CPU,其中就包括了 AMD、ARM 和 Intel。

同时,云端设备、PC、笔记本、平板和智能手机都受到了波及,恶意者可利用这些漏洞来窃取计算机上的敏感数据。

两组漏洞都源于 “推演执行(speculative execution)”
的特性。为了提高性能,CPU
会基于假设推演来预先选择待执行的分支,之后在程序执行期间,如果推演是有效的,那么照此继续执行,如果无效则根据实际情况选择正确的路径执行。

对恶意者来说,可以借助侧信道攻击使 CPU
在推演无效时仍继续执行,从而导致信息的泄露。

三、Meltdown(熔断)和Spectre(幽灵)区别:

1、Meltdown依赖于Intel的CPU设计漏洞,在OOO时,忽略对memory权限的检查。

   Spectre则是更严重的漏洞,涉及到近20年的Intel,
AMD, Qualcomm厂家和其它ARM的处理器,而且更难修复。

2、官方表述:

         1.Meltdown(熔毁)

        
Meltdown破坏了位于用户和操作系统之间的基本隔离,允许恶意代码访问主机任意内存,从而窃取其他应用程序以及操作系统内核的敏感信息。这个漏洞“熔化”了由硬件来实现的安全边界。允许低权限用户级别的应用程序“越界”访问系统级的内存,从而造成数据泄露。

         2.Spectre(幽灵)

        
Spectre则是破坏了不同应用程序之间的隔离。问题的根源在于推测执行(speculative
execution),这是一种优化技术,处理器会推测在未来可能执行的指令并预执行。这种技术的目的在于提前准备好计算结果,当这些数据被需要时可立即使用,以提升系统运行效率。内在的原因是CPU的运行速度大大快于内存的读取速度。在此过程中,英特尔等CPU没有很好地将低权限的应用程序与访问内核内存分开,这意味着攻击者可以使用恶意应用程序来获取应该被隔离的用户级私有数据。

三 漏洞验证

目前开源社区github已经放出来了漏洞的验证代码(PoC),如下:

经过我们和其他安全研究人员实际验证,漏洞可在Windows、Linux、Mac-OS等操作系统下,成功读取任意指定内存地址的内容,如下图所示:

Windows:

澳门新葡萄京官网注册 4

Ubuntu 16.04:

澳门新葡萄京官网注册 5

此外,有安全研究人员验证了可以通过漏洞获取到用户正在输入的密码,不过暂未放出相关代码。如下图所示:

澳门新葡萄京官网注册 6

0x02 Meltdown 攻击

Meltdown
漏洞利用到了无序执行指令(Out-of-Order)模式,可允许恶意者读取目标设备的整个物理内存空间,而不单是内核空间,从而泄露出操作系统及其上应用程序的所有信息。

利用程序中借助了处理器提权漏洞,使得指令可以绕过内存保护,从而由
“推演执行”
特性绕过用户层到内核层的限制,这就使得应用程序也能访问系统为内核分配的空间。

四、漏洞利用方式及影响:

利用方式:

1、云端主机(包括物理机和同机其他虚拟机)的相关敏感数据;对于云服务而言,攻击者会通过租用云服务、利用其自身脆弱性或安装恶意应用程序实施攻击,并可能获取到可以支持云内横向移动的关联数据。由于云服务基本都是在一台服务器上运行多个虚拟机,导致越界访问其他云主机的证书、密码、秘钥等

2、窃取桌面用户敏感信息。对于桌面用户而言,攻击者可从浏览器侧当作攻击入口。目前网上已经验证,通过一段JS代码可以在用户浏览器中成功利用此漏洞。

3、该漏洞对于专有设备的影响,目前还在分析评估中

利用难度:

漏洞利用难度很低。相关漏洞已有成熟PoC代码流出

利用POC验证代码:

 

 

 

 

漏洞影响:

Windows、Linux、macOS、亚马逊AWS、谷歌安卓均包含在内

Intel、ARM的Cortex-A架构和AMD处理器。Cortex-A目前广泛用于手机SoC平台,包括高通、联发科、三星等等。

漏洞危害:

相关漏洞本身只能读取数据,不能修改数据,但由于其获取的数据中有可能包括口令、证书和其他敏感数据,甚至能够完整copy内存镜像,意味着可以获取所有打开的文件和信息,因此这个漏洞比一般性的虚拟机对云的危害更大。这种攻击对云的安全监测机制几乎不受影响,因此其对云安全、包括私有云,危害极大。

四 漏洞修复进展

针对这两组漏洞,各家芯片厂商,操作系统厂商,浏览器厂商,以及云服务厂商,都积极采取措施,发布安全公告,并及时推出缓解措施和修复补丁。

1、芯片厂商

1.1 Intel

Intel已经确认自身CPU中存在相关问题,并正与包括AMD、ARM和多家操作系统厂商在内的许多其他科技公司紧密合作,制定行业范围的方法,以便及时和建设性地解决这些漏洞。另外Intel认为有些媒体里面的报道并不准确,这些问题不仅仅Intel,其他厂商的CPU中也存在相关问题。这些问题的修复对性能的影响和具体的工作场景相关,对一般用户而言,影响并不显著,而且随着时间的推移这些影响都会得到缓解。

Intel已经提供软件和固件更新以解决这些漏洞,预计下周末之前会修复最近5年中90%的CPU。Intel的安全公告如下:

1.2 ARM

ARM确认大部分处理器不受漏洞影响,但给出了一个受影响的处理器列表。ARM认为,利用这些漏洞进行攻击需要在本地运行恶意软件,用户及时更新软件和不点击来历不明的链接会降低攻击风险。针对linux上的程序,ARM提供了新编译器,可用新编译器重新编译。另外发布了Linux
ARM内核补丁,用于修补漏洞,相关页面如下:

1.3 AMD

AMD针对每个漏洞做了回复,第一个漏洞由软件、操作系统厂商发布补丁解决,性能影响非常轻微,其他两个漏洞由于AMD
CPU特殊的架构,都不受影响。具体如下:

2、操作系统

2.1 Windows

微软已经发布了安全通告,修复了IE、Edge、Windows内核中相关问题,并针对普通用户、服务器用户、云用户各自给出了防护指南。

微软普通用户:

服务器用户:

云用户:

微软安全通告:

2.2 Linux

Linux内核开发者Thomas
Gleixner在2017年12月在Linux内核邮件列表中就新的KAISER隔离补丁发布了说明。目前有人怀疑这批补丁可能正是为了解决Linux系统当中的Metldown与Spectre漏洞。具体如下:

2.3 RedHat

红帽公司已经发布一项建议,其中列出受到影响的产品及其当前状态。建议内容表明:对于正在运行受影响版本产品的红帽客户,强烈建议用户尽快根据指导清单进行更新。所有受影响产品都应安装修复补丁,借以缓解CVE-2017-5753
(变种1)与CVE-2017-5754
(变种3)漏洞。CVE-2017-5715(变种2)可通过本地以及虚拟访客边界两种方式被加以利用。具体如下:

2.4 安卓

Android团队于2018年1月更新了安全通告:CVE-2017-5715、CVE-2017-5753以及CVE-2017-5754为已经得到公开披露的一系列与处理器内推测执行相关的漏洞。Android尚未发现任何在基于ARM的Android设备之上重现上述漏洞以进行的未授权信息泄露行为。为了提供额外的保护措施,本公告当中包含的CVE-2017-13218更新减少了对高精度定时器的访问,旨在限制旁路攻击(例如CVE-2017-5715、CVE-2017-5753以及CVE-2017-5754)所有已知变种对ARM处理器的影响。具体如下:

3、浏览器

利用漏洞在浏览器中进行攻击依赖于新特性SharedArrayBuffer和用于高精度时间计算的函数performance.now。各个浏览器表示都采取了以下两个缓解措施:

  • 移除浏览器中可用于攻击的SharedArrayBuffer特性

  • 降低用于高精度时间计算的函数performance.now的精确性

加上这两个缓解措施后,JS版本的漏洞PoC代码将无法触发:

澳门新葡萄京官网注册 7

3.1 Microsoft Edge

微软已经发布了浏览器补丁:

3.2 FireFox

Mozilla从FireFox 57版本开始采取了这两个缓解措施:

3.3 Chrome

谷歌从Chrome 64版本开始采取了这两个缓解措施:

4、云服务厂商

4.1 Amazon

Amazon方面已经发布一项安全公告,指出:此项安全漏洞广泛存在于过去20年推出的英特尔、AMD以及ARM等各类现代处理器架构当中,影响范围涵盖服务器、台式机以及移动设备。Amazon
EC2体系中除极少数实例外,其余皆受到严格保护。剩余部分的修复工作将在接下来数小时内完成,并附有相关实例维护通知。虽然AWS所执行的更新能够切实保护底层基础设施,但为了充分解决此次问题,客户还应对实例中的操作系统进行修复。目前Amazon
Linux更新已经开始发布,具体如下:

4.2 阿里云

为解决处理器芯片的安全问题,阿里云将在北京时间2018年1月12日凌晨1点进行虚拟化底层的升级更新。届时,阿里云将采用热升级的方式,绝大多数客户不会受到影响。但个别客户可能需要手动重启,阿里云建议客户提前准备运营预案及数据备份。

4.3 腾讯云

腾讯云将于北京时间2018年1月10日凌晨01:00-05:00通过热升级技术对硬件平台和虚拟化平台进行后端修复,期间客户业务不会受到影响。对于极少量不支持热升级方式的,腾讯云另行安排时间手动重启修复,这部分服务器腾讯云安全团队将会另行进行通知,协商升级时间。

0x03 Spectre 攻击

要完全解决 Spectre
漏洞需改变处理器的架构,因此该漏洞不容易修补且会困扰人们很长一段时间。

它打破了不同进程间的隔离机制,攻击者会先让进程访问其内部的特定空间,而后通过侧信道方式读取相应数据,从而泄露出程序信息。

Spectre 攻击不仅可以用于内核层到用户层的信息泄露,还可用于虚拟化中
Hypervisor 层到 Client 层的信息泄漏。此外,借助 JS
代码还可实现浏览器沙箱逃逸:

澳门新葡萄京官网注册 8

需要注意的是,用于防护 Meltdown 攻击的 KAISER 机制对其是不适用的。

五、漏洞修复:

目前Intel及其他芯片厂商尚未发布修补补丁

但大多数操作系统商(微软、CentOS)和云技术厂商已经发布了临时补丁,但对于系统性能会有影响,需要谨慎评估后再进行修复。

五  漏洞修复存在的问题

由于漏洞是芯片底层设计上的缺陷导致的,修复起来会非常复杂,同时难以完美修复。从目前的情况来看,漏洞很难通过CPU微码修复,更多是依赖于OS级的修复程序。

修复程序本身也存在诸多问题。以Windows
10为例,微软于北京时间1月4号凌晨紧急发布了1月份系统安全更新,但补丁存在明显的性能和兼容性的问题:

  • 更新可能会让受影响的系统性能下滑30%

  • 更新可能会导致部分软件(安全软件等)不兼容从而系统蓝屏

出于兼容性考虑,Windows
Update并不会在所有的电脑环境中进行自动更新,而是在其认为软件比较兼容的情况下才会进行自动更新。另外,对于有需要更新的用户,可以通过下载微软相关补丁包,进行手动运行修复安全威胁。

根据我们的实际测试,性能问题对于普通用户来说,影响并不大:只有在极端的测试下,才会出现明显的性能问题;而正常的使用过程中一般不会出现。但是兼容性问题确实比较严重:在有安全软件,以及一些游戏的电脑上,安装补丁比较容易出现蓝屏现象。这也使得我们和其他安全厂商采取了比较保守的策略,暂时不主动推送微软的补丁,避免造成用户电脑无法正常使用。

0x04 漏洞的修复

Windows OS (7/8/10) 和 Microsoft Edge/IE

微软已经发布了针对 Windows 10 的安全更新(KB4056892),用于解决 Meltdown
问题,并将于 1 月 9 日发布针对 Windows 7 和 Windows 8 的修复程序。

Linux OS

Linux 也发布了内核补丁,版本包括
4.14.11、4.9.74、4.4.109、3.16.52、3.18.91 和 3.2.97,用户可以从
Kernel.org 上下载。

Apple macOS、iOS、tvOS 和 Safari Browser

Apple 在公告中指出,所有 Mac 系统和 iOS
设备都受到了影响,但目前还没有已知的攻击事件发生。

为了预防 Meltdown 攻击,Apple 已经在 iOS 11.2、macOS 10.13.2 和 tvOS
11.2 上释出了缓解措施,针对 Spectre 攻击的修复方案将在后续发布。

Android OS

Google 表示,1 月 5 日发布的安全更新已经释出了最新版的 Android
操作系统。

Firefox Web Browser

Mozilla 已经发布了 Firefox 57.0.4 版本,其中包含针对 Meltdown 和 Spectre
攻击的缓解措施,建议用户尽快更新。

Google Chrome Web Browser

Google 计划在 1 月 23 日发布 Chrome 64 版本用于防御针对 Meltdown 和
Spectre 的攻击,在此期间,用户可启用 “Site Isolation” 功能。

VMware

云计算厂商 VMware 也发布了受影响的产品清单以及针对 Meltdown
攻击的修复措施。

更多详情可参考看雪论坛专题帖: [讨论]Intel 曝出处理器设计漏洞,影响
Linux 和 Windows
内核

本文由看雪翻译小组 BDomne 编译,来源hackernews

转载请注明来自看雪社区

六、专业漏洞解读:

六 漏洞对普通用户的影响

虽然漏洞影响范围广泛,并引起全球关注,但受影响最大的主要是云服务厂商,对于普通用户来说,大可不必过于恐慌。

首先,虽然漏洞细节以及PoC已经公开,但是并不能直接运用于攻击。漏洞运用于真实攻击还有许多细节问题需要解决,目前也没有一个稳定通用,同时可以造成明显严重后果(窃取账号密码等)的漏洞利用代码;

其次,我们和其他安全厂商目前也还没有监控到利用这些漏洞进行的真实攻击,一旦出现真实攻击,我们将第一时间跟进,确保用户安全;

另外,对于普通用户而言,漏洞可造成的主要危害在于用浏览器访问了一个带有漏洞利用代码的网页,导致敏感信息(账号密码等)泄露。只要养成良好的上网习惯,不轻易点击陌生人发来的链接,基本不会受到漏洞影响;同时,浏览器针对漏洞发布的补丁和缓解措施简单有效,而且不会造成性能下降或兼容性问题,用户可以选择将浏览器升级到最新版本,从而避免受到漏洞攻击。

CPU乱序执行和预测执行导致的安全问题

乱序执行(Out-of-Order Execution) [1] 和预测执行(Speculative Execution)
[2]
是现代CPU为了提高性能通常采用的优化方式。乱序就是指CPU不按照程序严格规定的先后顺序执行,预测就是CPU基于先有经验预先执行了后续可能执行的代码。传统观念认为,由于CPU在运行过程中会丢弃乱序执行和预测执行所导致的不正确的运算结果,所以乱序执行和预测执行不会对程序的正确性和安全性造成任何影响。然而,最新的发现表明攻击者完全可以利用这两种CPU特性进行侧信道攻击。目前已知的Meltdown攻击和Spectre攻击就是两个典型的攻击实例
[3]。

 

从本质上来讲,这两种攻击都属于基于CPU缓存(cache)的侧信道攻击的范畴。这种侧信道攻击在最近十年国外的计算机安全研究领域非常流行。它们的基本假设是攻击者在目标主机上拥有一定的执行权限(比如操作系统的一个普通进程,云计算中的一个虚拟主机,或者浏览器中的一段Java代码),然后通过控制自己内存空间的数据(例如读取等等)来间接的控制CPU缓存。由于CPU缓存是攻击者和目标主机上的目标程序共享的,这种对缓存的间接控制可以被攻击者用来推测目标程序的行为。举个例子来说,如果攻击者和目标程序共享物理内存(比如同一个操作系统的两个程序往往共享同一个动态链接库),攻击者可以反复的利用CPU指令把这块内存的某个地址清除出CPU缓存(Flush阶段),然后在一定的时间间隔后读取这个地址上的内存数据并且测量读取的时间(Reload阶段)。通过这种方式,攻击者可以清楚的知道该地址是否被目标程序读取过,因为一旦目标程序读取该地址,其对应的内存会被导入CPU缓存,从而使得攻击者自己对这个地址的访问变快(由于从缓存读取要远远快于内存)。这种攻击方式被称为Flush+Reload
[6]攻击。此外CPU缓存侧信道还有Evict+Time [7], Prime+Probe [8]
等攻击方式。

 

然而,以往的侧信道攻击针对的目标是被攻击者内存读取的模式,例如某条指令是否被执行或者某个数据是否被访问,而不能直接读取被攻击者的内存。而Meltdown攻击[4]
和Spectre攻击[5]
的目标是越权的内存读取,比如读取(dump)整个内核的内存数据。这就使得这种侧信道攻击的后果更加严重。这也是为什么这个CPU漏洞会被媒体大肆渲染。下面我们就对这两种攻击的基本形式和本质做一下介绍。

 

七 结语

这些漏洞未来一段时间内仍然是各界关注的重点,腾讯电脑管家安全团队将对漏洞动态保持持续关注,同时对漏洞做更加深入的分析和研究,从而为广大用户提供更加准确的参考信息,以及更加可靠的解决方案。

(文/开源中国)    

Meltdown攻击

 

Meltdown攻击利用现代CPU中乱序执行 (out-of-order
execution)的特性,彻底攻破原本由硬件保证的内存隔离,使得一个仅仅具有普通进程权限的攻击者可以用简单的方法来读取内核内存。应该强调一点,Meltdown攻击不是针对KASLR[9]的攻击。攻击KALSR相对要简单很多,因为它的目标仅是获取内核内存的虚拟地址,而Meltdown的攻击目标是获取内核内存的内容。

 

Meltdown攻击的本质是利用CPU进行的安全检查和乱序执行之间的race
condition,给攻击者创造一个很短的攻击窗口。乱序执行是指当CPU中的某些指令需要等待某些资源,比如内存读取时,CPU不会在当前指令停止,而是利用空闲的计算能力继续执行后续的指令。这大大地增加了计算能力的利用率,从而提升了CPU性能。在支持乱序执行的CPU上,指令的执行并不是顺序进行的。比如后面的指令可能在前面指令执行结束之前就开始执行。然而,为了保证程序的正确性,指令退休(retirement)必须是顺序进行的,而CPU的安全检查是在指令退休时才会进行。这样的结果是,在CPU对某一条指令进行安全检查之前,一部分在该指令后面的指令会由于CPU的乱序执行而被提前执行。例如,一条用户空间的指令访问内核内存会导致CPU抛出异常,然而该异常只有在这条指令退休的时候才会被CPU处理,而由于乱序执行而被提前执行的指令会被CPU丢弃。由于CPU保证程序的正确性,乱序执行本不会产生安全隐患。然而,由于乱序执行的指令对缓存的操作在这些指令被丢弃时不会被重置,攻击者就可以通过缓存侧信道的方式来获取这些乱序执行的信息,从而导致了Meltdown攻击。本质上,Spectre攻击的原理也是一样的。我们会在后面介绍。

 

以下是一个简化的Meltdown攻击的基本指令:

 

1 ; rcx = kernel address2 ; rbx = probe array3 mov al, byte [rcx]4 shl
rax, 0xc5 mov rbx, qword [rbx + rax]

 

首先,在指令3中一个具有用户级权限的攻击者访问目标内核内存地址(存储在寄存器rcx中)。由于访问了内核地址,这一条指令将会触发异常,使得它和它之后的指令对寄存器的修改将被全部丢弃。但是在等待CPU完成执行该指令的同时,后两条指令因为乱序执行实际上已经被执行过了,并且此时的计算是根据指令3所读取到的数据所进行,并不受CPU权限限制。指令4将会把这个数据乘以4096,并在指令5中将其作为offset来对数组probe
array进行访问。由于一个内存页的大小是4KB,不同的数据将会导致不同的内存页被访问并存放到CPU缓存中。此后,另一个攻击者进程就可以通过缓存侧信道攻击,来了解哪个内存页被访问过了,从而推断出被访问的内核内存数据。

 

具体的缓存攻击方式有Flush+Reload [6],Evict+Time
[7],或者Prime+Probe [8]。在Meltdown这个场景中(数组probe
array是在攻击者自己的内存空间的),比较简单而且有效的攻击方法是Flush+Reload,前面已经描述过其基本思想。简单的讲,Flush+Reload攻击首先把probe
array的相对应的内存用clflush指令清除出CPU缓存,然后在执行了上述攻击代码后再逐一访问probe
array的各个内存页并记录访问时间。访问时间短说明上述代码执行过程中CPU已经把对应的内存页加载到缓存中了,原因是这个内存页对应的offset正好是内核空间中rcx指向的内存内容。

 

总的来说,Meltdown攻击的指令由两部分组成:第一部分利用乱序执行来访问受限内存,第二部分根据所读取到的数值再编码到内存的访问,并通过缓存侧信道提取信息。攻击的关键在于,乱序执行的这两条指令必须在读取内核内存的指令退休之前,也就是权限审核之前,执行完毕。另外,由于访问受限内存会导致操作系统抛出异常,攻击者可以通过hardware
transaction
memory等方式抑制异常[11]或者用其他方式处理异常[4],从而反复不间断的对受限内存进行遍历访问。

 

Spectre攻击

 

Spectre攻击利用了CPU的预测执行对系统进行攻击。预测执行是另外一种CPU优化特性。在分支指令执行时,由于分支指令执行可能需要内存读取(上百个CPU周期),在分支指令执行结束之前,CPU会预测哪一个分支会被运行,提取相应的指令代码并执行,以提高CPU指令流水线的性能。CPU的预测执行是通过分支预测单元(BPU)进行的。简单的理解,BPU储存了某个分支指令最近执行过的分支跳转的结果。CPU的预测执行遇到分支指令时,会根据BPU的预测结果进行跳转。当预测执行发现预测错误时,预测执行的结果将会被丢弃,CPU的状态会被重置。然而,与乱序执行类似,预测执行对CPU缓存的影响会被保留。Spectre和Meltdown攻击在这一点上比较类似。

 

Spectre攻击主要分为三个阶段:

 

准备阶段:
在这一阶段,攻击者通过一些操作来训练CPU的BPU,以使其在运行目标代码时会进行特定的预测执行。同时,攻击者可以执行一些操作来提高预测执行发生的机率,比如把条件判断所需的数据挤出缓存,这样执行分支指令的时间会加长。另外,攻击者也可以在这一阶段做好侧信道的准备工作,比如Flush+Reload攻击中的Flush部分。

 

攻击阶段:攻击者利用CPU的预测执行把目标的机密数据转移到微架构侧信道中。具体的攻击方法我们下面详细描述。

 

机密数据提取阶段:
通过测量Flush+Reload或其他缓存攻击的方法中Reload内存时间,攻击者可以从缓存侧信道中提取出目标机密数据。这一点跟Meltdown攻击十分相似。

 

在攻击阶段,攻击者利用CPU的预测执行把目标的机密数据转移到微架构侧信道中。常见的分支指令包括条件分支指令和间接分支指令。所以相对的Spectre攻击也有两种不同的方式。其主要的思想是,攻击者通过控制目标程序的某个变量或者寄存器,使其读取攻击者指定的内存地址。这里攻击者指定的内存地址的内容就是攻击者试图获取的机密数据(比如用户密码)。如果目标程序中含有将这个机密数据作为内存访问的指针或者数组offset,那么攻击者就可以利用缓存侧信道来提取被访问的内存地址,进而提取目标机密数据。

 

攻击的危害

 

本质上讲Meltdown和Spectra都是基于侧信道的攻击,主要用于信息泄露,并不能对目标内存地址进行任意修改。Meltdown攻击往往用于攻击者代码由于权限的限制而不能任意读取其所在的内存地址空间的情况。比如在操作系统中内核内存会被映射到所有普通进程的地址空间,尽管普通进程可以通过虚拟地址访问所有受限内存,包括内核的地址空间,直接访问内核地址会抛出异常而终止。而Meltdown攻击可以帮助攻击者完成这样的操作。在云计算的虚拟机架构上也有类似的问题,使得虚拟机可以通过Meltdown攻击任意读取云服务器宿主机(host)虚拟机管理程序(VMM)的内存地址。而Spectra攻击则利用目标程序的特殊结构,通过系统调用或者函数调用的方式控制其中的某个变量来达到泄漏目标程序(或内核)地址空间中内存内容的目的。比如文献[5]提出了Java代码访问整个浏览器进程内存的方法。而文献[10]提出了利用内核即时编译(Just-in-time
compilation)的特性进行提权攻击,正是由于即时编译出得代码具有Spectra攻击所需要的特殊结构。

 

Meltdown攻击所攻击的并不是软件漏洞,而是CPU设计本身的安全缺陷。所以Meltdown攻击适用广泛,后果严重。它已经被证明在2010年后发布的Intel桌面及服务器CPU架构上全部可行。实验证明个人计算机和云服务器全都会受到影响,而被成功攻破的操作系统包括Linux,MS
Windows,以及包含Docker,LXC,和OpenVZ在内的container。在ARM和AMD处理器上,尽管Meltdown攻击所依赖的硬件漏洞同样被证实存在,目前尚无完整的攻击。可能的原因包括指令执行过慢,CPU的流水线(Pipeline)过短等等。相比之下,Spectre攻击需要目标程序具有特殊结构,所以受到目标软件的限制。如果目标程序不具有该特殊结构,那么Spectre攻击就很难进行。但是相对于Meltdown攻击目前仅限于Intel处理器上,Spectre攻击适用于Intel,AMD,ARM等众多处理器上。

 

漏洞的防御

 

虽然Meltdown和Spectre是CPU漏洞,短时间内很难通过CPU升级来修补漏洞。目前对Meltdown的主要防御手段是以软件完全隔离用户态和内核态来实现,虽然有分析称这样程序的性能可能会大幅下降。而Spectra的防御就更加困难,借助编译器做程序分析,添加顺序执行指令(比如lfence,cpuid)是一种可能的方案。我们也会继续跟踪重要厂商对漏洞的修补,并对这些修补方式进行测试。我们实验室也会研究和开发其他安全技术对这些攻击进行防范。

 

对于一般用户,只要不被执行恶意代码,比如不去访问恶意网站,就不会有不可信代码进入内存执行,就不会被Spectra和Meltdown攻击。所以个人用户还是可以利用已有的防御手段(比如恶意网站拦截)对自己进行保护。同时也应该及时关注系统软件厂商,比如操作系统厂商和浏览器厂商的补丁并且随时更新。

 

对于在云端,由于攻击者可以租借虚拟环境来执行攻击者想执行的任何代码,所以攻击者可以利用它们去从虚拟机用户态读宿主机的内核态以及虚拟态的关键数据,从而可以攻击其他虚拟机。所以云厂商有责任在第一时间对这些CPU漏洞进行软件修补。企业用户应该采取积极的态度配合或者推动漏洞的控制。