幽靈漏洞

幽靈（Spectre）是一個存在於分支預測實現中的硬體缺陷及安全漏洞，含有預測執行功能的現代微處理器均受其影響，漏洞利用是基於時間的旁路攻擊，允許惡意進程獲得其他程序在映射記憶體中的資料內容。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獨立發現，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、部分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熔斷和幽靈漏洞防範指引

## 參見

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