間接目標選擇 (ITS)

ITS 是某些支援增強型 IBRS 且在 Alder Lake 之前釋出的 Intel CPU 中的一個漏洞。ITS 可能允許攻擊者控制位於快取行下半部分的間接分支和 RET 的預測。

ITS 被分配了 CVE-2024-28956,CVSS 評分為 4.7 (中等)。

影響範圍

  • eIBRS 客戶機/宿主機隔離:KVM/核心中的間接分支仍可能被預測為與客戶機中分支對應的非預期目標。

  • 模式內 BTI:核心內訓練,例如透過 cBPF 或其他原生小工具。

  • 間接分支預測屏障 (IBPB):在 IBPB 之後,間接分支仍可能被預測為與 IBPB 之前執行的直接分支對應的目標。這透過 IPU 2025.1 微程式碼修復,該微程式碼應可透過發行版更新獲取。另外,微程式碼可從 Intel 的 GitHub 倉庫獲取 [1]

受影響的 CPU

以下是受 ITS 影響的 CPU 列表 [2] [3]

通用名稱

家族_型號

eIBRS 客戶機/宿主機隔離

模式內 BTI

SKYLAKE_X (步進 >= 6)

06_55H

受影響

受影響

ICELAKE_X

06_6AH

不受影響

受影響

ICELAKE_D

06_6CH

不受影響

受影響

ICELAKE_L

06_7EH

不受影響

受影響

TIGERLAKE_L

06_8CH

不受影響

受影響

TIGERLAKE

06_8DH

不受影響

受影響

KABYLAKE_L (步進 >= 12)

06_8EH

受影響

受影響

KABYLAKE (步進 >= 13)

06_9EH

受影響

受影響

COMETLAKE

06_A5H

受影響

受影響

COMETLAKE_L

06_A6H

受影響

受影響

ROCKETLAKE

06_A7H

不受影響

受影響

  • 所有受影響的 CPU 都枚舉了增強型 IBRS 功能。

  • IBPB 隔離在所有受 ITS 影響的 CPU 上都受影響,需要微程式碼更新進行緩解。

  • 所有受影響的 CPU 都未列舉 BHI_CTRL,該功能在 Golden Cove(Alder Lake 和 Sapphire Rapids)中引入。這有助於客戶機確定宿主機的受影響狀態。

  • Intel Atom CPU 不受 ITS 影響。

緩解措施

由於只有指令的最後一個位元組位於快取行下半部分的間接分支和 RET 容易受到 ITS 的攻擊,因此緩解措施的基本思想是不允許間接分支出現在快取行的下半部分。

這透過依賴核心和編譯器中現有的 retpoline 支援來實現。易受 ITS 攻擊的 retpoline 站點在執行時被打上補丁,指向新新增的 ITS 安全的 thunks。這些安全 thunks 包含位於快取行下半部分的間接分支。並非所有 retpoline 站點都被打上補丁為 thunks,如果 retpoline 站點被評估為 ITS 安全,它將被替換為內聯間接分支。

動態 thunks

從一個動態分配的安全 thunks 池中,每個易受攻擊的站點都被一個新 thunk 替換,以便它們獲得唯一的地址。這可以提高分支預測的準確性。此外,它也是一種針對別名的深度防禦措施。

請注意,為簡化起見,eBPF 程式中的間接分支始終被替換為跳轉到 __x86_indirect_its_thunk_array 中的靜態 thunk。如果需要,將來可以更改為使用動態 thunks。

所有易受攻擊的 RET 都被替換為靜態 thunk,它們不使用動態 thunks。這是因為 RET 的預測主要來自 RSB,不依賴於源地址。RSB 下溢的 RET 可能會從動態 thunks 中受益。但是,RET 數量顯著多於間接分支,並且唯一源地址帶來的任何好處都可能被增加的 icache 佔用和 iTLB 壓力所抵消。

Retpoline

Retpoline 序列也緩解了 ITS 不安全的間接分支。因此,當啟用 retpoline 時,ITS 緩解措施只將 RET 重新定位到安全 thunks。除非使用者請求 RSB 填充緩解。

RSB 填充

透過呼叫深度跟蹤進行 RSB 填充是 Retbleed RSB 下溢攻擊的一種緩解措施。它也緩解了易受 ITS 攻擊的 RET。

客戶機中的緩解措施

所有客戶機預設部署 ITS 緩解措施,無論客戶機的 eIBRS 列舉和家族/型號如何。這是因為 eIBRS 功能可能對客戶機隱藏。唯一的例外是當客戶機列舉 BHI_DIS_S 時,這表示客戶機正在不受影響的宿主機上執行。

為防止客戶機在不受影響的平臺上不必要地部署緩解措施,Intel 在 MSR IA32_ARCH_CAPABILITIES 中定義了 ITS_NO 位 (62)。當客戶機看到此位被設定時,它不應列舉 ITS 錯誤。請注意,此位不由任何硬體設定,但旨在供 VMM 根據宿主機的受影響狀態進行合成以供客戶機使用。

緩解選項

ITS 緩解措施可以透過“indirect_target_selection”核心引數控制。可用選項有:

on

(預設) 部署“對齊分支/返回 thunks”緩解措施。如果 spectre_v2 緩解措施啟用 retpoline,對齊 thunks 僅針對受影響的 RET 指令部署。Retpoline 緩解間接分支。

off

停用 ITS 緩解措施。

vmexit

如果 CPU 受 ITS 客戶機/宿主機隔離部分影響,則等同於“=on”。否則,不部署緩解措施。此選項在宿主機使用者空間不在威脅模型中,且僅考慮從客戶機到宿主機的攻擊時很有用。

stuff

當 retpoline 也部署時,部署 RSB 填充緩解措施。否則,部署預設緩解措施。當啟用 retpoline 緩解措施時,透過呼叫深度跟蹤進行的 RSB 填充也緩解 ITS。

force

強制 ITS 錯誤並部署預設緩解措施。

Sysfs 報告

顯示 ITS 緩解狀態的 sysfs 檔案是

/sys/devices/system/cpu/vulnerabilities/indirect_target_selection

請注意,此檔案中不報告微程式碼緩解狀態。

此檔案中的可能值是:

不受影響

處理器不受漏洞影響。

易受攻擊

系統易受攻擊,未應用緩解措施。

易受攻擊,KVM:不受影響

系統易受模式內 BTI 攻擊,但不受 eIBRS 客戶機/宿主機隔離影響。

緩解措施:對齊分支/返回 thunks

已啟用緩解措施,受影響的間接分支和 RET 被重新定位到安全 thunks。

緩解措施:Retpolines,填充 RSB

已使用 retpoline 和 RSB 填充啟用緩解措施。

參考文獻