NetSpectre:通過網絡讀取任意內存

摘要

推測執行是現代處理器能夠實現高性能的一個關鍵因素。在推測執行過程中,處理器可能會執行程序一般不會執行到的操作。如果推測執行被中止,這些操作對體系結構的影響和結果會被丟棄,但對微架構的影響可能會保留下來。最近公佈的Spectre攻擊就是利用這些保留下來的微架構狀態來讀取其他程序的內存內容。然而,Spectre攻擊需要在目標系統上進行某種形式的本地代碼執行。因此,只要攻擊者無法在目標機器運行任何代碼,該系統就被認爲是安全的。

在本文中,我們介紹了NetSpectre,一種通用的遠程Spectre變種1攻擊。爲此,我們展示了第一個通過網絡進行的遠程Evict+Reload緩存攻擊,每小時能泄露15bits數據。除了將現有的攻擊在網絡場景進行實現,我們還演示了第一個不使用緩存隱蔽信道的Spectre攻擊。相反,我們提出了一種新型的基於AVX的高性能隱蔽信道,並且在無緩存的Spectre攻擊中使用了這種隱蔽信道。我們的實驗表明,在實際中,基於AVX的隱蔽信道的遠程Spectre攻擊效果有明顯提升,每小時能從目標系統泄漏60bits數據。我們驗證了NetSpectre攻擊可以在局域網以及谷歌雲的虛擬機之間工作。

NetSpectre標誌着攻擊模式從本地到遠程的轉變,使得更多設備受到Spectre攻擊。現在,還必須在不運行任何可能由攻擊者控制的代碼的設備上考慮Spectre攻擊。我們證實,特別是在這種遠程情況下,基於較弱小工具的攻擊(不會泄漏實際數據)仍然非常有效,可以遠程破壞地址空間佈局隨機性。我們討論的幾個Spectre小工具比預期的功能更多,特別是我們設計的value-thresholding技術,它可以在沒有典型的位選擇機制的情況下泄露一個祕密值。我們概述了未來對Spectre攻擊和緩解措施研究的挑戰。

1. 導言

現代計算機在性能上進行了高度優化,然而,這些優化通常都會造成微架構狀態改變。側信道攻擊會觀察這些保留下來的狀態改變,並由此推斷出攻擊者通常無法獲取到的信息。基於軟件的側信道攻擊尤其令人不安,因爲它們不需要訪問物理設備。 這些攻擊中的許多攻擊都屬於微體系結構攻擊類別,它們利用由微體系結構要素引起的時間或行爲方面的差異。

在過去的20年中,基於軟件的微體系結構攻擊已從對密碼算法實現的理論攻擊演變爲更通用的實際攻擊,最近演變爲破壞內存和進程隔離的潛在威脅。Spectre是一種針對微體系結構的攻擊,它誘使另一個程序以推測方式執行指令序列,留下對微架構的狀態改變。 在迄今爲止展示的所有Spectre攻擊中,這些狀態改變是由於數據緩存(即傳統的緩存隱蔽信道)污染造成的時間差異。

在Spectre攻擊中被使用的推測執行是現代處理器能夠實現高性能的關鍵。現代處理器中的分支預測單元會做出合理的猜測,即選擇哪個分支,然後處理器按照分支的預測方向有選擇地執行預期的指令序列。通過操縱分支預測,Spectre可以誘騙目標進程執行一系列的內存訪問,這些訪問將機密從選定的虛擬內存位置泄露給攻擊者。 這完全破壞了機密性,並使受影響系統上的幾乎所有安全機制失效。 Spectre變種1是影響大量設備的一個變種,主要與邊界檢查後的錯誤推測有關,攻擊者首先執行諸如邊界檢查之類的操作,然後執行會對微體系結構狀態造成影響的代碼片段,這些代碼片段被稱爲“ Spectre 小工具”。

到目前爲止,Spectre攻擊已經在JavaScript和本地代碼中得到了證實,但是,任何允許時序測量足夠準確的環境以及某種形式的代碼執行都可能導致這些攻擊。對Intel SGX 飛地(enclaves)的攻擊表明,飛地(enclaves)也容易受到Spectre攻擊。然而,有數十億的設備從未運行過任何攻擊者控制的代碼,包括JavaScript、本地代碼,也沒有在目標系統上執行其他形式的代碼。目前,這些系統被認爲是安全的,可以抵禦這些Spectre攻擊。事實上,廠商們都確信這些系統仍然是安全的,並建議不對這些設備採取任何行動。

在本文中,我們介紹了NetSpectre,一種基於Spectre變種1的新攻擊,不需要攻擊者控制目標設備上的代碼,從而影響數十億設備。與本地的Spectre攻擊類似,我們的遠程攻擊需要在目標設備的代碼中存在Spectre 小工具。我們表明,在暴露的網絡接口或API中包含所需Spectre 小工具的系統可以通過我們的遠程Spectre攻擊進行攻擊,並允許攻擊者通過網絡讀取任意內存。攻擊者只需要向受害者發送一系列的請求,並測量響應時間,就可以從受害者的內存中泄露一個祕密值。

我們表明,一般來說,內存訪問延遲可以從網絡請求的延遲中反映出來。因此,我們證實了攻擊者有可能通過對更多的測量值進行處理和求平均值來遠程區分特定緩存行上的緩存命中和未命中。基於這一點,我們實現了第一個基於訪問的遠程緩存攻擊,Evict+Reload的遠程攻擊變體,稱爲Thrash+Reload。我們的遠程Thrash+Reload攻擊是之前對加密算法的遠程緩存定時攻擊的一個重大飛躍。我們推進了這項技術,將現有的Spectre攻擊應用到網絡的環境中。這種NetSpectre變種能夠從包含漏洞的目標系統中每小時泄露15比特。

通過利用以前未知的基於AVX2指令執行時間的側信道,我們還演示了第一個完全不依賴緩存隱蔽信道的Spectre攻擊。我們基於AVX的隱蔽信道在0.58%的錯誤率下實現了每秒125字節的本機代碼性能。通過在我們的NetSpectre攻擊中使用這種隱蔽信道而不是緩存隱蔽信道,我們實現了更高的性能。由於不再需要緩存驅逐,我們將局域網中目標系統的泄漏速度提高到每小時60比特。在谷歌雲中,我們可以從另一個獨立的虛擬機中每小時泄露3比特左右。

我們證實了使用以前被忽略的小工具可以在遠程攻擊中破解地址空間佈局隨機化。地址空間佈局隨機化(ASLR)是一種部署在當今大多數系統上的防禦機制,幾乎隨機化了所有地址。由於ASLR的目的主要是防禦遠程攻擊,而不是本地攻擊,所以本地代碼執行的攻擊者可以很容易地繞過ASLR。因此,到目前爲止,許多針對Spectre攻擊的較弱的小工具都被忽略了,因爲它們不允許泄露數據內容,而只是泄露地址信息。然而,在遠程攻擊場景下,這些較弱的小工具就變得非常強大。

Spectre小工具可以比之前工作中預期的更加靈活,這不僅在我們遠程ASLR攻擊中使用的較弱的小工具中表現得明顯,而且在我們提出的值閾值(value-thresholding)技術上更明顯。值閾值技術並沒有使用經典的在以前的Spectre攻擊中看到的位選擇和內存引用機制,相反,值閾值技術直接利用比較中的信息泄漏,使用類似於二進制搜索的分治法。NetSpectre標誌着從本地攻擊到遠程攻擊的模式轉變。

