Spectre 旁路攻擊¶
Spectre 是一類旁路攻擊,它利用現代 CPU 上的分支預測和推測執行來讀取記憶體,可能繞過訪問控制。推測執行旁路攻擊不會修改記憶體,而是嘗試推斷記憶體中的特權資料。
本文件涵蓋 Spectre 變體 1 和 Spectre 變體 2。
受影響的處理器¶
推測執行旁路攻擊方法影響範圍廣泛的現代高效能處理器,因為大多數現代高速處理器都使用分支預測和推測執行。
以下 CPU 易受攻擊
Intel Core、Atom、Pentium 和 Xeon 處理器
AMD Phenom、EPYC 和 Zen 處理器
IBM POWER 和 zSeries 處理器
高階 ARM 處理器
Apple CPU
高階 MIPS CPU
可能包括大多數其他高效能 CPU。請聯絡您的 CPU 供應商瞭解詳細資訊。
處理器是否受影響可以從 sysfs 中的 Spectre 漏洞檔案中讀取。參見 Spectre 系統資訊。
問題¶
CPU 使用推測操作來提高效能。這可能會在處理器的快取記憶體、緩衝區和分支預測器中留下記憶體訪問或計算的痕跡。惡意軟體可能會影響推測執行路徑,然後利用推測執行在 CPU 快取記憶體和緩衝區中產生的副作用來推斷推測執行期間訪問的特權資料。
Spectre 變體 1 攻擊利用條件分支的推測執行,而 Spectre 變體 2 攻擊則利用間接分支的推測執行來洩漏特權記憶體。參見 [1] [5] [6] [7] [10] [11]。
Spectre 變體 1 (邊界檢查繞過)¶
邊界檢查繞過攻擊 [2] 利用了繞過用於記憶體訪問邊界檢查的條件分支指令(例如,檢查陣列索引是否導致有效範圍內的記憶體訪問)的推測執行。這導致在驗證檢查解決之前,推測性地對無效記憶體(超出邊界索引)進行記憶體訪問。這種推測性記憶體訪問可能會留下副作用,建立旁路,從而向攻擊者洩漏資訊。
Spectre 變體 1 攻擊有一些透過網路讀取資料的擴充套件,參見 [12]。然而,此類攻擊難度大、頻寬低、脆弱,並被認為風險較低。
請注意,儘管名為“邊界檢查繞過”,但 Spectre 變體 1 不僅僅涉及使用者控制的陣列邊界檢查。它可能影響任何條件檢查。核心入口程式碼中斷、異常和 NMI 處理程式都具有條件 swapgs 檢查。這些在 Spectre v1 的上下文中可能存在問題,因為核心程式碼可以推測性地以使用者 GS 執行。
Spectre 變體 2 (分支目標註入)¶
分支目標註入攻擊利用了間接分支的推測執行 [3]。處理器內部用於猜測間接分支目標的間接分支預測器可能受到攻擊者的影響,導致 gadget 程式碼被推測執行,從而暴露受害者接觸到的敏感資料。在推測執行期間留在 CPU 快取中的副作用可以被測量以推斷資料值。
在 Spectre 變體 2 攻擊中,攻擊者可以透過毒化用於預測間接分支地址的 CPU 分支目標緩衝區,將受害者中的推測間接分支引導至 gadget 程式碼。這種毒化可以透過間接分支到現有程式碼來完成,間接分支的地址偏移在攻擊者的控制之下。由於受影響硬體上的分支預測不能完全區分分支地址並使用偏移量進行預測,這可能導致特權程式碼的間接分支跳轉到具有相同偏移量的 gadget 程式碼。
最有用的 gadget 接受攻擊者控制的輸入引數(例如暫存器值),以便可以控制記憶體讀取。沒有輸入引數的 gadget 可能是可能的,但攻擊者對可以讀取的記憶體控制很少,從而降低了攻擊揭示有用資料的風險。
另一個變體 2 攻擊向量是攻擊者毒化返回棧緩衝區 (RSB) [13],以導致推測性子例程返回指令執行跳轉到 gadget。攻擊者不平衡的子例程呼叫指令可能會“毒化”返回棧緩衝區中的條目,這些條目隨後會被受害者的子例程返回指令消耗。這種攻擊可以透過在上下文切換或虛擬機器 (VM) 退出時重新整理返回棧緩衝區來緩解。
在具有同步多執行緒 (SMT) 的系統上,攻擊可能來自同級執行緒,因為一級快取和分支目標緩衝區 (BTB) 可能會在 CPU 核心中的硬體執行緒之間共享。執行在同級執行緒上的惡意程式可能會影響其對等執行緒的 BTB,以將其間接分支推測引導至 gadget 程式碼,並測量推測執行在一級快取中留下的副作用以推斷受害者的資料。
另一個變體 2 攻擊向量是攻擊者毒化分支歷史緩衝區 (BHB),以推測性地將間接分支引導至特定的分支目標緩衝區 (BTB) 條目,即使該條目未與間接分支的源地址關聯。具體來說,即使存在增強型 IBRS,BHB 也可能跨特權級別共享。
此前已知的唯一真實世界 BHB 攻擊向量是透過非特權 eBPF。進一步的研究發現了不需要非特權 eBPF 的攻擊。為了完全緩解 BHB 攻擊,建議設定 BHI_DIS_S 或使用 BHB 清除序列。
攻擊場景¶
以下列出的攻擊場景已預料到,但可能未涵蓋所有可能的攻擊向量。
1. 使用者程序攻擊核心¶
Spectre 變體 1¶
攻擊者透過暫存器或透過系統呼叫期間記憶體中的已知地址將引數傳遞給核心。此類引數可能稍後被核心用作陣列的索引或用於匯出 Spectre 變體 1 攻擊的指標。索引或指標無效,但在用於推測執行的程式碼分支中繞過了邊界檢查。這可能導致特權記憶體被訪問並洩漏。
對於已識別出資料指標可能受 Spectre 攻擊影響的核心程式碼,使用新的“nospec”訪問器宏來防止資料的推測性載入。
Spectre 變體 1 (swapgs)¶
攻擊者可以訓練分支預測器,以推測性地跳過中斷或異常的 swapgs 路徑。如果他們將 GS 暫存器初始化為使用者空間值,並且推測性地跳過 swapgs,則推測視窗中後續與 GS 相關的 percpu 訪問將使用攻擊者控制的 GS 值完成。這可能導致特權記憶體被訪問和洩漏。
例如
if (coming from user space) swapgs mov %gs:<percpu_offset>, %reg mov (%reg), %reg1當從使用者空間進入時,CPU 可以推測性地跳過 swapgs,然後使用使用者 GS 值進行推測性 percpu 載入。因此使用者可以推測性地強制讀取任何核心值。如果存在使用 percpu 值作為另一個載入/儲存中地址的 gadget,則核心值的內容可能透過 L1 旁路攻擊可見。
當從核心空間進入時,也存在類似的攻擊。CPU 可以推測性地執行 swapgs,導致使用者 GS 在推測視窗的其餘部分被使用。
Spectre 變體 2¶
Spectre 變體 2 攻擊者可以在發出系統呼叫之前 毒化 分支目標緩衝區 (BTB) 以發動攻擊。進入核心後,核心可以在間接跳轉時使用被毒化的分支目標緩衝區,並在推測執行中跳轉到 gadget 程式碼。
如果攻擊者試圖控制在推測執行期間洩漏的記憶體地址,他還需要透過暫存器或記憶體中的已知地址向 gadget 傳遞引數。在 gadget 執行後,他可以測量副作用。
核心可以透過對所有間接分支使用返回跳板(也稱為“retpoline”)[3] [9] 來保護自己免受消耗被毒化的分支目標緩衝區條目的影響。返回跳板將推測執行路徑困在無限迴圈中,以防止在推測執行期間跳轉到 gadget 程式碼。具有硬體中增強型間接分支限制推測 (Enhanced IBRS) 的 x86 CPU 應該使用該功能來緩解 Spectre 變體 2,而不是 retpoline。增強型 IBRS 比 retpoline 更高效。
韌體中可能存在 gadget 程式碼,惡意使用者程序可以利用 Spectre 變體 2 攻擊來利用這些程式碼。為了緩解 x86 上的此類攻擊,在核心呼叫任何韌體程式碼之前,會啟用間接分支限制推測 (IBRS) 功能。
2. 使用者程序攻擊另一個使用者程序¶
惡意使用者程序可以嘗試攻擊另一個使用者程序,無論是透過同一硬體執行緒上的上下文切換,還是透過在同步多執行緒 (SMT) 系統上共享物理處理器核心的同級超執行緒。
Spectre 變體 1 攻擊通常需要在程序之間傳遞引數,這需要資料傳遞關係,例如遠端過程呼叫 (RPC)。這些引數在 gadget 程式碼中用於匯出訪問被攻擊程序中特權記憶體的無效資料指標。
Spectre 變體 2 攻擊可以由惡意程序透過 毒化 分支目標緩衝區來發起。這可能會影響受害者程序的間接分支目標,該受害者程序要麼稍後在同一硬體執行緒上執行,要麼與共享同一物理核心的同級硬體執行緒併發執行。
使用者程序可以透過使用 prctl() 系統呼叫來停用自身的間接分支推測,從而保護自己免受 Spectre 變體 2 攻擊。管理員還可以透過停用程序的間接分支推測來隔離不安全程序,使其不會汙染分支目標緩衝區。這會因為不使用間接分支推測和清除分支目標緩衝區而帶來效能開銷。在 x86 上啟用 SMT 時,對於停用間接分支推測的程序,會啟用單執行緒間接分支預測器 (STIBP) [4],以防止同級執行緒控制分支目標緩衝區。此外,在上下文切換到或從該程序切換時,會發出間接分支預測屏障 (IBPB) 以清除分支目標緩衝區。
在 x86 上,返回棧緩衝區在上下文切換時被填充。這防止了當返回棧緩衝區在切換到更深的呼叫棧時下溢時,分支目標緩衝區被用於分支預測。之前程序留下的任何被毒化的返回棧緩衝區條目也將被清除。
使用者程式應該使用地址空間隨機化,使攻擊更困難(設定 /proc/sys/kernel/randomize_va_space = 1 或 2)。
3. 虛擬化客戶機攻擊宿主機¶
攻擊機制類似於使用者程序攻擊核心的方式。透過超呼叫或其他虛擬化退出路徑進入核心。
對於 Spectre 變體 1 攻擊,惡意客戶機可以透過超呼叫傳遞引數(例如在暫存器中),以在進入核心後匯出無效指標,從而推測特權記憶體。對於已識別出此類核心程式碼的地方,使用 nospec 訪問器宏來阻止推測性記憶體訪問。
對於 Spectre 變體 2 攻擊,惡意客戶機可以 毒化 分支目標緩衝區或返回棧緩衝區,導致核心在推測執行路徑中跳轉到 gadget 程式碼。
為了緩解變體 2,宿主機核心可以使用返回跳板進行間接分支以繞過被毒化的分支目標緩衝區,並在 VM 退出時重新整理返回棧緩衝區。這可以防止惡意客戶機影響宿主機核心中的間接分支。
為了保護宿主機程序免受惡意客戶機攻擊,宿主機程序可以透過 prctl() 停用間接分支推測。在上下文切換到此類程序之前,分支目標緩衝區會被清除。
4. 虛擬化客戶機攻擊其他客戶機¶
惡意客戶機可能會攻擊另一個客戶機以獲取其他客戶機可訪問的資料。
如果引數可以在客戶機之間傳遞,Spectre 變體 1 攻擊是可能的。這可以透過共享記憶體或訊息傳遞等機制完成。此類引數可用於派生受害者推測路徑中 gadget 程式碼可訪問的特權資料的資料指標。
Spectre 變體 2 攻擊可以由惡意客戶機透過 毒化 分支目標緩衝區或返回棧緩衝區來發起。這些被毒化的條目可以用於影響受害者客戶機中的推測執行路徑。
Linux 核心透過在 VM 退出時重新整理返回棧緩衝區,並在切換到 CPU 上的新客戶機之前清除分支目標緩衝區,來緩解對執行在同一 CPU 硬體執行緒中的其他客戶機的攻擊。
如果使用 SMT,管理員可以透過 prctl() 關閉不受信任客戶機的間接分支推測,從而緩解來自同級超執行緒中不受信任客戶機的 Spectre 變體 2 攻擊。客戶機還可以透過在客戶機內部啟用基於微碼的緩解措施(例如 x86 上的 IBPB 或 STIBP)來保護自己。
Spectre 系統資訊¶
Linux 核心提供了一個 sysfs 介面,用於列舉系統當前對 Spectre 的緩解狀態:系統是否易受攻擊,以及哪些緩解措施處於活動狀態。
顯示 Spectre 變體 1 緩解狀態的 sysfs 檔案是
/sys/devices/system/cpu/vulnerabilities/spectre_v1
此檔案中可能的值為
“Not affected”(不受影響)
處理器不受影響。
“Vulnerable: __user pointer sanitization and usercopy barriers only; no swapgs barriers”(易受攻擊:僅有 __user 指標清理和 usercopy 屏障;無 swapgs 屏障)
swapgs 保護已停用;否則,核心中在特定情況下透過顯式指標清理和 usercopy LFENCE 屏障提供保護。
“Mitigation: usercopy/swapgs barriers and __user pointer sanitization”(緩解:usercopy/swapgs 屏障和 __user 指標清理)
核心中在特定情況下透過顯式指標清理、usercopy LFENCE 屏障和 swapgs LFENCE 屏障提供保護。
然而,這些保護措施是針對具體情況實施的,並不能保證涵蓋 Spectre 變體 1 的所有可能攻擊向量。
spectre_v2 核心檔案報告核心是否已使用 retpoline 緩解編譯,或者 CPU 是否具有硬體緩解,以及 CPU 是否支援額外的程序特定緩解。
此檔案還報告微碼啟用的 CPU 功能,以緩解使用者程序之間的攻擊
間接分支預測屏障 (IBPB),用於在不同使用者程序之間增加額外隔離。
單執行緒間接分支預測器 (STIBP),用於在同一核心上執行的 CPU 執行緒之間增加額外隔離。
這些 CPU 功能在使用時可能會影響效能,並且可以根據具體情況為每個程序啟用。
顯示 Spectre 變體 2 緩解狀態的 sysfs 檔案是
/sys/devices/system/cpu/vulnerabilities/spectre_v2
此檔案中可能的值為
核心狀態
“Not affected”(不受影響)
處理器不受影響
“Mitigation: None”(緩解:無)
易受攻擊,無緩解
“Mitigation: Retpolines”(緩解:Retpolines)
使用 Retpoline 蹦床
“Mitigation: LFENCE”(緩解:LFENCE)
使用 LFENCE 指令
“Mitigation: Enhanced IBRS”(緩解:增強型 IBRS)
以硬體為中心的緩解
“Mitigation: Enhanced IBRS + Retpolines”(緩解:增強型 IBRS + Retpolines)
以硬體為中心 + Retpolines
“Mitigation: Enhanced IBRS + LFENCE”(緩解:增強型 IBRS + LFENCE)
以硬體為中心 + LFENCE
韌體狀態:顯示在呼叫韌體時是否使用間接分支限制推測 (IBRS) 來防禦 Spectre 變體 2 攻擊(僅限 x86)。
“IBRS_FW”
呼叫韌體時針對使用者程式攻擊的保護
間接分支預測屏障 (IBPB) 狀態,用於不同使用者程序之間的保護。此功能可以透過 prctl() 按程序控制,或透過核心命令列選項控制。這是僅限 x86 的功能。有關更多詳細資訊,請參閱下文。
“IBPB: disabled”(IBPB:已停用)
IBPB 未使用
“IBPB: always-on”(IBPB:始終開啟)
在所有任務上使用 IBPB
“IBPB: conditional”(IBPB:條件性)
在 SECCOMP 或間接分支受限任務上使用 IBPB
單執行緒間接分支預測 (STIBP) 狀態,用於不同超執行緒之間的保護。此功能可以透過 prctl 按程序控制,或透過核心命令列選項控制。這是僅限 x86 的功能。有關更多詳細資訊,請參閱下文。
“STIBP: disabled”(STIBP:已停用)
STIBP 未使用
“STIBP: forced”(STIBP:強制)
在所有任務上使用 STIBP
“STIBP: conditional”(STIBP:條件性)
在 SECCOMP 或間接分支受限任務上使用 STIBP
返回棧緩衝區 (RSB) 保護狀態
“RSB filling”(RSB 填充中)
已啟用上下文切換時的 RSB 保護
EIBRS 後屏障返回棧緩衝區 (PBRSB) 保護狀態
“PBRSB-eIBRS: SW sequence”(PBRSB-eIBRS:SW 序列)
CPU 受影響且已啟用 VMEXIT 時的 RSB 保護
“PBRSB-eIBRS: Vulnerable”(PBRSB-eIBRS:易受攻擊)
CPU 易受攻擊
“PBRSB-eIBRS: Not affected”(PBRSB-eIBRS:不受影響)
CPU 不受 PBRSB 影響
分支歷史注入 (BHI) 保護狀態
BHI: Not affected(BHI:不受影響) |
系統不受影響 |
BHI: Retpoline(BHI:Retpoline) |
系統受 retpoline 保護 |
BHI: BHI_DIS_S(BHI:BHI_DIS_S) |
系統受 BHI_DIS_S 保護 |
BHI: SW loop, KVM SW loop(BHI:SW 迴圈,KVM SW 迴圈) |
系統受軟體清除序列保護 |
BHI: Vulnerable(BHI:易受攻擊) |
系統易受 BHI 攻擊 |
BHI: Vulnerable, KVM: SW loop(BHI:易受攻擊,KVM:SW 迴圈) |
系統易受攻擊;KVM 受軟體清除序列保護 |
全面緩解可能需要 CPU 供應商提供微碼更新。當沒有必要的微碼時,核心將報告漏洞。
啟用 Spectre 變體 1 和 Spectre 變體 2 的緩解措施¶
1. 核心緩解¶
Spectre 變體 1¶
對於 Spectre 變體 1,易受攻擊的核心程式碼(由程式碼審計或掃描工具確定)會逐一進行標註,以使用 nospec 訪問器宏進行邊界剪裁 [2],以避免任何可用的洩露 gadget。然而,這可能無法涵蓋 Spectre 變體 1 的所有攻擊向量。
copy-from-user 程式碼有一個 LFENCE 屏障,以防止 access_ok() 檢查被錯誤推測。該屏障由 barrier_nospec() 宏完成。
對於 Spectre 變體 1 的 swapgs 變體,在需要時,LFENCE 屏障被新增到中斷、異常和 NMI 入口。這些屏障由 FENCE_SWAPGS_KERNEL_ENTRY 和 FENCE_SWAPGS_USER_ENTRY 宏完成。
Spectre 變體 2¶
對於 Spectre 變體 2 緩解,編譯器將核心中的間接呼叫或跳轉轉換為等效的返回跳板 (retpolines) [3] [9] 以跳轉到目標地址。retpolines 下的推測執行路徑被困在無限迴圈中,以防止任何推測執行跳轉到 gadget。
要在易受攻擊的 CPU 上啟用 retpoline 緩解,核心需要使用支援 -mindirect-branch=thunk-extern -mindirect-branch-register 選項的 gcc 編譯器進行編譯。如果核心使用 Clang 編譯器編譯,則編譯器需要支援 -mretpoline-external-thunk 選項。核心配置 CONFIG_MITIGATION_RETPOLINE 需要啟用,並且 CPU 需要執行最新的微碼。
在 Intel Skylake 時代的系統上,這種緩解措施涵蓋了大多數情況,但不是全部。有關更多詳細資訊,請參見 [3]。
在具有 Spectre 變體 2 硬體緩解(例如 x86 上的 IBRS 或增強型 IBRS)的 CPU 上,retpoline 在執行時會自動停用。
支援增強型 IBRS (eIBRS) 的系統在引導時透過設定 IBRS 位一次性啟用 IBRS 保護,並且它們自動受到某些 Spectre v2 變體攻擊的保護。BHB 仍然可以影響間接分支預測器條目的選擇,儘管當 eIBRS 啟用時分支預測器條目在模式之間是隔離的,但 BHB 本身在模式之間不是隔離的。支援 BHI_DIS_S 的系統將設定它以防範 BHI 攻擊。
在 Intel 的增強型 IBRS 系統上,這包括 SMT 系統上的跨執行緒分支目標註入 (STIBP)。換句話說,Intel eIBRS 也啟用了 STIBP。
AMD 自動 IBRS 不保護使用者空間,並且傳統 IBRS 系統在退出使用者空間時清除 IBRS 位,因此兩者都顯式啟用了 STIBP。
retpoline 緩解預設在易受攻擊的 CPU 上開啟。管理員可以透過核心命令列和 sysfs 控制檔案強制開啟或關閉它。參見 核心命令列上的緩解控制。
在 x86 上,間接分支限制推測預設在呼叫任何韌體程式碼之前開啟,以防止使用韌體的 Spectre 變體 2 漏洞利用。
使用核心地址空間隨機化(核心配置中的 CONFIG_RANDOMIZE_BASE=y 和 CONFIG_SLAB_FREELIST_RANDOM=y)使對核心的攻擊通常更困難。
2. 使用者程式緩解¶
使用者程式可以使用 LFENCE 或“邊界剪裁”來緩解 Spectre 變體 1。有關更多詳細資訊,請參見 [2]。
對於 Spectre 變體 2 緩解,單個使用者程式可以使用返回跳板編譯間接分支。這可以保護它們免受惡意軟體留下的分支目標緩衝區中被毒化條目的影響。
在舊版 IBRS 系統上,返回使用者空間時,隱式 STIBP 會被停用,因為核心會清除 IBRS 位。在這種情況下,使用者空間程式可以透過 prctl() 停用間接分支推測(參見 Documentation/userspace-api/spec_ctrl.rst)。在 x86 上,這將在使用者程式執行時啟用 STIBP 以防禦來自同級執行緒的攻擊,並在切換到/從程式時使用 IBPB 重新整理分支目標緩衝區。
限制使用者程式上的間接分支推測也將阻止該程式在 x86 上發起變體 2 攻擊。管理員可以透過核心命令列和 sysfs 控制檔案更改該行為。參見 核心命令列上的緩解控制。
停用間接分支推測的程式將具有更大的開銷並執行更慢。
使用者程式應該使用地址空間隨機化(/proc/sys/kernel/randomize_va_space = 1 或 2)來使攻擊更困難。
3. 虛擬機器緩解¶
在核心內部,來自惡意客戶機的 Spectre 變體 1 攻擊在 VM 退出路徑中逐案緩解。易受攻擊的程式碼使用 nospec 訪問器宏進行“邊界剪裁”,以避免任何可用的洩露 gadget。但是,這可能無法涵蓋所有變體 1 攻擊向量。
對於來自惡意客戶機對核心的 Spectre 變體 2 攻擊,Linux 核心使用 retpoline 或增強型 IBRS 來防止消耗惡意客戶機留下的分支目標緩衝區中的被毒化條目。它還在每次 VM 退出時重新整理返回棧緩衝區,以防止返回棧緩衝區下溢,從而可以使用被毒化的分支目標緩衝區,或者攻擊者客戶機在返回棧緩衝區中留下被毒化條目。
為了緩解同一 CPU 硬體執行緒中客戶機對客戶機的攻擊,在切換到 CPU 上的新客戶機之前,透過重新整理分支目標緩衝區對其進行清理。
上述緩解措施在易受攻擊的 CPU 上預設開啟。
為了緩解當使用 SMT 時來自同級執行緒的客戶機對客戶機的攻擊,管理員可以透過 prctl() 停用執行在同級執行緒中的不受信任客戶機的間接分支推測。
核心還允許客戶機使用它們選擇的任何基於微碼的緩解措施(例如 x86 上的 IBPB 或 STIBP)來保護自己。
核心命令列上的緩解控制¶
通常,核心會為當前 CPU 選擇合理的預設緩解措施。
Spectre 預設緩解措施可以透過核心命令列上的以下選項停用或更改
nospectre_v1
nospectre_v2
spectre_v2={option}
spectre_v2_user={option}
spectre_bhi={option}
有關可用選項的更多詳細資訊,請參閱 核心命令列引數
緩解選擇指南¶
1. 信任的使用者空間¶
如果所有使用者空間應用程式都來自可信來源,並且不執行外部提供的不可信程式碼,則可以停用緩解措施。
2. 保護敏感程式¶
對於包含秘密(例如加密金鑰)的安全性敏感程式,可以透過在程式執行時停用間接分支推測來提供針對 Spectre 變體 2 的保護(參見 Documentation/userspace-api/spec_ctrl.rst)。
3. 沙盒不可信程式¶
可能成為攻擊源的不可信程式可以透過在它們執行時停用其間接分支推測來隔離(參見 Documentation/userspace-api/spec_ctrl.rst)。這可以防止不可信程式汙染分支目標緩衝區。此行為可以透過核心命令列和 sysfs 控制檔案更改。參見 核心命令列上的緩解控制。
3. 高安全模式¶
所有 Spectre 變體 2 緩解措施都可以在引導時強制對所有程式開啟(參見 核心命令列上的緩解控制 中的“on”選項)。這將增加開銷,因為所有程式的間接分支推測都將受到限制。
在 x86 上,當切換到新程式時,分支目標緩衝區將透過 IBPB 重新整理。STIBP 始終保持開啟,以保護程式免受源自同級執行緒上執行的程式的變體 2 攻擊。
或者,STIBP 可以僅在執行其間接分支推測被顯式停用的程式時使用,而 IBPB 仍然在切換到新程式時始終使用以清除分支目標緩衝區(參見 核心命令列上的緩解控制 中的“ibpb”選項)。此“ibpb”選項的效能開銷低於“on”選項,後者始終保持 STIBP 開啟。
Spectre 參考資料¶
Intel 白皮書
[1] Intel 對推測執行旁路攻擊的分析。
[2] 邊界檢查繞過。
[3] 深入探討:Retpoline:一種分支目標註入緩解措施。
[4] 深入探討:單執行緒間接分支預測器。
AMD 白皮書
[5] AMD64 技術間接分支控制擴充套件。
[6] AMD 處理器上的推測管理軟體技術。
ARM 白皮書
[7] 快取推測旁路攻擊。
[8] 快取推測問題更新。
Google 白皮書
[9] Retpoline:一種用於防止分支目標註入的軟體構造。
MIPS 白皮書
[10] MIPS:對推測執行和旁路漏洞的回應。
學術論文
[11] Spectre 攻擊:利用推測執行。
[12] NetSpectre:透過網路讀取任意記憶體。
[13] Spectre 歸來!使用返回棧緩衝區的推測攻擊。