幽灵漏洞

**幽靈**（英語：Spectre）是一個存在於分支預測實現中的硬體缺陷及安全漏洞，含有預測執行功能的現代微處理器均受其影響，漏洞利用是基於時間的旁路攻擊，允許惡意行程獲得其他程式在對映記憶體中的資料內容。Spectre 是一系列的漏洞，基於攻擊行爲類型，賦予了兩個通用漏洞披露 ID，分別是 CVE-2017-5753（bounds check bypass，邊界檢查繞過）和 CVE-2017-5715（branch target injection，分支目標註入），於 2018 年 1 月隨同另一個也基於推測執行機制的、屬於重量級資訊安全漏洞的硬體缺陷「Meltdown」（熔燬）一同公佈。由於該缺陷是推測執行機制導致的，加上不同處理器架構對推測執行又有不同的實作方式，因此這個缺陷無法獲得根源上的修復而只能採取「見招拆招」式的方法防範，而且因機制所致，各種解決方案還有不可預料的效能下降。

CVE-2017-5753 依賴於運行中的即時編譯（JIT）系統，用於 Javascript 的 JIT 引擎已被發現存在此漏洞。網站可以讀取瀏覽器中儲存的另一個網站的資料，或者瀏覽器本身的記憶體。對此 Firefox 57.0.4（部分）及 Chrome 64 通過為每個網站分配專用的瀏覽器程式來阻擋此類攻擊；作業系統則是通過改寫的編譯器重新編譯以阻擋利用該漏洞進行攻擊的行爲。

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

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

## 歷史

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 論文展示了完成攻擊的四個基本步驟：

1. 首先，論文闡述了在現代處理器中的，惡意程式可以通過程式內部的執行操縱分支預測邏輯，使得分支預測命中或者失敗的情況可以提前判斷。
2. 隨後展示了，可以可靠地對快取命中和未命中間的差異進行計時，因此，本來應該是簡單的非功能差異，實際卻可作為秘密信道，從無關資訊中提取行程的內部工作資訊。
3. 然後，論文以一個簡單的範例程式和一個在瀏覽器沙盒中執行的 JavaScript 片段為基礎，將結果與返回導向編程攻擊等原理進行綜合；在這兩種情況下，只需簡單使用由普通編譯器或現有瀏覽器中 JavaScript 引擎生成的代碼，利用其中條件分支的預測執行，受害者行程的整個位址空間（即執行中程式的內容）都將可讀。其基本思想是，在現有的代碼中尋找預測執行可能涉及到不可存取資料的地方，操縱處理器，使得預測執行必須觸及該資料的實際內容，然後對處理器的副作用計時，這時預取機制已經載入完成了一條快取線，結果就是存取這條快取線的資料速度會更快。
4. 最後，本文將這種攻擊一般化到受害行程的任何非功能狀態上。緊接著討論了甚至像匯流排仲裁延遲這樣非常不明顯的非功能性效應。

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 熔斷和幽靈漏洞防範指引 （頁面存檔備份，存於網際網路檔案館）（簡體中文）

## 參見

* 熔毀 (安全漏洞) - 英特爾微處理器中的硬體漏洞，允許未經授權的行程存取特權記憶體。
* 行錘擊 - 動態隨機存取記憶體中的意外副作用，導致儲存單元之間發生電氣相互作用。