NetSpectre標誌着從本地攻擊向遠程攻擊的轉變,這顯著擴大了Spectre攻擊的影響範圍,並增加了受影響設備的數量。特別地,那些沒運行不受信任攻擊者控制的代碼的設備也需要考慮是否存在Spectre安全威脅,這表明以前被認爲安全的這些設備也必須採取措施。 我們提出了一種有更清晰結構的替代品Retpolines。 未來對Spectre攻擊和修復的研究面臨着一系列挑戰,即:當前的防禦措施只能是臨時的解決方案,因爲它們只能解決表面問題,而不能解決根本問題。

本文的貢獻是:

  1. 我們介紹了NetSpectre,一個通用的遠程Spectre變種1攻擊。爲此,我們展示了第一個通過網絡訪問實現的遠程緩存攻擊(Evict+Reload),作爲NetSpectre的構建模塊。

  2. 我們展示了第一個不利用緩存的Spectre攻擊。取而代之的是,我們提出了一種新的基於AVX的高性能隱蔽通道,它極大地提高了遠程Spectre攻擊的性能。

  3. 我們表明,即使是較弱的本地Spectre攻擊小工具,無法泄露實際數據,但在遠程Spectre攻擊中仍然非常強大,可以在設備上不執行任何代碼的情況下遠程破解ASLR機制。

  4. 我們表明,Spectre小工具可以比預期更通用。我們的 值-閾值技術 允許獲取一個祕密值,而無需典型的位選擇和內存參考機制。

本文的其餘部分組織如下。在第2節中,我們提供了關於推測執行和微架構攻擊的背景。在第3節中,我們提供了NetSpectre攻擊的完整概述。在第4節中,我們展示瞭如何構建用於NetSpectre攻擊的遠程微架構隱蔽信道。在第5節中,我們展示瞭如何將這些構件組合起來,通過網絡提取內存內容。在第6節中,我們評估了我們攻擊的性能。在第7節中,我們討論了針對本地和基於網絡的Spectre攻擊的對策,並概述了未來研究的挑戰。在第8節中,我們進行了總結。

2. 背景資料

在本節中,我們將討論亂序執行和亂序執行的一個子集:推測執行。我們詳細介紹了分支預測,這是大多數推測執行。最後,我們將討論已知的微體系結構側信道攻擊以及我們在用例中使用的更好的方案:SIMD指令。

2.1 亂序執行和推測執行

現代處理器並不是嚴格地一條指令接一條指令地執行,而是有多個執行單元並行運行,串行指令流分佈在這些執行單元上,從而使空閒的處理器資源減少。爲了保留在架構上定義的執行順序,處理器具有所謂的重排序緩衝區,該緩衝區可以對微操作進行緩衝(在架構級別上可見),直到它們執行完成後按照指令流定義的順序返回。 因此,亂序執行使處理器可以預先計算指令執行的結果並對微架構狀態產生影響。 像簡單的流水線處理器一樣,亂序執行處理器也會遭受中斷的困擾,因爲任何預先計算的結果和對微架構狀態的改變都必須捨棄。 但是,這僅限於體系結構可見狀態,微體系結構的狀態可能會被改變。 預先計算但不淘汰的指令稱爲暫態指令。

現代處理器上的亂序執行通常可以在架構上可見的狀態前運行幾百條簡單指令。實際數量取決於具體的指令和具體處理器上重排序緩衝區的大小。

幾乎每一個複雜軟件的指令流都不是純線性的,而是包含(有條件的)分支。因此,處理器往往不能提前知道該執行分支的哪個方向,即不知道後續指令的運行順序。在這種情況下,處理器使用預測機制來推測沿其中一條路徑執行指令。因此,推測性執行是亂序執行的嚴格子集。正確的預測可以提高處理器的性能和效率。不正確的預測需要丟棄錯誤預測後的任何預先計算的結果和對微體系結構狀態的影響。

2.2 分支預測

分支預測是最常見的預測機制,該機制導致推測執行。很自然,處理器的性能和效率會隨着預測的質量而提高。因此,現代處理器集成了許多分支預測機制。

英特爾處理器有 "直接調用和跳轉"、"間接調用和跳轉 "和 "條件分支 "的預測機制。這些預測機制在不同的處理器組件中實現,例如,分支目標緩衝區(BTB)、分支歷史緩衝區(BHB)和再轉棧緩衝區(RSB) 。這些緩衝器可結合使用,以獲得良好的預測效果。由於分支預測邏輯通常不在物理核之間共享,所以處理器只從同一核上以前的分支執行中學習。

2.3 微架構攻擊

大多數微架構優化都依賴於處理後的數據或其位置。因此,觀察優化的效果(例如,更快的執行時間)會泄露信息,例如,關於數據或其位置的信息。

傳統上,微架構攻擊分爲兩類:側信道攻擊,屬於非破壞性攻擊(被動);故障攻擊,屬於破壞性攻擊(主動)。側信道攻擊(Side-channel attacks)通常用於構建隱蔽信道,即連接雙方通過側信道進行通信。微架構側信道攻擊最早是針對密碼算法的攻擊進行探索的。最近,通用的實用攻擊技術被開發出來,並被用於廣泛的攻擊目標,例如:Flush+Reload。

微架構攻擊通常被認爲是基於軟件的攻擊,與傳統的側通道攻擊和需要物理訪問設備的故障攻擊不同。微架構故障攻擊最突出的例子是Rowhammer,這是現代DRAM的一個硬件漏洞。Rowhammer使非特權攻擊者能夠修改特權DRAM內存位置。

Meltdown和Spectre是最近的兩種微架構攻擊。它們都使用隱蔽信道來傳輸祕密數據,但攻擊本身並不是側信道攻擊。由於它們是非破壞性的,所以它們似乎不屬於這兩種類型。

Meltdown是一個存在於許多現代處理器中的漏洞。它是一系列攻擊的基礎,這些攻擊都繞過了用戶可訪問頁表位(對內核頁設置爲0)提供的隔離,例如,在Meltdown之前獨立發現的針對KASLR的攻擊。完整的Meltdown攻擊允許攻擊者讀取任意內核內存。

幽靈攻擊利用了大多數現代處理器中存在的推測執行機制。因此,它們並不依賴於任何漏洞,而僅僅依賴於優化策略。通過操縱分支預測機制,攻擊者誘使受害者進程執行攻擊者選擇的代碼小工具。這使得攻擊者能夠建立一個從受害者進程中的推測執行到攻擊者控制的接收者進程的隱蔽信道。

2.4 緩存攻擊

最重要的一類微架構攻擊是緩存攻擊。緩存攻擊利用小的內存緩衝區(稱爲緩存)引入的時序差異。這些CPU緩存通過在小而快的處理器內存儲器中緩衝經常使用的數據來降低內存訪問延遲。現代CPU有多個緩存級別,這些緩存要麼是每個核心的私有緩存,要麼是跨核心共享的緩存。

緩存側信道攻擊是最早的微架構攻擊。過去已經提出了不同的緩存攻擊技術,包括Evict+Time、Prime+Probe和Flush+Reload。這些攻擊的變種例如Evict+Reload,以及Flush+Flush。Flush+Reload攻擊及其變種工作在緩存行粒度上,因爲它們依賴於共享內存。共享內存中的任何緩存行都將是包含末級緩存中的共享緩存行。在Flush+Reload攻擊中,攻擊者不斷刷新目標內存位置,並測量重新加載數據所需的時間,如果重載時間較低,攻擊者就會得知另一個進程已經將緩存行加載到緩存中。各種Flush+Reload攻擊已經被證實,例如,對加密算法、Web服務器函數調用、特定系統活動、用戶輸入和內核尋址信息的攻擊。Prime+ Probe遵循類似的原理,但只有一個緩存集的粒度。它的工作原理是佔用內存地址,並測量它們何時從緩存中被驅逐。因此,Prime+Probe攻擊不需要任何共享內存。各種Prime+Probe攻擊已經被證實,例如,對加密算法、用戶輸入和內核地址信息的攻擊。

