分支預測器是現代 CPU 架構的關鍵元件,旨在透過在解析分支指令(例如 if-else 語句)之前推測分支指令的方向來增強效能。這種推測允許 CPU 沿著預測路徑預取和執行指令,從而減少感知延遲並提高整體吞吐量。然而,這種效能最佳化引入了可在 CPU 計時攻擊中利用的潛在漏洞,特別是在洩漏敏感資訊的情況下。
分支預測的工作原理是維護分支結果的歷史記錄並使用該歷史記錄來預測未來的分支。當遇到分支指令時,預測器會使用該歷史資料來猜測是否會採用分支。如果預測正確,CPU 將繼續執行而不會中斷。如果不正確,CPU 必須回滾並執行正確的路徑,這會導致效能損失。這種懲罰雖然很小,但可以被攻擊者測量和利用。
攻擊者可以操縱分支預測器在正確和錯誤預測的分支之間創建可測量的時序差異。這種差異可用於推斷程式的執行路徑,從而洩漏敏感資訊。此類攻擊最著名的範例之一是 Spectre 漏洞,該漏洞利用推測執行和分支預測來存取未經授權的記憶體位置。
在典型的 Spectre 攻擊中,攻擊者首先訓練分支預測器遵循特定模式。此訓練階段涉及執行一系列分支指令,這些指令使預測器做出特定的預測。一旦預測器經過訓練,攻擊者就會執行受害者代碼段,其中包括依賴秘密資料的分支。如果預測器根據攻擊者的訓練做出錯誤的預測,CPU 將推測性地執行基於秘密資料存取記憶體的指令。儘管這些推測指令最終會被丟棄,但它們會在 CPU 的快取中留下痕跡。
然後,攻擊者可以測量對不同記憶體位置的存取時間,以確定哪些資料被推測存取。這種技術稱為快取定時攻擊,允許攻擊者根據觀察到的定時差異推斷秘密資料。此類攻擊的關鍵步驟是:
1. 訓練分支預測器:攻擊者運行影響分支預測器狀態的受控指令序列。例如,重複執行具有一致結果(例如,總是採用)的分支指令使預測器在未來的執行中期望該結果。
2. 觸發推測執行:攻擊者使用依賴秘密資料的分支指令來執行受害者程式碼。由於攻擊者先前的訓練,分支預測器推測執行了錯誤的路徑,其中涉及基於秘密資料存取記憶體。
3. 測量快取存取時間:推測執行後,攻擊者測量存取特定記憶體位置所需的時間。更快的存取時間表明資料存在於快取中,這意味著它是推測性存取的。透過分析這些時間,攻擊者可以推斷出秘密數據。
為了用具體範例來說明這一點,請考慮秘密資料確定分支內數組存取索引的場景。攻擊者先訓練分支預測器來假設某個分支方向。當受害者程式碼運作時,分支預測器會根據訓練的方向推測性地執行陣列存取。如果推測涉及存取特定數組元素,則載入相應的快取行。然後,攻擊者可以執行一系列定時記憶體訪問,以確定載入了哪些快取行,從而推斷出秘密索引。
減輕此類攻擊涉及多種策略。基於硬體的解決方案包括改進推測執行路徑和非推測執行路徑之間的隔離,並確保推測執行不會影響快取等共享資源。基於軟體的解決方案涉及一些技術,例如插入「柵欄」指令以防止推測執行超過程式碼中的某些點,或使用恆定時間程式設計實踐來確保執行時間不依賴於秘密資料。
基於分支預測器的定時攻擊的複雜性和複雜性強調了在硬體和軟體安全方面持續研究和開發的必要性。隨著 CPU 架構的不斷發展,防範這些和其他形式的旁道攻擊的策略也必須不斷發展。
最近的其他問題和解答 CPU時序攻擊:
- 在保持系統效能的同時實施定時攻擊的硬體和軟體緩解措施涉及哪些挑戰和權衡?
- 恆定時間編程如何幫助降低密碼演算法中定時攻擊的風險?
- 什麼是推測執行?
- 定時攻擊如何利用執行時間的變化來推斷系統的敏感資訊?
- 什麼是定時攻擊?