L1TF - L1 終端故障

L1 終端故障是一種硬體漏洞,當控制虛擬地址(用於訪問)的頁表項的 Present 位被清除或設定了其他保留位時,該漏洞允許非特權推測性地訪問一級資料快取中可用的資料。

受影響的處理器

此漏洞影響範圍廣泛的 Intel 處理器。此漏洞不存在於

  • 來自 AMD、Centaur 和其他非 Intel 供應商的處理器

  • CPU 系列小於 6 的較舊處理器型號

  • 一系列 Intel ATOM 處理器 (Cedarview, Cloverview, Lincroft, Penwell, Pineview, Silvermont, Airmont, Merrifield)

  • Intel XEON PHI 系列

  • IA32_ARCH_CAPABILITIES MSR 中設定了 ARCH_CAP_RDCL_NO 位的 Intel 處理器。如果設定了該位,則 CPU 也不受 Meltdown 漏洞的影響。這些 CPU 應在 2018 年底前上市。

處理器是否受影響可以從 sysfs 中的 L1TF 漏洞檔案中讀取。參見 L1TF 系統資訊

問題

如果一條指令訪問了一個虛擬地址,而該地址相關的頁表項 (PTE) 的 Present 位已被清除或設定了其他保留位,那麼推測性執行會忽略該無效 PTE,並載入一級資料快取中存在的引用資料,就像 PTE 中地址位引用的頁面仍然存在且可訪問一樣。

儘管這純粹是一種推測性機制,並且指令最終在退役時會引發頁錯誤,但載入資料並使其可供其他推測性指令使用的純粹行為,為非特權惡意程式碼的側通道攻擊打開了機會,類似於 Meltdown 攻擊。

儘管 Meltdown 破壞了使用者空間到核心空間的保護,但 L1TF 允許攻擊系統中任何物理記憶體地址,並且攻擊適用於所有保護域。它允許攻擊 SGX,並且從虛擬機器內部也能奏效,因為推測會繞過擴充套件頁表 (EPT) 保護機制。

攻擊場景

1. 惡意使用者空間

作業系統將任意資訊儲存在標記為不存在的 PTE 的地址位中。這使得惡意使用者空間應用程式能夠攻擊這些 PTE 解析到的物理記憶體。在某些情況下,使用者空間可以惡意影響 PTE 地址位中編碼的資訊,從而使攻擊更具確定性和實用性。

Linux 核心包含針對此攻擊向量的緩解措施——PTE 反轉,該措施永久啟用且不影響效能。核心確保未標記為 Present 的 PTE 的地址位永遠不會指向可快取的物理記憶體空間。

具有最新核心的系統受到保護,可抵禦來自惡意使用者空間應用程式的攻擊。

2. 虛擬機器中的惡意訪客

L1TF 破壞所有域保護的事實允許能夠直接控制 PTE 的惡意訪客作業系統以及執行在缺少 L1TF PTE 反轉緩解措施的未受保護訪客核心上的惡意訪客使用者空間應用程式攻擊物理主機記憶體。

在虛擬化背景下,L1TF 的一個特殊方面是對稱多執行緒 (SMT)。Intel 對 SMT 的實現稱為超執行緒 (HyperThreading)。受影響處理器上的超執行緒共享 L1 資料快取 (L1D) 這一點很重要。由於該缺陷只允許攻擊 L1D 中存在的資料,因此執行在一個超執行緒上的惡意訪客可以攻擊由同一物理核心的兄弟超執行緒上執行的上下文帶入 L1D 的資料。此上下文可以是主機作業系統、主機使用者空間或不同的訪客。

如果處理器不支援擴充套件頁表,則只有在虛擬機器監控程式不清理有效(影子)頁表內容的情況下才可能發生攻擊。

儘管存在完全緩解這些攻擊向量的解決方案,但 Linux 核心中預設不啟用這些緩解措施,因為它們會顯著影響效能。核心提供了多種機制,可以根據部署場景來利用這些機制解決問題。緩解措施、其保護範圍和影響將在後續章節中描述。

預設緩解措施及其選擇理由在本檔案末尾解釋。參見 預設緩解措施

L1TF 系統資訊

Linux 核心提供了一個 sysfs 介面來列舉系統的當前 L1TF 狀態:系統是否脆弱,以及哪些緩解措施處於活動狀態。相關 sysfs 檔案是

