GDS - 收集資料取樣

收集資料取樣 (Gather Data Sampling) 是一種硬體漏洞,它允許非特權推測性地訪問先前儲存在向量暫存器中的資料。

問題

當收集指令從記憶體執行載入時,不同的資料元素會合併到目標向量暫存器中。然而,當一個瞬態執行的收集指令遇到故障時,來自架構或內部向量暫存器的過時資料可能會被瞬態轉發到目標向量暫存器。這將允許惡意攻擊者使用典型的旁道技術(如快取時序攻擊)推斷過時資料。GDS 是一種純粹基於取樣的攻擊。

攻擊者使用收集指令來推斷過時的向量暫存器資料。受害者除了使用向量暫存器外,不需要做任何特殊的事情。受害者無需使用收集指令即可易受攻擊。

由於緩衝區在超執行緒 (Hyper-Threads) 之間共享,因此跨超執行緒攻擊是可能的。

攻擊場景

如果沒有緩解措施,GDS 幾乎可以跨越所有許可權邊界推斷過時資料。

非 enclave 可以推斷 SGX enclave 資料 使用者空間可以推斷核心資料 客戶機可以從主機推斷資料 客戶機可以從其他客戶機推斷資料 使用者可以從其他使用者推斷資料

因此,確保在低許可權上下文(如訪客)以及在 SGX 安全區之外執行時,緩解措施保持啟用狀態非常重要。

硬體強制執行 SGX 的緩解措施。同樣,VMM (虛擬機器監視器) 應確保不允許訪客停用 GDS 緩解措施。如果主機出錯並允許這樣做,訪客理論上可以停用 GDS 緩解措施,發起攻擊,然後再重新啟用它。

緩解機制

此問題已透過微碼得到緩解。微碼定義了以下新位:

IA32_ARCH_CAPABILITIES[GDS_CTRL]

只讀

列舉 GDS 漏洞和緩解支援。

IA32_ARCH_CAPABILITIES[GDS_NO]

只讀

處理器不受漏洞影響。

IA32_MCU_OPT_CTRL[GDS_MITG_DIS]

讀/寫

預設停用緩解(預設為 0)。

IA32_MCU_OPT_CTRL[GDS_MITG_LOCK]

讀/寫

鎖定 GDS_MITG_DIS=0。對 GDS_MITG_DIS 的寫入將被忽略。一旦設定,無法清除。

在沒有更新微碼的系統上,也可以透過停用 AVX 來緩解 GDS。這可以透過在核心命令列上設定 `gather_data_sampling="force"` 或 `clearcpuid=avx` 來完成。

如果使用,這些選項將透過關閉 XSAVE YMM 支援來停用 AVX 的使用。然而,處理器仍將列舉 AVX 支援。不遵循正確 AVX 列舉(即同時檢查 AVX *和* XSAVE YMM 支援)的使用者空間程式將會中斷。

核心命令列上的緩解控制

可以在核心命令列上設定 `gather_data_sampling=off` 或 `mitigations=off` 來停用緩解措施。不指定任何一個選項將預設啟用緩解措施。指定 `gather_data_sampling=force` 將在可用時使用微碼緩解措施,或者在微碼未更新以包含緩解措施的受影響系統上停用 AVX。

GDS 系統資訊

核心透過 sysfs 提供漏洞狀態資訊。對於 GDS,可以透過以下 sysfs 檔案訪問:

/sys/devices/system/cpu/vulnerabilities/gather_data_sampling

此檔案中可能包含的值有:

不受影響

處理器不受漏洞影響。

易受攻擊

處理器易受攻擊且緩解措施已停用。

易受攻擊:無微碼

處理器易受攻擊且微碼缺少緩解措施。

緩解措施:AVX 已停用,

無微碼

處理器易受攻擊且微碼缺少緩解措施。AVX 已作為緩解措施停用。

緩解措施:微碼

處理器易受攻擊且緩解措施正在生效。

緩解措施:微碼(已鎖定)

處理器易受攻擊且緩解措施正在生效且無法停用。

未知:取決於

虛擬機器監控器狀態

執行在受影響的虛擬訪客處理器上,但無法得知主機處理器是否已緩解或易受攻擊。

GDS 預設緩解措施

更新後的微碼將預設啟用緩解措施。核心的預設操作是保持緩解措施啟用。