韌體攻擊面縮小 (FASR)

在 2019 年 10 月,Microsoft 與 OEM 和晶片合作夥伴密切合作,啟動安全核心電腦。 這些裝置具有深度整合的硬體、韌體和軟體,可協助確保裝置、身分識別和資料的安全性增強。 安全核心電腦的核心安全性要素之一是協助為裝置提供韌體保護。 滿足此要素所需的基本硬體型功能是 測量 (D-RTM) 的動態根信任。 不過,目前沒有許多裝置提供 D-RTM,因為基礎晶片組的相依性可支援這項功能,因此會阻礙我們對於所有 Windows 裝置提供並遵守高安全性列的承諾。

您可以完成更多動作,以增強所有 Windows 裝置的安全性狀態,包括沒有 D-RTM 的裝置。 為了協助關閉此差距,Microsoft 已開始與合作夥伴合作,藉由開發一組開放原始碼 SMM 安全性增強功能,來克服防止記憶體保護在 UEFI 韌體中套用的相容性問題,以提供額外的彈性讓 OEM 運用。

為了反映韌體安全性的承諾,我們識別出新的方法來確保裝置可以符合安全核心電腦的韌體保護需求。

FASR 概觀

對於缺少硬體型 D-RTM 功能的安全核心電腦,我們必須定義一組小型韌體元件,這些元件會呈現降低的攻擊面,而且可以在作業系統中證明。 此方法稱為 韌體攻擊面縮小 (FASR) 。 若要讓 FASR 型韌體跨不同廠商的電腦進行調整,必須定義韌體開機程式的新方法。

FASR 支援兩個開機路徑:

  1. 認證的開機路徑:

    • 只允許由 Microsoft 信任、簽署和整合的程式碼執行。

    • 作業系統可偵測到開機路徑的竄改。

    下圖顯示認證開機路徑上的 FASR S-RTM 開機流程。 此開機路徑有助於防止非預期的平臺韌體程式碼執行。 不過,它會使用自訂開機路徑所提供的一些平臺特定資料。 下圖顯示認證開機路徑上的 FASR 開機流程。

    F 認證開機路徑上的 S R 開機流程

  2. 自訂開機路徑: 所有平臺韌體程式碼都可以執行。 特定 OEM/平臺專屬的開機重要資訊會轉換成自訂開機路徑上的資料,並由認證的開機路徑用來在該開機路徑上正確設定系統。 下圖顯示自訂開機路徑上的 FASR 開機流程。

    自訂開機路徑上的 F S R 開機流程

    已啟用安全核心電腦合規性的 FASR 裝置,預設為經過認證的開機路徑,除非發生導致開機在韌體開機程式中早期切換至自訂開機路徑的事件。 這類事件的範例包括韌體更新、使用者要求韌體 UI,或使用者已選擇停用安全核心電腦,這表示他們一律會在自訂開機路徑上開機,直到重新啟用為止。

    請注意,自訂開機可用來開機任何作業系統或協力廠商軟體,如支援 FASR 裝置上的平臺韌體所支援,但 Windows 無法將自訂開機路徑上的開機辨識為安全核心電腦相容。

為了進一步瞭解 FASR 背後的安全性技術,我們想要分享 Windows 開機程式的快速概觀。

Windows 開機程式

根信任

新式電腦中的初始韌體執行會遵循開機程式,其中一組初始程式碼會載入其他程式碼,而功能層級會在開機進行時擴充。 每組程式碼都會驗證構成信任鏈結的下一組程式碼。 當 UEFI 韌體取得控制權時,它會遵循驗證軟體簽章 的安全開機 標準,以繼續作業系統的信任鏈結。 然後,Windows 開機載入 器會繼續信任鏈結,此鏈結會先驗證啟動程式中的所有其他 OS 元件,再載入它。

一般而言,攻擊者會在啟用安全性功能和鎖定之前,儘快在開機程式中取得控制權。 當系統重設時,執行的初始程式碼集必須錨定在信任中。 滿足執行此早期程式碼驗證角色的硬體驗證技術稱為 根信任目錄。 雖然確切的詳細資料會因硬體廠商而異,但所有根信任目錄通常會以 SOC 中的不可變硬體或 ROM 為根。

測量開機

