RSB 相關緩解措施¶
警告
請保持本文件最新,否則您將被要求更新它並將其轉換為 bugs.c 中很長的一段註釋!
自 2018 年以來,出現了許多與返回棧緩衝區 (RSB)(有時在 AMD 上稱為返回地址棧 (RAS) 或返回地址預測器 (RAP))相關的 Spectre CVE。
關於這些 CVE 以及如何緩解它們的資訊分散在無數個微架構特定的文件中。
本文件旨在將所有相關資訊整合到一個地方,並闡明當前 RSB 相關緩解措施背後的原因。它力求儘可能簡潔,只關注當前的核心緩解措施:RSB 相關的攻擊向量是什麼?目前是如何緩解它們的?
它不旨在描述 RSB 機制如何運作或漏洞如何利用。有關這些的更多詳細資訊可以在下面的參考文獻中找到。
相反,這基本上是一段被美化了的註釋,但又太長了,無法真正成為註釋。因此,當下一個 CVE 出現時,核心開發人員可以快速參考此文件,作為回顧,瞭解我們正在做什麼以及為什麼這樣做。
從宏觀層面看,RSB 攻擊分為兩類:RSB 汙染(Intel 和 AMD)和 RSB 下溢(僅限 Intel)。對於每個攻擊向量(以及適用的微架構),必須單獨考慮它們。
RSB 汙染(Intel 和 AMD)¶
SpectreRSB¶
RSB 汙染是 SpectreRSB [1] 使用的一種技術,攻擊者透過汙染 RSB 條目來導致受害者的返回指令推測到攻擊者控制的地址。這可能發生在上下文切換或 VMEXIT 後 CALL/RET 不平衡的情況下。
所有攻擊向量都可以透過在不受信任和受信任域之間轉換時,使用 RSB 填充序列 [2] [3] 重新整理任何被汙染的 RSB 條目來緩解。但這會影響效能,應儘可能避免。
危險
FIXME:目前我們正在重新整理 32 個條目。但是,一些 CPU 型號的條目超過 32 個。對於這些型號,迴圈計數需要增加。需要關於 RSB 大小的更詳細資訊。
在上下文切換時,使用者態到使用者態的緩解措施要求在上下文切換期間,IBPB 被寫入時 [4] 確保 RSB 被填充或清除
在上下文切換時,使用者態到核心態的攻擊透過 SMEP 阻止。使用者空間只能將使用者空間地址插入 RSB。甚至非規範地址也無法插入,因為 TASK_SIZE_MAX 保留的使用者規範地址空間末尾存在頁間隙。指令獲取時的 SMEP #PF 阻止核心推測性地執行使用者空間。
在 VMEXIT 時,訪客到主機攻擊透過 eIBRS(如果需要,還包括 PBRSB 緩解)進行緩解
- AMD
“當啟用自動 IBRS 時,用於返回地址預測的內部返回地址棧在 VMEXIT 時被清除。” [11]
- Intel
“在具有增強型 IBRS 的處理器上,RSB 覆蓋序列可能不足以阻止近距離返回的預測目標使用在許可權較低的預測器模式中建立的 RSB 條目。軟體可以透過啟用 SMEP(用於從使用者模式到管理模式的轉換)以及在 VM 出口時設定 IA32_SPEC_CTRL.IBRS 來防止這種情況。具有增強型 IBRS 的處理器仍然支援 IBRS 僅在 OS/VMM 中為啟用 SMEP 的作業系統設定的使用模型。為此,即使在 VM 出口時未設定 IBRS,此類處理器也將確保一旦設定了 IBRS,訪客行為就無法在 VM 出口後控制 RSB。” [12]
請注意,某些 Intel CPU 容易受到屏障後返回棧緩衝區預測 (PBRSB) [13] 的影響,其中訪客的最後一次 CALL 可用於預測第一次不平衡的 RET。在這種情況下,除了 eIBRS 之外,還需要 PBRSB 緩解。
AMD RETBleed / SRSO / 分支型別混淆¶
在 AMD 上,汙染的 RSB 條目也可以由 AMD RETBleed 變體 [14] [15] 或推測性返回棧溢位 [16] (Inception [17]) 建立。核心透過將核心中的每個 RET 替換為跳轉到單個安全 RET 來保護自身。
RSB 下溢(僅限 Intel)¶
RSB 替代 (RSBA) (“Intel Retbleed”)¶
某些 Intel Skylake 代的 CPU 容易受到 RETBleed 的 Intel 變體 [14](返回棧緩衝區下溢 [18])的影響。如果在 RSB 緩衝區因不匹配的 CALL/RET 或從深層呼叫棧返回而為空時執行 RET,分支預測器可能會回退到使用分支目標緩衝區 (BTB)。如果使用者強制 BTB 衝突,則 RET 可能會推測性地分支到使用者控制的地址。
請注意,RSB 填充不能完全緩解此問題。如果存在足夠多的不平衡 RET,RSB 仍可能下溢並回退到使用被汙染的 BTB 條目。
在上下文切換時,使用者態到使用者態下溢攻擊透過上下文切換時的條件 IBPB [4] 緩解,該措施有效清除 BTB
“間接分支預測器屏障 (IBPB) 是一種間接分支控制機制,它建立一個屏障,阻止在屏障之前執行的軟體控制在屏障之後在同一邏輯處理器上執行的間接分支的預測目標。” [19]
在上下文切換和 VMEXIT 時,使用者態到核心態和訪客到主機態的 RSB 下溢透過 IBRS 或 eIBRS 緩解
“啟用 IBRS(包括增強型 IBRS)將緩解研究人員演示的‘RSBU’攻擊。如前所述,Intel 建議使用增強型 IBRS(如果支援)。這包括列舉 RRSBA 但未列舉 RRSBA_DIS_S 的任何處理器。” [18]
但是,請注意 eIBRS 和 IBRS 不會緩解模式內攻擊。與下面的 RRSBA 一樣,這透過在核心入口處清除 BHB 來緩解。
作為經典 IBRS 的替代方案,呼叫深度跟蹤(結合 retpolines)可用於跟蹤核心返回並在 RSB 接近空時填充它。
受限 RSB 替代 (RRSBA)¶
一些較新的 Intel CPU 具有受限 RSB 替代 (RRSBA) 行為,與上面描述的 RSBA 類似,在 RSB 下溢時也會回退到使用 BTB。唯一的區別是當啟用 eIBRS 時,預測目標被限制在當前域內
“受限 RSB 替代 (RRSBA) 行為允許在 RSB 為空時,近距離 RET 指令使用替代分支預測器。當啟用 eIBRS 時,這些替代預測器的預測目標被限制在屬於當前預測域的間接分支預測器條目。” [20]
當一個具有 RRSBA 的 CPU 容易受到分支歷史注入 [21] [22] 攻擊時,RSB 下溢可用於模式內 BTI 攻擊。這透過在核心入口處清除 BHB 來緩解。
但是,如果核心使用 retpolines 而不是 eIBRS,則需要停用 RRSBA
“如果軟體使用 retpoline 作為 BHI 或模式內 BTI 的緩解措施,並且處理器同時列舉 RRSBA 和列舉 RRSBA_DIS 控制,則應停用此行為。” [23]