幽灵漏洞

幽灵（）是一个存在于分支预测实现中的硬體缺陷及安全漏洞，含有预测执行功能的现代微处理器均受其影响，漏洞利用是基於時間的旁路攻擊，允许恶意进程獲得其他程序在映射内存中的資料内容。Spectre是一系列的漏洞，基於攻擊行爲類型，賦予了两个通用漏洞披露ID，分别是（bounds check bypass，边界检查绕过）和（branch target injection，分支目标注入），於2018年1月隨同另一個也基於推測執行機制的、屬於重量級資訊安全漏洞的硬體缺陷「Meltdown」（熔燬）一同公佈。由於該缺陷是推測執行機制導致的，加上不同處理器架構對推測執行又有不同的實作方式，因此這個缺陷無法獲得根源上的修復而只能採取「見招拆招」式的方法防範，而且因機制所致，各種解決方案還有不可預料的效能下降。

CVE-2017-5753依赖于運行中的即时编译（JIT）系統，用于Javascript的JIT引擎已被发现存在此漏洞。网站可以读取浏览器中存储的另一个网站的数据，或者浏览器本身的記憶體。對此Firefox 57.0.4（部分）及Chrome 64通过为每个网站分配专用的浏览器程序来阻擋此類攻擊；作業系統則是通過改寫的編譯器重新編譯以阻擋利用該漏洞進行攻擊的行爲。

針對CVE-2017-5715，除了軟體層面上進行修改以外，處理器也需要通過微指令更新來阻擋這類攻擊。

隨著幽靈缺陷衍生的安全漏洞（攻擊手段變體，包括、、等）被逐一發現，英特爾等CPU開發商不得不在修復既有缺陷的同時資助第三方資訊安全團隊繼續發掘潛在的缺陷以破財消災。

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

细节 
Spectre是一个可以迫使用户操作系统上的其他程序访问其程序電腦記憶體空间中任意位置的漏洞。

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

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

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

首先，论文阐述了在现代处理器中的，恶意程序可以通过程序内部的运行操纵分支预测逻辑，使得分支预测命中或者失败的情况可以提前判断。
随后展示了，可以可靠地对缓存命中和未命中间的差异进行计时，因此，本来应该是简单的非功能差异，实际却可作为秘密信道，从无关信息中提取进程的内部工作信息。
然后，论文以一个简单的示例程序和一个在浏览器沙盒中运行的JavaScript片段为基础，将结果与返回导向编程攻击等原理进行综合；在这两种情况下，只需简单使用由普通编译器或现有浏览器中JavaScript引擎生成的代码，利用其中条件分支的预测执行，受害者进程的整个地址空间（即运行中程序的内容）都将可读。其基本思想是，在现有的代码中寻找预测执行可能涉及到不可访问数据的地方，操纵处理器，使得预测执行必须触及该数据的实际内容，然后对处理器的副作用计时，这时预取机制已经加载完成了一条缓存线，结果就是访问这条缓存线的数据速度会更快。
最后，本文将这种攻击一般化到受害进程的任何非功能状态上。紧接着讨论了甚至像总线仲裁延迟这样非常不明显的非功能性效应。

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

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

影响 
截至2018年，几乎所有的计算机系统都受到Spectre的影响，包括台式机、笔记本电脑和移动设备。具体而言，Spectre已证明可以在主要的Intel、部分ARM的处理器上工作，特定情況下則在AMD架構下能運作。英特尔正式回应了所报告的安全漏洞。根据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工程师认为该技术也可以用于其他处理器。2019年2月，Google研究人员发表论文认为光靠软件不能完全避开Spectre漏洞，必须对CPU设计进行修改才能避免。

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

微指令、韌體更新 
對於幽靈的變體2——分支目標註入，除了軟體的規避阻擋措施外，還至少需要受影響的處理器獲得微指令更新或韌體修復程式。受缺陷影響最大的英特爾已經為新近出貨和一些較老的處理器推出微碼更新，但是該措施通常需要主機板廠商的配合，以便將處理器廠商提供的微碼更新整合至其主機板的BIOS/UEFI韌體上，因此會出現一些較老的、早已不享有保固服務的主機板沒有獲得微指令更新的情況；而部分較老的處理器，也是未能獲得微碼更新。對於一些主機板廠商未有發佈帶微碼更新韌體，但處理器廠商已經推出微碼更新修復程式的，有的使用者會嘗試以更改主機板韌體的方式安裝微碼更新。

如果BIOS固件得不到更新，微碼更新也可以由Windows/Linux等作業系統進行。

英特爾在其新出貨的處理器上內建了對於阻擋利用該類缺陷進行攻擊的微碼更新，並在2018年下半年推出硬體層級上帶特權隔離措施和行程隔離的處理器產品；ARM則是發佈了針對受影響處理器核心的韌體修復程式；AMD儘管宣稱未受CVE-2017-5715的影響，但仍舊發佈了相應的微指令更新。

其它 
在Windows平臺上有軟體可偵測電腦硬體受Spectre、Meltdown影響的程度和修補狀態。

参考文献

外部链接 
 Meltdown和Spectre漏洞的官方网站 
 Spectre论文 
 Google Project Zero write-up 
 网络安全实践指南—CPU熔断和幽灵漏洞防范指引

参见 
 熔毁 (安全漏洞) - 英特尔微处理器中的硬件漏洞，允许未经授权的进程访问特权内存。
  - 动态随机存取存储器中的意外副作用，导致存储单元之间发生电气相互作用。

電腦安全
硬件漏洞
旁路攻击
X86架構
X86内存管理
程式錯誤
Intel x86處理器