安全開機錨定在根信任目錄中,有助於確保已驗證所有韌體數位簽章;不過,也想要有確切執行韌體之記錄。 Windows 硬體相容性計畫要求所有Windows 10和Windows 11電腦都包含稱為信賴平臺模組的晶片, (TPM) 。 TPM 包含稱為平臺設定暫存器 (PCR) 的記憶體位置。 每個 PCI 都包含在開機期間載入的程式碼和/或資料的雜湊,例如非變動性儲存裝置上的韌體程式碼 (,例如 SPI 快閃) 、PCI 裝置的選項 ROM 或 OS 開機載入器。 可以儲存在PCR 中的值大小取決於支援的雜湊演算法摘要大小。 例如,SHA-1PC 可以儲存 20 個位元組,而 SHA-2PC 可以儲存 32 個位元組。 與相同雜湊演算法相關聯的多個 PCR 稱為銀行。 TCG PC 用戶端 TPM 設定檔規格會定義至少包含一個具有 24 個暫存器的 PC BANK。

當 TPM 存在時,每個韌體元件也可以隨著開機程式中載入新的程式碼和資料來更新或擴充適當的PC。 擴充程式會使用與新程式碼或資料引數串連的新程式碼或資料引數串連的目前PCR 值,更新為雜湊演算法的輸出。 結果是可以在開機程式之後檢查 PCR,以判斷執行的內容。 這可讓作業系統中的軟體瞭解開機程式是否與先前的開機程式不同。 在安全性敏感性環境中,作業系統可以通知特定 PCR 中預期的確切程式碼測量集,以偵測非預期的韌體程式碼執行。 由於銀行中的前 16 個 PCR 只能藉由重設整個 TPM 來重設,因此是信任的,以及儲存 TPM 中重要度量的慣用位置。

測量的根信任

既然我們已檢查根信任目錄的角色,以及測量開機的使用方式,我們將探討兩種常見的方法,以建立根信任,以向 TPM 報告度量鏈結:靜態和動態。

測量 (S-RTM 的靜態根目錄) 會在系統重設時建立信任,並要求在整個開機過程中維護信任。 如果開機程式中的任何時間點都遭入侵信任,在系統重設之前將無法復原。 下圖說明如何在經認證的開機路徑上使用 S-RTM。

靜態根信任測量

相反地,測量的動態根目錄 (D-RTM) 只會信任早期晶片組初始化韌體代碼的一小部分,以及用來在開機期間動態重新建立信任的硬體代理程式。 系統一開始可以開機進入不受信任的韌體程式碼,但在啟動後不久,藉由控制所有 CPU 並強制它們關閉已知且測量的路徑,以還原為信任的狀態。 下圖提供傳統 D-RTM 流程的概觀。

動態信任度量根目錄

S-RTM 與 D-RTM 之間有取捨。 S-RTM 不需要特殊硬體功能,但需要軟體以更妥善地考慮在整個開機期間執行的程式碼。 D-RTM 需要特殊的硬體功能,但允許軟體在系統的存留期內動態啟動至信任的狀態。

Windows 安全核心電腦已使用安全啟動中的 D-RTM,讓廣泛的系統製造商能夠彈性地實作韌體中的獨特功能和體驗,同時協助確保系統可以達到可接受裝載安全作業系統環境的信任和測量狀態。 D-RTM 啟動事件可用來在載入安全核心之前,從未知的環境重新建立信任。 下圖顯示 D-RTM 啟動事件,以重新建立已知的系統內容。

D R T M 啟動事件,以重新建立已知的系統內容

在過去,S-RTM 可能會在更多裝置中實作,因為它不依賴特殊硬體功能來驗證系統的安全性狀態,但作業系統沒有可靠的方法來確認它可能會信任使用 S-RTM 在任何指定的 Windows 裝置上回報的度量。

韌體安全性增強功能

將 OS 開機路徑中的韌體元件最小化

信任 S-RTM 測量的其中一種方式是減少允許執行到最小集合的韌體元件。 如果所有使用 S-RTM 的裝置都使用相同的韌體元件集,則作業系統只需要信任一組已知和信任的元件預期的PCR 值。 透過此 SRTM 型方法,當一組開機韌體經過驗證,只包含 Windows 可證明的 Microsoft 簽署軟體時,裝置可以視為符合安全核心電腦的韌體保護需求。 若要進一步瞭解這些韌體元件與一般電腦開機中的元件有何不同,讓我們在前後檢查開機程式。

由於新式電腦韌體所提供的彈性和豐富的功能集,在作業系統之前執行的程式碼會導致攻擊面增加。 下圖顯示傳統 S-RTM 開機流程的範例。