/sys/devices/system/cpu/vulnerabilities/l1tf

此檔案中可能的值是

‘未受影響’

處理器不受影響

‘緩解:PTE 反轉’

主機保護已啟用

如果啟用了 KVM/VMX 且處理器存在漏洞,則以下資訊將附加到“緩解:PTE 反轉”部分

  • SMT 狀態

    ‘VMX: SMT 易受攻擊’

    SMT 已啟用

    ‘VMX: SMT 已停用’

    SMT 已停用

  • L1D 重新整理模式

    ‘L1D 易受攻擊’

    L1D 重新整理已停用

    ‘L1D 條件性快取重新整理’

    L1D 重新整理條件性啟用

    ‘L1D 快取重新整理’

    L1D 重新整理無條件啟用

最終的保護等級將在以下章節中討論。

主機緩解機制

核心無條件地受到保護,可抵禦來自主機上執行的惡意使用者空間的 L1TF 攻擊。

訪客緩解機制

1. VMENTER 上的 L1D 重新整理

為了確保訪客無法攻擊 L1D 中存在的資料,虛擬機器監控程式在進入訪客之前重新整理 L1D。

重新整理 L1D 不僅驅逐了潛在惡意訪客不應訪問的資料,還會重新整理訪客資料。重新整理 L1D 會影響效能,因為處理器必須將已重新整理的訪客資料重新帶回 L1D。根據 VMEXIT/VMENTER 的頻率和訪客中的計算型別,已觀察到 1% 到 50% 的效能下降。對於訪客 VMEXIT/VMENTER 很少見的場景,效能影響最小。Virtio 和諸如釋出中斷之類的機制旨在將 VMEXIT 限制在最低限度,但特定配置和應用場景仍可能遭受高 VMEXIT 率的影響。

核心提供兩種 L1D 重新整理模式
  • 條件性(‘cond’)

  • 無條件性(‘always’)

條件模式避免了在相應的 VMENTER 之前僅執行經過審計的程式碼路徑的 VMEXIT 後重新整理 L1D。這些程式碼路徑已經過驗證,它們不會向攻擊者暴露秘密或其他有趣資料,但它們可能會洩露有關虛擬機器監控程式地址空間佈局的資訊。

無條件模式在所有 VMENTER 呼叫上重新整理 L1D 並提供最大保護。它的開銷高於條件模式。由於開銷取決於工作負載場景和產生的 VMEXIT 數量,因此無法準確量化。

一般建議是在 VMENTER 上啟用 L1D 重新整理。核心在受影響的處理器上預設為條件模式。

注意,L1D 重新整理並不能阻止 SMT 問題,因為兄弟執行緒也會將其資料帶回 L1D,從而使其再次受到攻擊。

管理員可以透過核心命令列和 sysfs 控制檔案控制 L1D 重新整理。參見 核心命令列上的緩解控制KVM 緩解控制 - 模組引數

2. 訪客 VCPU 限制到專用物理核心

為了解決 SMT 問題,可以將一個或一組訪客關聯到一個或多個物理核心。適當的機制是利用排他性 CPU 集 (cpusets) 來確保沒有其他訪客或主機任務可以在這些核心上執行。

如果只有一個訪客或相關訪客在同一物理核心的兄弟 SMT 執行緒上執行,那麼他們只能攻擊自己的記憶體和主機記憶體的受限部分。

當一個兄弟 SMT 執行緒在主機作業系統(虛擬機器監控程式)上下文中執行,而另一個在訪客上下文中執行時,主機記憶體是可被攻擊的。來自主機作業系統上下文的有價值資訊量取決於主機作業系統執行的上下文,即中斷、軟中斷和核心執行緒。除非對程式碼進行深入檢查,否則無法宣告來自這些上下文的有價值資料對攻擊者不感興趣。

注意,將訪客分配到一組固定的物理核心會影響排程器進行負載均衡的能力,並可能根據託管場景對 CPU 利用率產生負面影響。停用 SMT 對於特定場景可能是一個可行的替代方案。

有關將訪客限制到單個或一組核心的更多資訊,請查閱 cpusets 文件

https://kernel.linux.club.tw/doc/Documentation/admin-guide/cgroup-v1/cpusets.rst

