Spectre漏洞

科技工作者之家 2020-11-17

Spectre漏洞是一个存在于分支预测实现中的硬件缺陷及安全漏洞,含有预测执行功能的现代微处理器均受其影响,漏洞利用是基于时间的旁路攻击,允许恶意进程获得其他程序在映射内存中的数据内容。

简介Spectre是一系列的漏洞,基于攻击行为类型,赋予了两个通用漏洞披露ID,分别是CVE-2017-5753(bounds check bypass,边界检查绕过)和CVE-2017-5715(branch target injection,分支目标注入),于2018年1月随同另一个也基于推测运行机制的、属于重量级信息安全漏洞的硬件缺陷“Meltdown”(熔毁)一同公布。由于该缺陷是推测运行机制导致的,加上不同处理器架构对推测运行又有不同的实现方式,因此这个缺陷无法获得根源上的修复而只能采取“见招拆招”式的方法防范,而且因机制所致,各种解决方案还有不可预料的性能下降。

CVE-2017-5753依赖于运行中的即时编译(JIT)系统,用于Javascript的JIT引擎已被发现存在此漏洞。网站可以读取浏览器中存储的另一个网站的数据,或者浏览器本身的内存。对此Firefox57.0.4(部分)及Chrome 64通过为每个网站分配专用的浏览器进程来阻挡此类攻击;操作系统则是通过改写的编译器重新编译以阻挡利用该漏洞进行攻击的行为。

针对CVE-2017-5715,除了软件层面上进行修改以外,处理器也需要通过微码更新来阻挡这类攻击。

历史Spectre 漏洞由Google Project Zero的Jann Horn独立发现,Paul Kocher协同Daniel Genkin、Mike Hamburg、Moritz Lipp和Yuval Yarom也合作发现了此问题。微软漏洞研究(Microsoft Vulnerability Research)则将此问题的波及范围扩展到了浏览器JavaScript的JIT引擎。2017年6月1日,受影响的硬件供应商知悉此问题。2018年1月3日,此漏洞与另一安全漏洞熔毁(Meltdown)被一同公布。

原理Spectre漏洞是一个可以迫使用户操作系统上的其他程序访问其程序电脑存储器空间中任意位置的漏洞。

Spectre漏洞不是单个易于修复的漏洞,而是一类潜在漏洞的总和1。它们都利用了一种现代微处理器为降低内存延迟、加快执行速度的常用方法“预测执行”的副作用。具体而言,Spectre漏洞着重于分支预测,这是预测执行的一部分。与同时披露的相关漏洞“熔毁”不同,Spectre漏洞不依赖单个处理器上存储器管理及系统保护的特定功能,而是一个更为通用的漏洞。

白皮书的出发点是,对分支预测机制进行边信道定时攻击,它是现代微处理器乱序执行的一部分。虽然,处理器的文档保证在架构级别,预测错误所导致的任何后果都会在得到正确结果之后取消,然而预测执行仍然有可能留下副作用,例如已加载的缓存线。这些所谓的非功能性方面随后便可影响计算环境。如果这种副作用(包括但不限于内存访问时间)对恶意程序可见,并且能设法与受害进程所保存的敏感数据产生关系,则这些副作用可能会使敏感数据可被识别。即使在架构级别,正式的安全设计能正常工作,这种情况仍然会发生;这种情况下,用于代码执行的、较低级的微架构优化仍然有可能泄漏对正常程序正确执行不是非常重要的某些信息。

Spectre漏洞论文展示了完成攻击的四个基本步骤:

首先,论文阐述了在现代处理器中的,恶意程序可以通过程序内部的运行操纵分支预测逻辑,使得分支预测命中或者失败的情况可以提前判断。

随后展示了,可以可靠地对缓存命中和未命中间的差异进行计时,因此,本来应该是简单的非功能差异,实际却可作为秘密信道,从无关信息中提取进程的内部工作信息。

然后,论文以一个简单的示例程序和一个在浏览器沙盒中运行的JavaScript片段为基础,将结果与返回导向编程攻击等原理进行综合;在这两种情况下,只需简单使用由普通编译器或现有浏览器中JavaScript引擎生成的代码,利用其中条件分支的预测执行,受害者进程的整个地址空间(即运行中程序的内容)都将可读。其基本思想是,在现有的代码中寻找预测执行可能涉及到不可访问数据的地方,操纵处理器,使得预测执行必须触及该数据的实际内容,然后对处理器的副作用计时,这时预取机制已经加载完成了一条缓存线,结果就是访问这条缓存线的数据速度会更快。

最后,本文将这种攻击一般化到受害进程的任何非功能状态上。紧接着讨论了甚至像总线仲裁延迟这样非常不明显的非功能性效应。

Spectre漏洞和Meltdown漏洞之间的根本区别在于,后者依赖于现代英特尔处理器的特定功能:CPU可能会被诱使预测执行到受保护的系统数据中,被迫进入并处理相关的安全异常。Spectre中的统计学特征更为明显:尽最大努力以某种方式调教处理器的分支预测机制,并使用现有库中可用(或不可用)的代码来实现基本相同的事。