傳統 S R T M 開機流程

在開機期間韌體的主要責任可以大幅簡化為:

  • 平臺特定:僅適用于特定平臺硬體設計的功能。

  • 非平臺特定:業界標準且與其他硬體通用的功能。

較小型的新式韌體子集通常是平臺特定的。 許多執行一般工作的韌體基礎結構程式碼,例如配置記憶體、分派韌體驅動程式、處理事件等等,在所有 (或大部分) UEFI 型系統之間都相同。 這些工作的韌體二進位驅動程式可以跨電腦重複使用。 此外,業界標準硬體規格和介面可讓常見的韌體驅動程式初始化硬碟、USB 控制器和其他周邊。 此硬體的韌體二進位驅動程式也可以跨電腦重複使用。 總而言之,電腦可以使用非常最少的一組通用韌體驅動程式來開機。

減少開機期間載入的韌體驅動程式總數可能會導致其他優點:

  • 改善開機時間

  • 更新的降低廠商協調

  • 降低錯誤暴露率

  • 降低受攻擊面

FASR 開機路徑驗證和安全核心合規性

若要讓 FASR 系統符合安全核心電腦的韌體保護需求,必須在認證的開機路徑上開機。 FASR 韌體可藉由將名為 FASR 資訊清單的 Microsoft 簽署資訊清單提供給作業系統, (測量到 TPM) ,其中包含認證路徑上模組開機順序的預期PC 值。 這可以與認證路徑上發生的實際開機順序進行比較。 如果這些度量相符,系統會將系統視為符合安全核心電腦程式的韌體保護需求。 與預期的認證開機路徑順序的任何偏差,都會對作業系統偵測到 TPM 的平臺設定暫存器 (PCR) 進行非預期的測量。

此外,Windows 只會在成功驗證已簽署的 FASR 資訊清單時,針對目前開機期間所記錄的度量,釋放 Hypervisor 保護的秘密。 如果在認證的開機路徑或密封更新上,FASR 資訊清單不存在、簽章驗證失敗或發生一個不相符的 BIOS,而且不會解除密封或移轉 VSM 秘密。

FASR 韌體如何解決記憶體保護和 SMM

現在已定義具有最少功能集的單一 Microsoft 簽署二進位檔,它可包含 Microsoft 與合作夥伴合作以上市的基本但缺少韌體安全性保護。 認證的開機路徑至少必須符合下列需求:

  1. 程式碼不會讀取/寫入 Null/第 0 頁

  2. 影像程式碼和資料區段會分開

  3. 影像區段對齊頁面 (4KB) 界限

  4. 資料只會配置至資料記憶體類型,並將程式碼配置至程式碼記憶體類型

  5. 程式碼映射不會從以 UEFI 二進位檔散發的程式碼載入, (只載入指定的發送器)

  6. 程式碼會保留在已配置記憶體緩衝區的界限內,且頁面配置周圍有防護頁面

  7. 可以偵測堆疊溢位

  8. 程式碼不會從堆疊執行

  9. /NXCOMPAT DLL 特性設定為啟用 NX 保護

協力廠商選項 ROM、UEFI 應用程式和 UEFI 驅動程式通常未根據這組需求來建置或驗證。 因此,它們不會在認證的開機路徑上執行。 自訂開機路徑可以選擇性地選擇降低所需的保護層級,但該開機路徑不會被視為作業系統符合安全核心電腦規範。

系統管理模式 (SMM)

SMM 是 x86 架構中的特殊處理器作業模式。 由於 SMM 環境中執行的程式碼對作業系統而言不透明,而且通常會以最高許可權等級執行,因此系統安全性會面臨獨特的挑戰, (有時稱為主機處理器上任何軟體的「通道 -2」) 。 輸入時,SMM 會藉由設定頁面資料表、中斷分派資料表 (IDT) 和其他系統結構,來設定自己的環境。 因此,SMM 代表惡意程式碼可能利用的重大受攻擊面,以入侵或規避透過虛擬化型安全性 (VBS) 啟用的 OS 保護。 為了協助減輕 SMM 所造成的危險,SMM 中的功能可以概念上分割成 SMM 核心基礎結構和 SMM 驅動程式,如下所示:

  • SMM 核心:執行架構和基礎結構責任的所有 SMM 實作通用程式碼

  • SMM 驅動程式:撰寫以在 SMM 中完成平臺特定工作的程式碼