緩存時序側信道在遠程時序攻擊中也得到了證實。Bernstein提出了一種針對AES算法簡單實現的遠程定時攻擊。基本的時序差異是由算法中的內部衝突引起的,與之對應的是AES計算過程中緩存未命中的次數。隨後,許多學者發表了一些改進和重現這種攻擊的論文。

側信道攻擊的一個特殊用例是隱蔽信道。在隱蔽信道中,攻擊者同時控制着觸發側信道狀態變化的部分和測量側信道狀態的部分。這種攻擊可以用來將信息從一個安全域泄露到另一個安全域,同時繞過任何存在於架構層面或以上的隔離。Prime+Probe和Flush+Reload都已經被用於高性能的隱蔽信道中。Meltdown和Spectre內部使用隱蔽信道將數據從瞬時狀態轉化爲持久化狀態。

2.5 SIMD指令

SIMD(單指令多數據)指令允許對多個數據值進行並行操作。SIMD指令作爲指令集擴展可在多種現代處理器上使用,例如,英特爾MMX擴展、AMD 3DNow!擴展以及ARM VFP和NEON擴展。在英特爾上,一些SIMD指令由處理器內核內的專用SIMD單元處理。然而,爲了避免浪費能源,SIMD單元在不使用時會被關閉。因此,要執行這類SIMD指令,首先要給SIMD單元上電,這會在前幾條SIMD指令上引入一個小的延遲。Liu提到,一些SIMD指令可以用來改善總線競爭隱蔽信道,因爲它們可以實現更直接地內存總線訪問。然而,到目前爲止,SIMD流指令還沒有被用於純SIMD隱蔽信道或側信道攻擊。

2.6 高級持續性威脅

現代硬件和軟件的複雜性不斷增加,這也現象也適用於惡意軟件,特別是像Stuxnet、Duqu或Flame這樣有針對性的惡意軟件,已被證實是極難檢測的,它們可以在目標系統或網絡上持續存在數週或數月。因此,這種惡意軟件也被稱爲 "高級持續性威脅"(APTs) 。在這種情況下,每天傳輸幾比特到字節的慢速隱蔽信道(例如,氣隙隱蔽信道)也是非常實用的,因爲它們可能會運行很長時間。APTs通常是一組具體的利用組合,通過繞過不同的安全機制來實現一個總體目標。

2.7 地址空間佈局隨機化

現代操作系統中存在的一種安全機制是地址空間佈局隨機化(ASLR)。它隨機化內存中對象或區域的位置,例如堆對象和棧,使攻擊者無法預測正確的地址。從本質上講,這是一種概率方法,但是在實踐中它可以顯著提高安全性。ASLR的主要目的是防禦控制流劫持攻擊,但它也使其他遠程攻擊變得困難,因爲攻擊者必須提供一個特定的地址。

3. 攻擊概述

在本節中,我們用一個簡單的例子來講述NetSpectre攻擊。NetSpectre攻擊由兩個NetSpectre小工具組成:一個泄密小工具和一個傳輸小工具。我們討論了這兩個小工具的作用,它們允許攻擊者在不執行或訪問任何本地代碼的情況下進行Spectre攻擊。我們根據NetSpectre小工具的類型(泄漏或傳輸)和它們所使用的微架構元素(如緩存)來詳細討論它們。

Spectre攻擊會誘導受害者推測性地執行在程序指令嚴格序列化有序處理中不會發生的操作,這些操作會將受害者的機密信息通過隱蔽信道泄露給攻擊者。Spectre的變體1通過錯誤地訓練一個條件分支,如邊界檢查,誘導受害者進行推測性性執行。Spectre的變體2通過惡意注入地址到分支目標緩衝區,誘導受害者進行推測性性執行。雖然我們的方法可以利用任何Spectre變種,但我們專注於Spectre變種1,因爲它是最普遍的。此外,根據英特爾公司的說法,與Meltdown和Spectre變種2相比,變種1不會在即將到來的新一代CPU硬件中被修復。

在知道實際條件之前,CPU會預測條件最可能的結果,然後繼續進行相應的代碼路徑。在評估時不知道條件的結果有幾種原因,例如,部分條件的緩存遺漏,尚未滿足的複雜依賴關係,或者所需執行單元的瓶頸。通過隱藏這些延遲,如果條件預測正確的話,推測性執行會導致更快的整體執行速度(提升性能)。如果條件預測錯誤,執行的中間結果根本不會被提交到架構狀態,最終效果好像處理器從未執行任何推測性執行。然而,在推測性執行過程中發生的任何微結構狀態的修改,如緩存狀態,都不會被還原。

由於我們的NetSpectre攻擊是通過網絡安裝的,所以受害者設備需要一個攻擊者可以到達的網絡接口。攻擊者必須能夠向受害者發送大量的網絡數據包。但是,這些數據包不一定要在很短的時間內。此外,在我們的攻擊中,數據包的內容不需要由攻擊者控制。

與本地Spectre攻擊相比,我們的NetSpectre攻擊並不是分爲兩個階段。相反,攻擊者不斷地通過操作來誤導處理器,使其不斷地運行到可利用的錯誤推測性執行中。NetSpectre不會跨越進程邊界進行錯誤訓練,而是通過將有效值和無效值交替傳遞到暴露的接口進行就地訓練,例如有效和無效的網絡數據包。對於我們的NetSpectre攻擊,攻擊者需要兩個Spectre小工具,這兩個小工具每收到一個網絡數據包就會被執行:一個泄密小工具和一個傳輸小工具。泄密小工具以攻擊者控制的索引訪問位流,並根據所訪問位的狀態更改某些微體系結構狀態。傳輸小工具執行一個任意操作,其執行時間取決於泄密小工具修改的微結構狀態,隱藏在大量的噪聲中,攻擊者可以觀察到網絡數據包響應時間中的這種時間差。Spectre小工具在現代網絡驅動程序、網絡堆棧和網絡服務實現中很常見。

爲了說明我們的NetSpectre攻擊的工作原理,我們在一個經過調整的場景中考慮一個類似於原始Spectre變種1的基本例子:list1中的代碼是一個函數的一部分,當收到一個網絡數據包時,這個函數就會被執行。我們假設x是由攻擊者控制的,例如,數據包頭中的一個字段或某個API的索引。這段代碼構成了我們的泄密小工具。

代碼片段以對x的約束檢查開始,這是開發安全軟件時的最佳做法。特別是,這個檢查可以防止處理器讀取 bitstream 之外的敏感內存。否則,一個越界的輸入x可能會觸發一個異常,或者可能導致處理器通過提供x=(要讀取的祕密位的地址)-( bitstream 的基本地址)來訪問敏感內存。

  1. 攻擊者發送多個網絡數據包,使攻擊者選擇的x的值總是在邊界內。這樣可以訓練分支預測器,增加分支預測器預測比較結果爲真的機會。
  2. 攻擊者發送一個x超過 bitstream 的數據包,使得bitstream[x]是目標內存中的一個祕密位。
  3. 根據最近的條件分支結果,分支預測器會假設邊界檢查爲真,並推測性地執行內存訪問。

雖然在條件的正確結果被計算出來後,架構狀態的變化不會被提交,但微架構狀態的變化不會被還原。在list1中的代碼中,這意味着雖然flag的值沒有改變,但flag的緩存狀態會改變。只有當bitstream[x]處的祕密位被設置,flag纔會被緩存。