3. 中斷親和性

中斷可以與邏輯 CPU 關聯。這並非普遍適用,因為有些中斷確實是每個 CPU 中斷,例如本地計時器中斷。除此之外,多佇列裝置會將其中斷關聯到每個佇列的單個 CPU 或 CPU 組,而不允許管理員控制這些關聯。

將可親和性控制的中斷從執行不受信任訪客的 CPU 移開,可以減少攻擊向量空間。

與執行不受信任訪客的 CPU 親和的中斷是否為攻擊者提供有趣資料取決於系統配置和在系統上執行的場景。儘管對於某些中斷可以假定它們不會暴露除主機作業系統記憶體佈局提示之外的有趣資訊,但無法做出一般性假設。

管理員可以透過 /proc/irq/$NR/smp_affinity[_list] 檔案控制中斷親和性。有限的文件可在以下地址找到

https://kernel.linux.club.tw/doc/Documentation/core-api/irq/irq-affinity.rst

4. SMT 控制

為防止 L1TF 的 SMT 問題,可能需要完全停用 SMT。停用 SMT 可能會對效能產生顯著影響,但其影響取決於託管場景和工作負載型別。停用 SMT 的影響還需要與限制訪客到專用核心等其他緩解解決方案的影響進行權衡。

核心提供了一個 sysfs 介面來檢索 SMT 狀態並控制它。它還提供了一個核心命令列介面來控制 SMT。

核心命令列介面包含以下選項

nosmt

影響引導期間輔助 CPU 的啟動。核心在引導過程中嘗試使所有存在的 CPU 上線。“nosmt”確保每個物理核心只有一個所謂的原主(超)執行緒被啟用。由於 Intel 處理器與機器檢查異常相關的設計缺陷,非原主兄弟執行緒必須至少部分啟動,然後再次關閉。“nosmt”可以透過 sysfs 介面撤銷。

nosmt=force

效果與“nosmt”相同,但不允許透過 sysfs 介面撤銷 SMT 停用。

sysfs 介面提供兩個檔案

  • /sys/devices/system/cpu/smt/control

  • /sys/devices/system/cpu/smt/active

/sys/devices/system/cpu/smt/control

此檔案允許讀取 SMT 控制狀態,並提供停用或(重新)啟用 SMT 的能力。可能的狀態是

開啟

CPU 支援 SMT 並已啟用。所有邏輯 CPU 都可以不受限制地上線和下線。

關閉

CPU 支援 SMT 並已停用。只有所謂的原主 SMT 執行緒可以不受限制地上線和下線。嘗試使非原主兄弟執行緒上線將被拒絕

強制關閉

與“off”相同,但狀態無法控制。寫入控制檔案的嘗試將被拒絕。

不支援

處理器不支援 SMT。因此它不受 L1TF SMT 影響。寫入控制檔案的嘗試將被拒絕。

可以寫入此檔案以控制 SMT 狀態的可能狀態是

  • 開啟

  • 關閉

  • 強制關閉

/sys/devices/system/cpu/smt/active

此檔案報告 SMT 是否已啟用並處於活動狀態,即任何物理核心上是否有兩個或更多兄弟執行緒線上。

SMT 控制也可以在引導時透過 l1tf 核心命令列引數結合 L1D 重新整理控制來實現。參見 核心命令列上的緩解控制

5. 停用 EPT

即使啟用了 SMT,為虛擬機器停用 EPT 也能為 L1TF 提供全面的緩解,因為訪客的有效頁表由虛擬機器監控程式管理和清理。儘管停用 EPT 會對效能產生顯著影響,尤其是在啟用了 Meltdown 緩解措施 KPTI 時。

EPT 可以在虛擬機器監控程式中透過“kvm-intel.ept”引數停用。

目前正在進行新的緩解機制的研究和開發,以解決停用 SMT 或 EPT 帶來的效能影響。

核心命令列上的緩解控制

核心命令列允許在引導時使用選項“l1tf=”控制 L1TF 緩解措施。此選項的有效引數是

完整

提供針對 L1TF 漏洞的所有可用緩解措施。停用 SMT 並啟用虛擬機器監控程式中的所有緩解措施,即無條件 L1D 重新整理