SMM 生命週期中的一些重要時刻如下:

  1. 建立 SMM 基礎 (或核心) 時 – SMM 初始程式載入 (IPL)

  2. 載入 SMM 驅動程式時 – 稱為 SMM 驅動程式分派

  3. 發生 SMM 專案時 – 透過系統管理中斷 (SMI)

SMM 初始程式載入 (IPL)

CPU 具有特殊功能,可授與 SMM 程式碼其高許可權,並協助保護它。 例如,已定義機制以透過軟體或硬體事件輸入 SMM、使用 CPU 指令從 SMM 傳回,並定義數個暫存器來控制 SMM 的存取和鎖定設定。 其中許多控制暫存器是由 SMM IPL 程式碼所設定,以限制 SMM 程式碼和資料儲存 (稱為系統管理 RAM 或 SMRAM) 記憶體區域的存取。

由於 SMRAM 區域位於主要記憶體 (DRAM) 中,因此在開機期間啟用 DRAM 之前無法建立。 DRAM 啟用程式會因晶片廠商而異,但大部分的程式碼可以直接從 CPU LLC 快取執行, (包括可在主要記憶體可用之前初始化 DRAM) 的程式碼。

FASR 韌體讓 SMM IPL 點比大多數其他系統還早。 這可減少攻擊者在設定 SMM 之前必須破壞此程式並控制系統的機會。 若要進一步瞭解這項功能和其他對 FASR 韌體中 SMM 所做的改進,我們需要深入瞭解韌體開機程式。

UEFI 韌體中的平臺初始化 (PI) 開機

新式電腦韌體是以許多規格為基礎所建置。 UEFI 規格會定義 UEFI 相容作業系統之間的介面,例如 Windows 和裝置上的韌體。 另一個名為 Platform Initialization (PI) Specification 的規格會定義韌體驅動程式的建置方式,並詳細說明開機程式本身。 概括而言,您可以將 UEFI 規格視為其中一種標準化,讓單一 Windows 映像能夠與許多不同的裝置搭配使用,而且 PI 規格可以視為其中一種標準化,讓來自不同硬體廠商的韌體映射能夠一起運作。 這兩種規格都是由 UEFI 論壇維護。

PI 規格會定義開機階段,以及哪些驅動程式會寫入開機階段。 在韌體開機期間,每個階段都會交握到下一個階段,而且在大部分情況下,不會再使用階段遞交的驅動程式,而且只會將重要資料傳遞至下一個階段,以便繼續開機程式。 開機階段可以摘要如下:

  1. SEC – 取得 CPU 重設向量的控制,並從元件轉換至 C 程式碼以載入 PEI

  2. PEI – 初始化系統狀態以載入 DXE 並初始化 DRAM

  3. DXE – 執行剩餘的系統初始化,包括提供支援 BDS 需要載入作業系統

  4. BDS – 探索目前開機 (的開機選項,例如 OS 開機載入器) 並嘗試開機該選項

  5. OS – 作業系統核心

保護 SMM 初始程式載入 (IPL)

傳統 UEFI PI 規格相容韌體會在 DXE 開機階段載入 SMM IPL。 FASR 韌體會在 PEI 開機階段載入 SMM IPL。 系統的信任運算基底 (TCB) 是保護它的總保護機制集,包括硬體、韌體和軟體。 藉由將 SMM IPL 從 DXE 移至 PEI,整個 DXE 階段 (比 PEI) 還大且更豐富的環境會從 TCB 中移除。 下圖顯示稍早在 UEFI 開機程式中移動的 SMM IPL。

先前在 UE F I 開機程式中移動的 M M M I P L

PEI 和 DXE 程式碼會在信號 0 執行,而且不會保存 (,但作業系統) 少數例外狀況。 SMM 程式碼執行的許可權遠高於通道 0 (,且 Hypervisor 會) 並保存到作業系統,因此不允許 DXE 弱點影響 SMM 的建立,可降低整體系統受攻擊面。 此外,因為稍早在開機程式中啟動 SMM,所以設定為協助保護 SMM 的鎖定位可在開機中稍早啟用,進一步將攻擊者的視窗降至最低以入侵 SMM。

保護 SMM 驅動程式分派程式

在 PI 規格中,定義了兩種 SMM 模式:傳統 MM 和獨立 MM。 傳統 MM 相當於過去用於 PI 相容韌體中的 SMM 軟體模型,這構成業界大部分的 UEFI 韌體。 獨立 MM 是一種相對新的模式,可修改歷程記錄模型以改善 SMM 環境的安全性,並避免傳統 MM 實作中常見的錯誤,導致多年來有許多可攜性和安全性挑戰。