傳輸小工具就簡單多了,因爲它只需要在任意操作中使用flag。因此,小工具的執行時間將取決於flag的緩存狀態。在最簡單的情況下,傳輸小工具只是返回flag的值,而flag的值是由泄密小工具設置的。由於x越界的,flag的架構狀態(即其值)不會發生變化,所以不會泄露祕密信息。但是,傳輸小工具的響應時間取決於flag的微觀架構狀態(即是否被緩存),它確實會泄露一個祕密位。

爲了完成攻擊,攻擊者要測量每一個祕密位泄露的響應時間。由於響應時間的差異在納秒範圍內,攻擊者需要對大量的測量結果求平均值,以獲得具有一定可信度的祕密值。事實上,我們的實驗表明,當進行大量測量時,微結構狀態的差異會變得明顯。因此,攻擊者可以先測量兩種極端情況(即緩存和未緩存),之後,爲了提取真正的祕密位,進行儘可能多的測量,以足夠的可信度來區分是哪種情況,例如,使用閾值或貝葉斯分類器。

我們將泄密小工具和傳輸小工具這兩個小工具稱爲NetSpectre小工具。運行NetSpectre小工具可能需要發送一個以上的數據包。此外,可以通過不同的獨立接口來訪問泄密小工具和傳輸小工具,也就是說,攻擊者必須可以訪問這兩個接口。圖1 說明了兩種類型的小工具,本節後面將詳細介紹。

3.1 小工具位置

攻擊目標的集合取決於NetSpectre小工具的位置。 如圖2所示,從總體上講,有兩個不同的小工具位置:小工具位於用戶空間或內核空間中。

3.1.1 內核缺陷

網絡驅動程序通常是在操作系統的內核中實現的,可以是一個固定的組件,也可以是一個內核模塊。無論在哪種情況下,當收到網絡數據包時,內核代碼都會被執行。如果在處理網絡數據包的過程中處理的任何內核代碼都包含NetSpectre小工具,即攻擊者控制的數據包的一部分被用作索引來引用位,那麼NetSpectre攻擊就有可能發生。

對內核代碼的攻擊是特別強大的,因爲內核不僅有內核內存映射,通常還有整個物理內存。在Linux和macOS上,物理內存可以通過直接物理映射來訪問,即每個物理內存位置都可以通過內核地址空間中預定義的虛擬地址來訪問。Windows不使用直接物理映射,而是維護內存池,通常也會映射很大一部分物理內存。因此,利用內核中的NetSpectre小工具進行NetSpectre攻擊,一般來說可以泄露存儲在內存中的任意位。

3.1.2 對用戶空間的攻擊

通常情況下,網絡數據包不僅由內核處理,而且會傳遞給用戶空間的應用程序,由其處理數據包的內容。因此,不僅是內核,用戶空間應用程序也可能包含NetSpectre小工具。事實上,當網絡數據包到達時,數據包經過路徑上所有被執行的代碼都可能是NetSpectre小工具,這包括服務器端和客戶端的代碼。

攻擊用戶空間應用的一個優勢是攻擊面大大增加,因爲很多應用都在處理網絡數據包,特別是在服務器上,有大量的服務在處理用戶控制的網絡數據包,例如,Web服務器、FTP服務器或SSH守護進程。同時,遠程服務器也可以攻擊客戶機,例如,通過Web套接字,或SSH連接。與對內核空間的攻擊相反,一般來說,對內核空間的攻擊可以泄露系統內存中存儲的任何數據,而對用戶空間應用程序的攻擊只能泄露被攻擊應用程序的祕密數據。

這種特定應用的祕密數據包括應用本身的祕密數據,如憑證和密鑰數據。因此,利用應用程序中的NetSpectre小工具進行的NetSpectre攻擊可以訪問應用程序處理的任意數據。此外,如果受害者是一個多用戶的應用程序,例如,一個Web服務器,它也包含了多個用戶的祕密數據。特別是對於流行的網站,這很容易影響到數千或數百萬用戶。

3.2 小工具類型

現在我們討論不同的NetSpectre小工具,即將祕密數據位編碼到微架構狀態的泄密小工具和將微架構狀態傳輸給遠程攻擊者的傳輸小工具。

3.2.1 泄密小工具

第一種類型的小工具,即泄密小工具,通過改變一個微結構狀態來泄漏祕密數據,這取決於一個內存位置的值,而這個位置是不能通過攻擊者可以訪問的任何接口直接訪問的。需要注意的是,這種狀態變化發生在受害者設備上,並不能通過網絡直接觀察到。

一個泄漏小工具可以泄漏一個bit位,甚至一個或多個字節。單比特小工具是最通用的,存儲一個bit(二進制)的狀態可以用許多微結構狀態來完成,因爲只需要區分兩種情況(參見第4節)。Kocher等人用一個字節的小工具泄露了祕密數據,這簡化了對祕密數據的訪問,因爲只需要使用字節索引,但使恢復過程複雜化,因爲需要區分256種狀態。對於本地Spectre攻擊,恢復過程是由攻擊者來實現的,因此複雜的恢復過程沒有任何問題,僅僅是性能比較低,因爲在隱蔽信道的接收側必須進行很多次側信道測試(如很多次Flush+Reload測試)。Lipp等人的研究表明,在類似的攻擊中,用單bit隱蔽信道進行失序執行的傳輸速度比用字節式或多字節隱蔽信道的傳輸速度要快很多。NetSpectre攻擊必須依靠小工具來實現恢復過程,大大減緩了傳輸速度。使用單bit小工具不僅有多個微架構元素可供選擇,而且數據恢復起來也比較容易,同時,由於隱蔽信道傳輸需要進行的遠程側信道測試較少,數據傳輸速度也比較快。因此,我們在本文中重點研究單bit泄漏小工具。單bit泄漏小工具可以簡單到如list1 所示。在這個例子中,如果攻擊者選擇的位置的位被設置,則會緩存一個值(flag)。如果該位沒有被設置,則該變量的緩存狀態保持不變,也就是說,如果該變量之前沒有被緩存,則不會被緩存。因此,攻擊者可以利用這個小工具將祕密bits泄露到微結構狀態中。

3.2.2 傳輸小工具

與Spectre不同,NetSpectre需要一個額外的小工具來傳輸泄露的信息給攻擊者。由於攻擊者並不控制受害者設備上的任何代碼,攻擊者無法實現恢復過程,即把微架構狀態轉換回架構狀態。此外,架構狀態通常無法通過網絡訪問,因此,即使小工具將微架構狀態轉換爲架構狀態也無濟於事。

從攻擊者的角度來看,微結構狀態必須在網絡上變得可見。這不僅可以通過直接傳輸網絡數據包的內容實現,還可以通過側信道影響實現。事實上,微結構狀態在某些情況下會變得對攻擊者可見,例如,響應時間。我們將基於網絡的向攻擊者暴露微結構狀態的代碼片段稱爲傳輸小工具,它可以被攻擊者觸發,當然,傳輸小工具必須位於受害者設備上。有了傳輸小工具,微結構狀態的監測就發生在遠程機器上,但微結構的狀態通過網絡可訪問的接口暴露出來。

在最初的Spectre攻擊中,Flush+Reload被用來將微架構狀態轉移到架構狀態,然後被攻擊者讀取,從而泄露祕密。最理想的情況是,如果受害者主機有這樣一個Flush+Reload的小工具,並且可以通過網絡觀察到架構狀態。然而,由於不太可能在受害者主機找到一個可利用的Flush+Relo小工具並訪問架構狀態,因此不能簡單地將常規的Spectre小工具修改成NetSpectre攻擊。