引導後仍然可以透過 sysfs 介面控制 SMT 和 L1D 重新整理。當第一臺虛擬機器以潛在不安全的配置(即 SMT 啟用或 L1D 重新整理停用)啟動時,虛擬機器監控程式將發出警告。

full,force

與“full”相同,但停用 SMT 和 L1D 重新整理執行時控制。暗示“nosmt=force”命令列選項。(即,SMT 的 sysfs 控制被停用。)

重新整理

保持 SMT 啟用,並啟用預設的虛擬機器監控程式緩解措施,即條件 L1D 重新整理

引導後仍然可以透過 sysfs 介面控制 SMT 和 L1D 重新整理。當第一臺虛擬機器以潛在不安全的配置(即 SMT 啟用或 L1D 重新整理停用)啟動時,虛擬機器監控程式將發出警告。

flush,nosmt

停用 SMT 並啟用預設的虛擬機器監控程式緩解措施,即條件 L1D 重新整理。

引導後仍然可以透過 sysfs 介面控制 SMT 和 L1D 重新整理。當第一臺虛擬機器以潛在不安全的配置(即 SMT 啟用或 L1D 重新整理停用)啟動時,虛擬機器監控程式將發出警告。

flush,nowarn

與“flush”相同,但當虛擬機器以潛在不安全的配置啟動時,虛擬機器監控程式不會發出警告。

關閉

停用虛擬機器監控程式緩解措施,並且不發出任何警告。它還取消了虛擬機器監控程式和裸機上的交換大小和可用 RAM 限制。

預設值為“flush”。有關 L1D 重新整理的詳細資訊,請參見 1. VMENTER 上的 L1D 重新整理

KVM 的緩解控制 - 模組引數

KVM 虛擬機器監控程式緩解機制(在進入訪客時重新整理 L1D 快取)可以透過模組引數控制。

選項/引數是“kvm-intel.vmentry_l1d_flush=”。它接受以下引數

始終

每次 VMENTER 時重新整理 L1D 快取。

cond

僅當 VMEXIT 和 VMENTER 之間的程式碼可能洩露對攻擊者來說“有趣”的主機記憶體時,才在 VMENTER 上重新整理 L1D。這仍然可能洩露主機記憶體,從而例如可以確定主機的地址空間佈局。

從不

停用緩解措施

該引數可以在核心命令列中提供,作為載入模組時的模組引數,並在執行時透過 sysfs 檔案修改

/sys/module/kvm_intel/parameters/vmentry_l1d_flush

預設值為“cond”。如果在核心命令列中給出“l1tf=full,force”,則強制執行“always”,kvm-intel.vmentry_l1d_flush 模組引數將被忽略,並且對 sysfs 檔案的寫入將被拒絕。

緩解選擇指南

1. 未使用虛擬化

系統受到核心的無條件保護,無需採取進一步行動。

2. 具有受信任訪客的虛擬化

如果訪客來自受信任的來源,並且訪客作業系統核心被保證已實施 L1TF 緩解措施,則系統完全受到 L1TF 的保護,無需採取進一步行動。

為避免 VMENTER 上預設 L1D 重新整理的開銷,管理員可以透過核心命令列和 sysfs 控制檔案停用重新整理。參見 核心命令列上的緩解控制KVM 緩解控制 - 模組引數

3. 具有不受信任訪客的虛擬化

3.1. SMT 不支援或已停用

如果處理器不支援 SMT,或在 BIOS 或核心中停用了 SMT,則只需在 VMENTER 上強制執行 L1D 重新整理。

條件 L1D 重新整理是預設行為,可以進行調整。參見 核心命令列上的緩解控制KVM 緩解控制 - 模組引數

3.2. EPT 不支援或已停用

如果處理器不支援 EPT 或在虛擬機器監控程式中停用了 EPT,則系統將受到完全保護。SMT 可以保持啟用,並且無需在 VMENTER 上重新整理 L1D。

EPT 可以在虛擬機器監控程式中透過“kvm-intel.ept”引數停用。

3.3. SMT 和 EPT 受支援並已啟用