FASR 韌體在獨立 MM 模式中以獨佔方式運作。 這可讓 FASR 韌體遵循在 SMM 中執行軟體的專業領域方法。 現今有許多以 SMM 為基礎的弱點,是因為傳統 MM 中 SMM 程式碼中允許的不良做法,因此只能在獨立 MM 中移除。 概括而言,這是因為在傳統 MM 模型中,SMM 驅動程式會分派兩次,一次是由信號 0 中的 DXE 發送器分派一次,再由 SMM 中的 SMM 發送器分派。 這可讓 DXE 環境中執行的驅動程式程式碼有機會快取 SMRAM 外部資源的指標,這些指標不應在進入點傳回之後存取。 依賴 SMM 程式碼呼叫 SMM 外部程式碼的攻擊通常稱為「SMM 注標攻擊」。

保護 SMM 的專案

資料會透過稱為「通訊緩衝區」的結構傳遞至 SMI 處理常式。 SMI 處理常式負責驗證資料是否符合進入點的特定需求。 Windows SMM 安全性風險降低資料表 (WSMT) 是一種機制,用來協助降低未核取之 SMI 處理常式對作業系統中虛擬化型安全性造成的威脅。 Microsoft 已為 Tcore 專案提供程式碼,以改善通訊緩衝區驗證。 除了利用這兩種技術之外,FASR 程式碼也會實作嚴格的記憶體存取保護,讓 SMM 程式碼只存取明確允許的記憶體範圍。

管理模式監督員 (MM 監督員)

SMM 核心程式代碼很常見,且與系統之間幾乎無變更共用。 SMM 所加加的攻擊面可藉由對 SMM 環境引進特殊許可權來大幅降低。 基於這個理由,FASR 韌體包含在獨立 MM 中執行的 SMM 監督員。 這會導致定義完善的 SMM 環境,具有從建立強制執行許可權等級的最低 TCB。 MM 監督員會限制 IO 埠存取、模型特定註冊 (MSR) 存取、MMIO 存取、CPU 儲存狀態存取,以及在 SMM 環境中允許的指示。 SMM 監督員原則可用來設定要限制的硬體資源確切詳細資料,而這些確切的詳細資料可能會隨著晶片產生而變更。

此原則最近已轉換為預設拒絕方法,可大幅減少 SMM 監督員外部程式碼可用的硬體資源。 此監督員在沒有硬體相依于新式電腦中通常找不到的任何硬體功能的情況下運作。

MM 監督員用於 FASR 是開放原始碼,可在 Project Mu MM 監督員存放庫中取得。

符合安全核心電腦需求的 FASR 系統合規性

下表指出安全核心電腦的廣泛安全性要素或目標,以及如何在認證路徑中啟動 FASR 系統,達到安全核心電腦的需求:

安全性優點 安全核心電腦的安全性功能
建立硬體支援的根信任 安全開機
信賴平台模組 2.0
DMA) 保護 (直接記憶體存取
(防禦韌體層級攻擊,請參閱下列注意事項) 系統防護安全啟動 (D-RTM) 或 S-RTM (FASR FW)
系統管理模式 (SMM) 隔離或獨立 MM 與 MM 監督員 (FASR FW)
保護 OS 免于執行未驗證的程式碼 記憶體完整性 (也稱為 HVCI)
提供進階身分識別驗證和保護 Windows Hello
保護遺失或遭竊裝置時的重要資料 BitLocker 加密

如果系統沒有進階的安全性功能可支援 D-RTM,則可以使用 S-RTM 和獨立 MM 與 MM 監督員的組合來符合韌體保護需求,這兩者都是由 FASR 韌體提供。

摘要

這些是 Microsoft 為了解決現今產業中不斷成長的韌體攻擊而進行的一些投資。 藉由針對這些變更使用開放原始碼程式碼,我們讓合作夥伴能夠利用其中一些安全性優點,進而讓更廣泛的生態系統和產業受益。

安全核心電腦方案的主要目標是協助確保客戶能夠存取 Windows 電腦可用的一些最進階安全性功能。 有了其中一些韌體變更,我們會更接近實現該目標,並已更新安全核心電腦的韌體保護需求,以反映此包含專案。 在這裡深入瞭解安全核心電腦。