在最直接的情況下,通過網絡數據包的延遲,微架構狀態對於遠程攻擊者來說是可見的。list1 中所示的泄漏小工具的一個簡單的傳輸小工具只是訪問變量flag。網絡數據包的響應時間取決於變量的緩存狀態,也就是說,如果變量被訪問了,響應的時間就會減少。一般來說,如果這種差異是可以通過網絡測量的,那麼攻擊者就可以觀察到微結構狀態的變化。

4. 遠程微架構隱蔽信道

如上一節所述,NetSpectre攻擊的關鍵是建立一個微架構的祕密通道,將信息暴露給遠程攻擊者。由於在我們的方案中,攻擊者不能在目標系統上運行任何代碼,我們假設傳輸任務是通過一個傳輸小工具發生的,其執行可以被攻擊者觸發。在本節中,我們演示了第一種基於遠程訪問的緩存攻擊:Thrash+Reload(Evict+Reload的一個變種)。我們表明,通過這種遠程緩存攻擊,攻擊者可以建立一個從目標設備上的推測性執行到攻擊者機器上的遠程接收端的祕密通道。此外,我們還提出了一種以前未知的基於AVX2指令的微架構隱蔽通道,這種隱蔽通道可以用於NetSpectre攻擊,傳輸速率比遠程緩存隱蔽通道更高。

4.1 遠程緩存隱蔽信道

Kocher等人利用緩存作爲微架構元素對泄露的數據進行編碼。這就可以利用常見的緩存側通道攻擊(如Flush+Reload或Prime+Probe)來推斷微架構狀態,從而推斷出編碼的數據。

然而,並不是只有緩存纔會保留這些可以在架構層面變得可見的微觀架構狀態。從DRAM、BTB或RSB等元素中提取微架構狀態的方法是已知的。一般來說,每個微架構隱蔽信道的接收器都可以用來將微架構狀態轉移到架構狀態。

利用緩存來發起Spectre攻擊有三大優勢:存在有效的方法使緩存狀態可見,許多操作會修改緩存狀態,因此在緩存中可見,並且,緩存命中和緩存未命中之間的時間差距比較大。Flush+Reload通常被認爲是最細粒度、最精確的緩存攻擊,噪聲幾乎爲零。如果Flush+Reload不適用於某個場景,Prime+Probe被認爲是另一個最佳選擇。因此,目前公佈的所有Spectre攻擊都使用Flush+Reload或Prime+Probe的。

爲了建立我們的第一個NetSpectre攻擊,我們需要調整針對本地緩存的隱蔽信道技術。我們不直接測量內存訪問時間,而是測量使用相應內存位置的網絡請求的響應時間。因此,響應時間將受到用於攻擊的變量的緩存狀態的影響。由於內存訪問速度比較快,因此緩存狀態導致的響應時間差異將在納秒範圍內。

網絡延遲受很多因素的影響,導致結果有噪聲,但是,通過對大量網絡數據包求平均值,可以降低噪聲的影響。因此,攻擊者需要對大量的測量結果求平均值,以獲得可信度能被接受的祕密值。

圖3 顯示,當進行大量測量時,微架構狀態的差異確實可見。兩種分佈的平均值用虛的垂直線來表示。攻擊者可以在測量值上使用分類器,或者先測量兩種極端情況(緩存和未緩存),以獲得真實測量值的閾值。

但是,由於測量會破壞緩存狀態,即變量總是在第一次測量後被緩存,因此攻擊者需要一種方法來驅逐(或刷新)緩存中的變量。由於受害者不可能直接提供一個接口來刷新或驅逐變量,攻擊者不能使用衆所周知的針對高速緩存攻擊方法,而只能採用更粗糙的方法。我們不採用Evict+Reload中的定向驅逐,而是簡單地驅逐整個末級緩存,類似於Maurice等人的做法。因此,我們稱這種技術爲Thrash+Reload。爲了在不執行代碼的情況下對整個末級緩存進行驅逐,我們又必須使用一個通過網絡訪問的接口。最簡單的形式是,從受害者向攻擊者發送的任何數據包,例如文件下載,都有機會從緩存中驅逐變量。

圖4 顯示了通過向受害者程序請求文件,從最後一級緩存中驅逐特定變量(即flag變量)的概率。受害者程序運行在Intel i5-6200U上,末級緩存爲3MB。下載一個590KB的文件就足以驅逐變量,概率≥99%。

有了區分緩存命中和未命中的機制,以及從緩存中泄露東西的機制,我們就擁有了緩存側通道攻擊或緩存隱蔽通道所需的所有構件。Thrash+Reload在網絡接口上結合了這兩種機制,形成了第一個遠程緩存隱蔽通道。在我們的局域網實驗中,我們實現了高達4比特/分鐘的傳輸速率,錯誤率<0.1%,這比本地原生環境下的緩存隱蔽信道要慢得多,例如,最類似的攻擊(Evict+Reload)的性能達到了13.6 kb/s,錯誤率爲3.79%。

在本文中,我們使用遠程緩存隱蔽信道進行遠程Spectre攻擊。遠程緩存隱蔽信道,尤其是遠程緩存側信道攻擊是一個有趣的研究方向,之前提出的許多攻擊如果能夠通過網絡接口發起,這將是毀滅性的。

4.2 基於AVX的遠程隱蔽信道

爲了證明第一個不依賴緩存作爲微架構元素的Spectre變體,我們需要一個隱蔽信道,該信道允許將信息從推測性執行傳輸到架構狀態。因此,我們建立了一個基於AVX2指令時序差異的新型隱蔽信道。這種隱蔽信道具有低錯誤率和高性能的特點,與遠程緩存隱蔽信道相比,它可以使我們的NetSpectre攻擊性能得到顯著提升。

爲了省電,CPU可以關閉AVX2單元的上半部分電源,該單元用於對256位寄存器進行操作,一旦執行一條使用256位值的指令,該單元的上半部分就會被上電,如果該單元被使用不超過1ms,則會再次斷電。

當上半部分電源關閉時,執行256位操作會產生顯著的性能下降。例如,我們測量了在英特爾i5-6200U上對兩個256位寄存器(VPAND)進行簡單的位與位之間的AND操作的執行情況(包括測量開銷)(參見圖5)。如果上半部分處於激活狀態,則該操作平均需要210個週期,而如果上半部分處於關閉狀態(即處於非激活狀態),則該操作平均需要576個週期,結果相差366個週期。這個差值甚至比緩存命中和未命中的差值還要大,在同一系統中,緩存命中和未命中的差值只有160個週期。因此,AVX2指令的時序差比緩存命中和未命中的時序差更有利於遠程微架構攻擊。與緩存類似,讀取AVX2指令的延遲也會破壞編碼信息。因此,攻擊者需要一種重置AVX2單元的方法,即關閉上半部分的電源。與緩存相比,這要簡單得多,因爲AVX2單元的上半部分在閒置1ms後會自動斷電。因此,攻擊者在下一次測量前只需等待至少1ms。

圖6 顯示了一條256位的AVX2指令(特別是VPAND)在AVX2單元不活動後的執行時間。如果不活動時間短於0.5ms,即最後一條AVX2指令的執行時間不超過0.5ms,那麼在執行使用AVX2單元上半部分的AVX2指令時,不會有性能損失。在這之後,AVX2單元開始斷電,會增加任何後續AVX2指令的執行時間,因爲該單元必須再次上電,並且在此期間只模擬AVX2。AVX2單元在大約1ms後完全斷電,如果在這種狀態下執行任何AVX2指令,會導致最高的性能損。

利用AVX2的泄漏小工具與利用緩存的泄漏小工具類似。list2 顯示了一個AVX2泄漏小工具的示例(僞)代碼。_mm256_instruction表示一個任意的256位AVX2指令,例如:_mm256_and_si256。如果bitstream中被引用位x被設置,則指令被執行,因此,AVX2單元的上半部分被通電。如果分支預測結果不正確,並且AVX2指令在推測性執行期間被訪問,也是如此。注意,AVX2指令與bitstream或索引之間沒有數據依賴,只有AVX2指令是否被執行的信息纔會被用來通過隱蔽信道傳輸祕密bit信息。

