Spectre漏洞是一个存在于分支预测实现中的硬件缺陷及安全漏洞,含有预测执行功能的现代微处理器均受其影响,漏洞利用是基于时间的旁路攻击,允许恶意进程获得其他程序在映射内存中的数据内容。
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 漏洞不是单个易于修复的漏洞,而是一类潜在漏洞的总和。它们都利用了一种现代微处理器为降低内存延迟、加快执行速度的常用方法“预测执行”的副作用。具体而言,Spectre 漏洞着重于分支预测,这是预测执行的一部分。与同时披露的相关漏洞“熔毁”不同,Spectre 漏洞不依赖单个处理器上存储器管理及系统保护的特定功能,而是一个更为通用的漏洞。
白皮书的出发点是,对分支预测机制进行边信道定时攻击,它是现代微处理器乱序执行的一部分。虽然,处理器的文档保证在架构级别,预测错误所导致的任何后果都会在得到正确结果之后取消,然而预测执行仍然有可能留下副作用,例如已加载的缓存线。这些所谓的非功能性方面随后便可影响计算环境。如果这种副作用(包括但不限于内存访问时间)对恶意程序可见,并且能设法与受害进程所保存的敏感数据产生关系,则这些副作用可能会使敏感数据可被识别。即使在架构级别,正式的安全设计能正常工作,这种情况仍然会发生;这种情况下,用于代码执行的、较低级的微架构优化仍然有可能泄漏对正常程序正确执行不是非常重要的某些信息。
Spectre 漏洞论文展示了完成攻击的四个基本步骤:
首先,论文阐述了在现代处理器中的,恶意程序可以通过程序内部的运行操纵分支预测逻辑,使得分支预测命中或者失败的情况可以提前判断。
随后展示了,可以可靠地对缓存命中和未命中间的差异进行计时,因此,本来应该是简单的非功能差异,实际却可作为秘密信道,从无关信息中提取进程的内部工作信息。
然后,论文以一个简单的示例程序和一个在浏览器沙盒中运行的 JavaScript 片段为基础,将结果与返回导向编程攻击等原理进行综合;在这两种情况下,只需简单使用由普通编译器或现有浏览器中 JavaScript 引擎生成的代码,利用其中条件分支的预测执行,受害者进程的整个地址空间(即运行中程序的内容)都将可读。其基本思想是,在现有的代码中寻找预测执行可能涉及到不可访问数据的地方,操纵处理器,使得预测执行必须触及该数据的实际内容,然后对处理器的副作用计时,这时预取机制已经加载完成了一条缓存线,结果就是访问这条缓存线的数据速度会更快。
最后,本文泪雪网将这种攻击一般化到受害进程的任何非功能状态上。紧接着讨论了甚至像总线仲裁延迟这样非常不明显的非功能性效应。
Spectre 漏洞和 Meltdown 漏洞之间的根本区别在于,后者依赖于现代英特尔处理器的特定功能:CPU 可能会被诱使预测执行到受保护的系统数据中,被迫进入并处理相关的安全异常。Spectre 中的统计学特征更为明显:尽最大努力以某种方式调教处理器的分支预测机制,并使用现有库中可用(或不可用)的代码来实现基本相同的事。
或者换句话说,正如 Meltdown 论文所说的那样:“Meltdown 在几个方面与 Spectre 攻击有所不同,其中值得注意的是,Spectre 需要定制受害者进程的软件环境,但适用的 CPU 更加广泛,并且 KAISER 对其无效。
影响
截至 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,这是性能损失的主要原因。