或者换句话说,正如Meltdown论文所说的那样:“Meltdown在几个方面与Spectre攻击有所不同,其中值得注意的是,Spectre需要定制受害者进程的软件环境,但适用的CPU更加广泛,并且KAISER对其无效2。

影响截至2018年,几乎所有的计算机系统都受到Spectre漏洞的影响,包括台式机、笔记本电脑和移动设备。具体而言,Spectre漏洞已证明可以在Intel、AMD和ARM的处理器上工作。英特尔正式回应了所报告的安全漏洞。根据AMD的一份声明,Spectre漏洞第二个变种没有发生在AMD处理器上,且由于AMD架构之间存在差异,“风险接近于零”。

当前,Spectre漏洞只会造成用户级别的程序互相影响,但似乎这种攻击方式可以进一步开发。虽然比熔毁更难正确使用,但由于它的一般性,Spectre漏洞可能会更加难以抵御。原来的白皮书甚至推测,为了完全处理这个问题,可能需要对微处理器体系结构进行重大改变。

而且,对于云提供商而言,Spectre漏洞比Meltdown漏洞影响更大。Meltdown漏洞可使未经授权的应用程序读取特权内存,并获取运行在同一云服务器上进程的敏感数据,而Spectre漏洞可让恶意程序诱使虚拟机管理程序将数据传输到在其上运行的客户系统。

防御措施由于Spectre漏洞是一整类的攻击,所以一个补丁很可能无法完全解决。虽然这个漏洞的一些特殊案例已经在处理,但专门介绍“Spectre”和“Meltdown”的网站也说:Spectre漏洞不易修复,所以会长期困扰我们。微软 Windows系列操作系统于2018年初发布了系统补丁,英特尔公司于事件发生阶段反复表示修复漏洞对性能影响不大,但微软测试表明若安装Windows 7、Windows 8 操作系统、并使用2015年或更早出厂的英特尔芯片,更新后速度会明显变慢,慢到用户能感受到差异,也有说法是性能约下降30%,尤其是较旧的Haswell架构及之前芯片。但若是安装Windows 10并使用Skylake、Kaby Lake等之后更新版英特尔芯片,则性能下降状况并不明显。

尽管如此,已有几个程序帮助保护家庭计算机和相关设备免于“Meltdown”和“Spectre”漏洞的攻击。

嵌入在网站中的JavaScript也可用于攻击。Chrome 64将默认包含针对此攻击的缓解措施,Chrome 63用户可以通过启用站点隔离功能(chrome://flags#enable-site-per-process)手动缓解攻击。在Firefox 57.0.4中,Mozilla正在降低JavaScript计时器的精度,以帮助防止计时攻击,同时计划用于将来版本的时间模糊技术也在工作中。此外,基于浏览器的漏洞利用可以通过禁用JavaScript(例如NoScript)防止。

2018年1月4日,Google在其安全博客上详细介绍了新技术“Retpoline”,该技术能够以微不足道的处理器开销克服Spectre漏洞。它涉及在编译器编译时让间接分支跳转到不同的目标,减少易受攻击的乱序执行发生。虽然这项技术面向x86指令集开发,Google工程师认为该技术也可以用于其他处理器。

也有人提出,在有选择性刷新转译后备缓冲器(TLB)功能的处理器上,可以减少修补漏洞造成的性能损失。该特性在Intel 64架构下称为进程上下文标识符(PCID),而在Alpha下称为地址空间号码(ASN)。这是因为,选择性刷新可隔离进程,及对漏洞至关重要的转译后备缓冲器(TLB)行为,而不会不断刷新整个TLB,这是性能损失的主要原因。

微码、固件更新对于幽灵的变体2——分支目标注入,除了软件的规避阻挡措施外,还至少需要受影响的处理器获得微码更新或固件修复程序。受缺陷影响最大的英特尔已经为新近出货和一些较老的处理器推出微码更新,但是该措施通常需要主板厂商的配合,以便将处理器厂商提供的微码更新集成至其主板的BIOS/EFI固件上,因此会出现一些较老的、早已不享有保固服务的主板没有获得微码更新的情况;而部分较老的处理器,也是未能获得微码更新。对于一些主板厂商未有发布带微码更新固件,但处理器厂商已经推出微码更新修复程序的,有的用户会尝试以自制主板固件的方式安装微码更新。

英特尔在其新出货的处理器上内置了对于阻挡利用该类缺陷进行攻击的微码更新,并在2018年下半年推出硬件层级上带特权隔离措施和进程隔离的处理器产品;ARM则是发布了针对受影响处理器核心的固件修复程序;AMD尽管宣称未受CVE-2017-5715的影响,但仍旧发布了相应的微码更新。

本词条内容贡献者为:

吴晨涛 - 副研究员 - 上海交通大学

科技工作者之家

科技工作者之家APP是专注科技人才,知识分享与人才交流的服务平台。