傳輸小工具和緩存的傳輸小工具類似。任何使用AVX2指令的函數,以及因此在網絡上可以觀察到的可測量的運行時間差異,都可以被用作傳輸小工具。即使是 list2 中所展示的泄漏小工具也可以作爲傳輸小工具。通過爲x提供一個有效範圍內的值,函數的運行時間取決於AVX2單元上半部分的狀態。如果單元的上半部分之前被使用過(即'1'-bit被泄露),那麼函數的執行速度比上半部分之前沒有被使用(即'0'-bit被泄露)的速度要快。

有了這些組件,我們可以建立一個基於AVX的祕密信道。我們的隱蔽信道是第一個純AVX隱蔽信道和第一個基於AVX的遠程隱蔽信道。在本地實驗環境中,我們實現了125 B/s的傳輸速率,錯誤率爲0.58 %,在局域網中,我們實現了8 B/min的傳輸速率,錯誤率<0.1 %。我們可以看到,這個利用AVX2遠程隱蔽信道的真實傳輸速率高於遠程緩存隱蔽信道的真實傳輸速率,它能夠讓NetSpectre攻擊達到更高的數據泄露速率。

5. 攻擊變種

在本節中,我們將介紹兩種NetSpectre攻擊的變種。第一種攻擊允許從目標系統的內存中逐位提取祕密數據,第二種攻擊允許在遠程機器上打破ASLR機制,爲遠程利用ASLR提供方便。我們使用基於Spectre變種1的小工具來說明,當然,也可以用任何位於處理遠程數據包的代碼路徑中的Spectre小工具來實現。

5.1 從目標系統中提取數據

使用典型的 NetSpectre 小工具(參見第 3 節),提取過程包括 4 個步驟。請注意,雖然小工具不同,但泄漏小工具傳輸小工具可能是相同的。步驟如下:

  1. 誤導分支預測器,
  2. 重置微架構元素的狀態,
  3. 向微架構元素泄露一個bit位,
  4. 將微架構元素的狀態暴露在網絡上。

在步驟1中,攻擊者誤導了受害者的分支預測器,以運行Spectre攻擊。爲了誤導分支預測器,攻擊者藉助泄漏小工具的有效索引,確保分支預測器學會總是執行分支(即分支預測器推測條件爲真)。請注意,這一步只依賴於泄漏小工具,沒有反饋給攻擊者。因此,微結構狀態不必被重置或傳輸。

在步驟2中,攻擊者必須重新設置微架構狀態,以實現使用微架構元素對泄露的比特進行編碼。這一步高度依賴於所使用的微架構元素,例如,當利用緩存時,攻擊者從受害者那裏下載一個大的文件(參見圖4),如果使用AVX2,攻擊者只需等待1毫秒以上。在這一步之後,所有的要求都滿足了,就可以從受害者那裏泄露一個bit位。

在步驟3中,攻擊者利用Spectre漏洞從受害者那裏泄露一個bit位。由於在步驟1中,分支預測器被誤導,向泄漏小工具提供越界的索引將執行微架構下的微操作,並修改微結構元素,即在微結構元素中對bit位進行編碼。

第四步,攻擊者要通過網絡傳輸編碼信息。這一步相當於原始Spectre攻擊的第二階段。與原始的Spectre攻擊利用緩存攻擊不同,攻擊者在這一步中使用了第4節所述的傳輸小工具。攻擊者發送一個網絡數據包,由傳輸小工具處理,並測量從發送數據包到響應到達的時間。如第4節所述,這個往返時間取決於微結構元素的狀態,從而取決於泄漏的bit位。

由於網絡時延的變化,這四個步驟必須重複多次,以消除有由於網絡波動造成的噪聲。通常情況下,延遲的變化遵循一定的分佈,這取決於多種因素,如距離、跳數、網絡擁堵等。重複次數主要取決於網絡連接的延遲方差。因此,根據延時分佈,可以用統計方法推導出重複次數。在第6.1節中,我們對這種攻擊變體進行評估,併爲我們的攻擊設置提供根據經驗確定的次數。

5.2 遠程打破目標系統上的ASLR

如果攻擊者沒有機會接觸到泄露bit位的NetSpectre小工具,可以危害性較小的NetSpectre小工具,它不泄露實際數據,只泄露相應地址的信息。這樣的小工具對於已經有本地代碼執行的Spectre攻擊並沒什麼危害,因爲ASLR並不能防止本地攻擊。然而,在遠程場景下,破解ASLR是非常有價值的,如果在用戶空間程序中發現了這樣的NetSpectre小工具,就能破壞這個進程的ASLR。

list3 顯示了一個簡單的泄漏小工具,它已經足以破解ASLR。在這個小工具的幫助下,破解ASLR包括3個步驟:

  1. 誤導分支預測器,

  2. 訪問越界索引來緩存一個(已知的)內存位置,

  3. 通過網絡測量函數的執行時間,以推斷越界訪問是否緩存了一部分。

誤導訓練步驟與任何Spectre攻擊中的相同,會導致相對於數組的推測性越界訪問。如果攻擊者在誤導訓練之後爲x提供了一個越界值,那麼這個索引處的數組元素就會被推測性地訪問。假設使用一個字節數組和一個(無符號)64位的索引,攻擊者可以(推測地)訪問任何內存位置,因爲如果基地址加上索引大於虛擬內存,索引會繼續從起始地址尋找。如果這個內存位置的字節是有效的、可緩存的,那麼在執行這個小工具後就會被緩存,因爲推測性執行會把相應的內存位置取到緩存中。因此,這個小工具允許緩存當前虛擬內存中有效的任意內存位置,即當前應用程序的每個被映射的內存位置。

攻擊者使用這個小工具來緩存一個已知位置的內存位置,例如,vsyscall頁面,它被映射到每個應用程序的相同虛擬地址。然後,攻擊者測量能夠訪問已被緩存內存位置的函數執行的時間,例如,舊版本的time或gettimeofday函數。如果函數執行得更快,越界數組索引實際上是緩存了這個函數所使用的內存位置,因此,從已知地址和數組索引的值,即與已知地址的相對偏移量,攻擊者可以計算出泄漏小工具的實際地址。

在Linux上,ASLR的熵爲30 b時,攻擊者需要檢查230種可能的偏移。由於KPTI(以前的KAISER)補丁,在用戶空間中,沒有其他接近vsyscall頁面的頁面被映射。因此,在230個可能的偏移中,只有一個有效的,因此是可緩存的偏移。我們可以通過二分搜索來尋找正確的偏移量,即推測性地嘗試將一半的可能偏移量加載到緩存中,並進行一次檢查。如果這一次是有效的,就說明可緩存的偏移量已被緩存,攻擊者選擇了正確的一半,否則,攻擊者就繼續加載另一半的偏移量。這就把打破ASLR需要的檢查次數減少到只有30次。

雖然vsyscall是一個遺留功能,但我們發現它在Ubuntu 17.10和Debian 9.4(Google Cloud上實例的默認操作系統)上仍然被啓用。此外,如果地址已知,可以使用任何其他函數或數據來代替vsyscall。如果知道泄漏小工具的地址,也可以用來去隨機化其他任何可以通過網絡測量其執行時間的函數。如果攻擊者知道內核中一個固定偏移的內存頁,該攻擊也可以在內核中的NetSpectre小工具上運行,以破壞KASLR。

6. 評估