如果 SMT 和 EPT 受支援並處於活動狀態,則可以採用不同程度的緩解措施

  • VMENTER 上的 L1D 重新整理

    VMENTER 上的 L1D 重新整理是最低保護要求,但它只有與其他緩解方法結合使用時才有效。

    條件 L1D 重新整理是預設行為,可以進行調整。參見 核心命令列上的緩解控制KVM 緩解控制 - 模組引數

  • 訪客限制

    將訪客限制到不執行任何其他程序的單個或一組物理核心,可以顯著減少攻擊面,但中斷、軟中斷和核心執行緒仍可能向潛在攻擊者暴露有價值的資料。參見 2. 訪客 VCPU 限制到專用物理核心

  • 中斷隔離

    將訪客 CPU 與中斷隔離可以進一步減少攻擊面,但仍允許惡意訪客探索有限的主機物理記憶體。這至少可以用於獲取有關主機地址空間佈局的知識。那些與執行不受信任訪客的 CPU 具有固定親和性的中斷,根據具體場景,仍可能觸發軟中斷並排程核心執行緒,從而可能暴露有價值的資訊。參見 3. 中斷親和性

上述三種緩解方法結合使用可以在一定程度上提供保護,但必須仔細分析剩餘攻擊面的風險。為了獲得全面保護,可以使用以下方法

  • 停用 SMT

    停用 SMT 並強制執行 L1D 重新整理可提供最大程度的保護。此緩解措施不依賴於上述任何緩解方法。

    SMT 控制和 L1D 重新整理可以透過命令列引數“nosmt”、“l1tf”、“kvm-intel.vmentry_l1d_flush”以及在執行時透過匹配的 sysfs 控制檔案進行調整。參見 4. SMT 控制核心命令列上的緩解控制KVM 緩解控制 - 模組引數

  • 停用 EPT

    停用 EPT 也提供了最大程度的保護。它不依賴於上述任何緩解方法。SMT 可以保持啟用,並且不需要 L1D 重新整理,但效能影響顯著。

    EPT 可以在虛擬機器監控程式中透過“kvm-intel.ept”引數停用。

3.4. 巢狀虛擬機器

使用巢狀虛擬化時,涉及三個作業系統:裸機虛擬機器監控程式、巢狀虛擬機器監控程式和巢狀虛擬機器。從巢狀虛擬機器監控程式到巢狀訪客的 VMENTER 操作將始終由裸機虛擬機器監控程式處理。如果 KVM 是裸機虛擬機器監控程式,它將

  • 在每次從巢狀虛擬機器監控程式切換到巢狀虛擬機器時重新整理 L1D 快取,以確保巢狀虛擬機器監控程式的秘密不會暴露給巢狀虛擬機器;

  • 在每次從巢狀虛擬機器切換到巢狀虛擬機器監控程式時重新整理 L1D 快取;這是一個複雜的操作,重新整理 L1D 快取可以避免裸機虛擬機器監控程式的秘密暴露給巢狀虛擬機器;

  • 指示巢狀虛擬機器監控程式不執行任何 L1D 快取重新整理。這是一種避免重複 L1D 重新整理的最佳化。

預設緩解措施

核心對易受攻擊處理器的預設緩解措施是

  • PTE 反轉以防止惡意使用者空間攻擊。這是無條件完成的,無法控制。交換儲存限制在約 16TB。

  • 當為訪客啟用 EPT 時,在 VMENTER 上進行 L1D 條件性重新整理。

核心預設不強制停用 SMT,這使得在執行啟用了 EPT 的不受信任訪客時,SMT 系統仍易受攻擊。

這一選擇的理由是

  • 強制停用 SMT 可能會破壞現有設定,尤其是在無人值守更新的情況下。

  • 如果普通使用者在其機器上執行不受信任的訪客,那麼 L1TF 只是不受信任訪客中可能嵌入的其他惡意軟體的附加項,例如垃圾郵件機器人或對本地網路的攻擊。

    從技術上講,沒有辦法阻止使用者盲目地在其機器上執行不受信任的程式碼。

  • 從技術上講,L1TF 極不可能透過 JavaScript 等最流行的攻擊機制被利用,因為這些機制無法控制 PTE,根據目前的知識甚至是不可能的。如果這可能發生且沒有其他緩解措施可行,那麼預設設定可能會有所不同。

  • 雲和託管設定的管理員必須仔細分析其場景的風險,並做出適當的緩解選擇,這甚至可能因其部署的機器而異,並導致其整體設定發生其他更改。核心無法為這種場景提供合理的預設設定。