在本節中,我們評估NetSpectre和我們的概念驗證實現的性能。第6.1節提供了一個定性的評估,第6.2節提供了NetSpectre攻擊的定量評估。在評估中,我們使用了筆記本電腦(英特爾酷睿i5-4200M、i5-6200U、i7-8550U),以及臺式電腦(英特爾酷睿i7-6700K、i7-8700K),谷歌雲平臺中未指定具體型號的基於Skylake的英特爾Xeon CPU,以及ARM Cortex A75。

6.1 泄露

爲了在不同的設備上評估NetSpectre,我們構建了一個受害者程序,該程序在所有測試平臺上都包含相同的泄漏小工具和傳輸小工具(參見第3節)。我們從受害者中泄露了已知值,以驗證我們的攻擊是否成功,並確定需要進行多少次測量。除了雲端設置,所有的評估都是在本地實驗室環境中完成的。我們在所有評估中使用了Spectre變種1,然而,其他Spectre變種也可以以同樣的方式使用。

6.1.1 臺式機和筆記本電腦

與本地Spectre攻擊(單次測量就已經足夠)相比,NetSpectre攻擊則需要大量的測量來區分具有一定可信度的bits數據。即使是在本地網絡上,也需要大約10萬次測量,才能將噪聲降低到可以清楚看到比特之間差異的水平。通過重複攻擊,噪聲被降低,使其更容易區分bits數據。

對於我們的本地攻擊,我們在受害者和攻擊者之間使用千兆網絡連接,這在本地網絡中是一個典型的場景,但也適用於專用服務器和虛擬服務器的網絡連接。我們測得網絡延遲的標準差爲15.6 µs。應用3σ準則,在至少88.8%的情況下,延遲與平均值偏差爲±46.8 µs。這比攻擊者想要測量的實際時序差大了近3個數量級,這也解釋了爲什麼需要進行大量的測量。

我們的概念驗證NetSpectre實現通過指定一個內存位流的越界索引,從受害者那裏泄露任意bits數據。圖7顯示了使用我們的概念驗證實現一個字節的數據泄漏。對於每個比特,我們重複測量了1 000 000次。雖然我們只在直方圖的最大值上使用了一個貝葉斯閾值,但我們可以清楚地區分 "0 "比特和 "1 "比特。更復雜的方法,例如機器學習方法,可能會進一步減少測量次數。

6.1.2 ARM設備

另外,在我們對ARM設備的評估中,我們使用了有線網絡,因爲在今天的無線連接中,網絡延遲差異太大。我們測試的ARM內核在網絡延遲方面的差異明顯較大。我們測得網絡延遲的標準差爲128.5 µs。同樣,利用3σ準則,我們估計至少有88.8%的測量值在±385.5 µs以內。

圖8顯示了從ARM Cortex A75受害者泄露的兩個bit位--'0'和'1'。即使延遲的差異較大,簡單的閾值化方法也可以分離直方圖的最大值。因此,該攻擊也適用於ARM設備。

6.1.3 雲計算實例

對於雲實例,我們在谷歌雲平臺上測試了我們的概念驗證實現。我們在同一區域創建了兩個虛擬機實例,一個作爲攻擊者,一個作爲受害者。對於這兩個實例,我們使用默認的Ubuntu 16.04.4 LTS作爲操作系統。
測量到的網絡延遲的標準差爲52.3 µs。因此,我們估計至少有88.8%的測量值在±156.9 µs的範圍內。我們通過在兩個實例之間運行NetSpectre攻擊來驗證我們可以成功泄露數據。
爲了適應網絡延遲較高的波動,我們將測量次數增加了20倍,即每個比特都被測量了20 000 000次。圖9顯示了谷歌雲實例上 "0 "bit和 "1 "bit的(平滑)直方圖。雖然仍然可以看到噪聲,但足以區分bits,從而從受害者雲實例中泄露任意bits數據。

6.2 NetSpectre 性能

爲了評估NetSpectre的性能,我們從目標設備中泄露了已知值。這使我們不僅可以確定攻擊者泄漏內存的速度,還可以確定位錯誤率,即預期的位錯誤數量。

6.2.1 本地網絡

在本地網絡上的攻擊能達到最好的性能,因爲網絡延遲的差異明顯小於互聯網上的差異(參見第6.1.3節)。在我們的實驗室設置中,我們每比特重複測量1 000 000次,以便能夠可靠地從受害者那裏泄漏字節。平均來說,泄漏一個字節需要30分鐘,相當於每個比特約4分鐘。使用AVX隱蔽通道而不是緩存,可以將泄漏整個字節所需的時間減少到只有8分鐘。

爲了打破ASLR,我們需要緩存隱蔽通道。平均來說,這可以在2 h內遠程打破隨機化。
我們在實驗中使用了 stress -i 1 -d 1,以模擬一個真實的環境。雖然我們本以爲我們的攻擊在完全空閒的服務器上效果最好,但我們並沒有看到適度的服務器負載帶來的任何負面影響。事實上,它們甚至略微提高了攻擊性能,其中一個原因是,較高的服務器負載會產生較多的內存和緩存訪問,從而促進了緩存的變化(參見第4節),而這正是我們攻擊的性能瓶頸。另一個原因是,較高的服務器負載可能會耗盡計算泄漏小工具中的邊界檢查所需的執行端口,從而增加了CPU執行條件的機會。

我們在本地網絡中的NetSpectre攻擊相對較慢。 但是,特別是專門的惡意軟件攻擊,例如APT,通常會在局域網中活躍數月之久。 在這樣的時間範圍內,攻擊者確實可以從同一網絡上的目標系統泄漏所有感興趣的數據。

6.2.2 雲網絡

我們使用Google Cloud上的兩個虛擬機實例評估了在雲環境中的性能。 這些虛擬機具有快速的網絡連接,我們將這兩個實例配置爲每個使用2個虛擬CPU,通過4Gbit / s的網絡連接。 在此設置中,我們對每bit位重複測量2000萬次,以獲得無錯誤的字節泄漏。 平均而言,緩存隱蔽信道泄漏一個字節需要8個小時,而使用AVX隱蔽信道需要3個小時。
儘管這比較慢,但它表明在公共雲中獨立實例之間進行遠程Spectre攻擊是可行的。 特別是,APT通常會運行數週或數月, 如此長的時間範圍顯然足以在雲環境中使用NetSpectre攻擊來泄漏敏感數據,例如加密密鑰或密碼。

7. 修復Sectre攻擊的挑戰

在本節中,我們將討論針對Spectre最先進的修復措施存在的侷限性,以及它們爲什麼不能完全防止NetSpectre攻擊。此外,我們還討論瞭如何在網絡層預防NetSpectre攻擊。最後,我們概述了未來對Spectre攻擊的研究以及Spectre修復措施的挑戰。

7.1 最新的Spectre攻擊對策

由於起源不同,Spectre變種1和變種2使用不同的對策來修復。英特爾發佈了微代碼更新,以防止Spectre變種2攻擊中典型間接分支的跨進程和跨權限誤導。沒有防止直接分支誤導的微代碼更新,因爲這很容易在運行過程中進行,即在相同的權限級別和相同的進程上下文中進行。對於Spectre變種1攻擊,已經提出了一系列純軟件的應對措施。

英特爾和AMD建議使用lfence指令作爲推測執行的隔離。這條指令必須在安全臨界檢查後插入,以停止投機性執行,但是,在每次邊界檢查中加入這條指令會有很大的性能開銷。

此外,我們的實驗表明,lfences確實可以阻止推測性執行,但不能阻止推測性代碼獲取和其他執行前發生的微架構行爲,如AVX功能單元的上電、指令緩存填充和TLB填充。根據我們的實驗,lfences確實可以對抗傳統的Spectre小工具,但並不能對抗我們在本文中使用的所有Spectre小工具,參見list2list3,它們可以通過執行前發生的微架構行爲泄漏信息。然而,我們相信有一些方法可以使用lfences的方式來修復數據泄漏。

Microsoft在其編譯器中實現了對易受攻擊的代碼路徑(即Spectre小工具)的自動檢測,以將推測障礙限制在這些小工具中。然而,Kocher表明,自動分析會遺漏很多小工具。由於微軟只對已知的小工具使用黑名單,編譯器不會自動保護許多小工具,特別是非典型的小工具(如破解ASLR的小工具)。

在Linux內核中,可被利用的小工具是藉助靜態代碼分析器手動識別的。與基於編譯器的方法也類似,這需要完全瞭解哪些代碼片段是可利用的。

最後,直到現在,人們還普遍忽視了間接分支誤導(Spectre變種2)也是可能的攻擊。然而,由於誤導訓練,攻擊的可能性更大。

7.2 網絡層的修復

由於NetSpectre是一種基於網絡的攻擊,所以不能只通過緩解Spectre來防禦,還要通過網絡層的對策來防禦。一個微不足道的NetSpectre攻擊很容易被DDoS保護檢測到,因爲從同一個源頭髮送了多個同樣的數據包。然而,攻擊者可以在每秒的數據包和每秒泄漏的bits數據之間選擇任何權衡。因此,可以簡單地將泄漏比特的速度降低到DDoS監控能夠檢測到的閾值以下。這對於任何試圖檢測正在進行的攻擊的監測都是如此,例如,入侵檢測系統。雖然理論上無法阻止攻擊,但在某些時候,攻擊變得不可行,因爲泄漏一個比特所需的時間嚴重增加。

緩解NetSpectre的另一種方法是在網絡延遲中加入人工噪聲。由於測量的次數取決於網絡延遲的方差,額外的噪聲需要攻擊者進行更多的測量。因此,如果網絡延遲的方差足夠高,NetSpectre攻擊就會因爲需要大量的測量而變得不可行。

這兩種方法在實踐中都可以減輕NetSpectre攻擊。然而,由於攻擊者可以適應和改進攻擊,因此,假設現在選擇的噪聲水平和監測閾值在不久的將來仍然有效是不安全的。

7.3 未來研究的挑戰

如前幾節所討論,Spectre攻擊被完全修復還有很長的路要走。目前提出的緩解措施只是解決了表象,而沒有直接解決根本原因,即性能和安全之間不恰當的權衡,導致了我們目前的推測性執行。我們確定了未來在Spectre攻擊和修復措施方面的5個挑戰(C1到C5)。

  • C1:小工具比預期的更通用。

    特別是我們用來破解ASLR的小工具到目前爲止還未被認爲是危險的。另外,我們使用的基於AVX的小工具到目前爲止也沒有被認爲是危險的。小工具也可能由許多小代碼組成,這些小代碼會傳遞祕密值,直到在以後的時候,祕密值被泄露給攻擊者。由於Spectre向攻擊者泄露信息的組件是一個隱蔽信道,似乎識別所有小工具的基本問題可以簡化爲識別所有祕密信道的問題。目前,我們還沒有識別系統中所有隱蔽信道的技術。

  • C2: 自動保護所有的小工具並非易事。

    對於Spectre變種1,我們提出的解決方案是使用推測障礙。由於我們不能指望每個開發人員都能識別出易受攻擊的小工具並正確地修復它們,因此最先進的解決方案會嘗試自動檢測易受攻擊的小工具並在編譯時修復它們。目前還不清楚靜態代碼分析是否足以檢測所有易受攻擊的小工具,尤其是當它們分散在各個函數中時。在這種複雜的情況下,動態分析可能會帶來更好的結果。然而,動態分析自然存在不完全性,因爲在動態分析中可能無法達到程序的某些部分。此外,編譯器產生的Spectre小工具有可能在源代碼中不可見,例如,雙倍取數錯誤就可能發生。這就很難在前期被發現,完全破壞了採取的安全措施。

  • C3:黑名單本質上是不完整的。

    目前的方法依靠黑名單來自動修補可利用的小工具。然而,這意味着我們確切地瞭解哪些代碼片段是可利用的,哪些不是。正如本文所顯示的,小工具可能看起來與預期的不同,這表明了黑名單方法的不完整性。從反面考慮可能是一個更好的方向,即使用(可證明的)不可利用的小工具的白名單而不是黑名單。不過,這需要大量的研究來證明代碼碎片的不可開發性。

  • C4:跨進程和跨權限級別的誤導比原地誤導更容易解決。

    目前的對策主要是爲了防止跨進程邊界,特別是跨權限級別的Spectre攻擊。然而,正如本文所示,如果誤導訓練發生在同一進程內部,這種對策是無效的。這種方法不僅適用於Spectre變種1,也適用於Spectre變種2。Retpoline是目前唯一能防止這些Spectre變種2攻擊的修復措施,它能有效地阻止處理器的任何進一步推測。然而,Retpoline並不是一個完美的解決方案,因爲它會產生巨大的性能開銷,並增加另一個側信道。

    如果攻擊者只能在同一進程內污染具有有效分支目標的分支,即應用了所有的微代碼更新,Retpoline可以被我們提出的一個更簡單的構造所取代。我們提議在每個可能的調用目標處插入推測障礙。這比用Retpolines的結構更清晰。因此,每個錯誤的間接調用都會在實際執行代碼之前立即中止。對於直接調用,編譯器可以跳過猜測障礙,以減少性能影響。不過,這個解決方案和Retpoline一樣,對整體性能的影響還是很大的。目前還不清楚是否可以在不產生高性能開銷和不引入新問題的情況下,完全防止同一進程內的Spectre攻擊。

  • C5:安全機制可能產生不必要的影響。

    Retpoline 補丁通過在堆棧上篡改返回值,基本上向 CPU 隱藏了間接調用的目標。然而,這導致了其他安全機制的副作用,因爲Retpoline的行爲類似於改變控制流的漏洞。特別是控制流完整性等安全機制必須進行調整,以避免將Retpolines誤檢測爲攻擊。不過,問題還是出現了,Spectre修復措施如何與其他CFI實現(尤其是在硬件中)以及其他安全機制進行交互,以及我們在結合安全機制時是否必須接受權衡。總的來說,我們需要研究哪些安全機制可能會產生不利的影響,而超過安全方面的收益。

8. 總結

在本文中,我們提出了NetSpectre,第一個遠程Spectre變種1攻擊。我們展示了第一個通過網絡進行的基於訪問的遠程Evict+Reload緩存攻擊,其性能爲每小時15比特。我們還演示了第一個不使用緩存隱蔽信道的Spectre攻擊。特別是在遠程Spectre攻擊中,我們的基於AVX的新型高性能隱蔽信道的性能明顯優於遠程緩存隱蔽信道。我們的NetSpectre攻擊與基於AVX的隱蔽信道相結合,每小時從目標系統中泄露60比特。我們在本地網絡以及谷歌雲中驗證了NetSpectre。

NetSpectre標誌着Spectre攻擊模式的轉變,即從本地攻擊到遠程攻擊。通過我們的NetSpectre攻擊,更多的設備將暴露在Spectre攻擊之下,範圍更廣,數量更多。現在,Spectre攻擊還必須考慮到那些根本不運行任何潛在攻擊者控制的代碼的設備。我們證明,在遠程攻擊中,NetSpectre可以用來打破遠程系統上的地址空間佈局隨機化(ASLR)。正如我們在本文中所討論的那樣,未來對Spectre攻擊和Spectre修復措施的研究還存在一系列挑戰。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章