薛定諤值得信賴的靴子。 英特爾引導衛士

薛定諤值得信賴的靴子。 英特爾引導衛士
我們建議再往下走低層,談談固件 x86 兼容計算機平台的安全性。 這一次,研究的主要成分是 Intel Boot Guard(不要與 Intel BIOS Guard 混淆!)——一種硬件支持的 BIOS 可信啟動技術,計算機系統供應商可以在生產階段永久打開或關閉它。 好吧,我們已經知道研究秘訣:通過逆向工程細化該技術的實施,描述其架構,用未記錄的細節填充它,用攻擊向量對其進行調味以品嚐和混合。 讓我們用一個故事來火上澆油,這個故事講述了多年來在幾個供應商的產品中克隆的錯誤如何允許潛在的攻擊者使用這項技術來創建一個隱藏的 rootkit,該 rootkit 無法在系統中刪除(即使是程序員)。

順便說一下,這篇文章是基於會議的報告“On Guard for Rootkit: Intel BootGuard” 零之夜 2016 第29次會議 俄羅斯 DefCon (兩個演示文稿 這裡).

用於 Intel 64 架構計算機平台的固件

首先,讓我們回答這個問題:採用 Intel 64 架構的現代計算機平台的固件是什麼? 當然,UEFI BIOS。 但這個答案不會準確。 讓我們看一下該架構的桌面(筆記本電腦)版本的圖。

薛定諤值得信賴的靴子。 英特爾引導衛士
基礎是鏈接:

  • 處理器(CPU,Central Processing Unit),除了主核心外,還內置了圖形核心(並非所有型號都有)和內存控制器(IMC,Integrated Memory Controller);
  • 芯片組(PCH,Platform Controller Hub),包含用於與外圍設備交互和管理子系統的各種控制器。 其中就有臭名昭著的Intel Management Engine(ME),它也有一個固件(Intel ME firmware)。

筆記本電腦,除了以上這些,還需要集成控制器(ACPI EC,Advanced Control and Power Interface Embedded Controller),負責電源子系統、觸摸板、鍵盤、Fn鍵(屏幕亮度、音量、鍵盤背光等)。)和更多。 而且他還有自己的固件。

所以,以上固件的組合就是計算機平台的固件(系統固件),存儲在一個普通的SPI閃存上。 為了讓這塊內存的使用者不至於弄糊塗,把這塊內存的內容分為以下幾個區域(如圖):

  • UEFI BIOS;
  • ACPI EC 固件(Skylake 處理器微架構(2015 年)出現了一個單獨的區域,但在野外我們還沒有看到它的使用示例,因此嵌入式控制器固件仍然是 UEFI BIOS 的一部分);
  • 英特爾 ME 固件;
  • 內置GbE(千兆以太網)網絡適配器的配置(MAC地址等);
  • 閃存描述符 - 閃存的主要區域,其中包含指向其他區域的指針以及訪問它們的權限。

薛定諤值得信賴的靴子。 英特爾引導衛士
對區域訪問的區分(根據指定的權限)由 SPI 總線主機處理 - 芯片組中內置的 SPI 控制器,通過它訪問該內存。 如果權限設置為英特爾推薦的值(出於安全原因),那麼 SPI 閃存的每個用戶都只能對其區域進行完全訪問(讀/寫)。 其餘的要么是只讀的,要么是不可訪問的。 已知事實:在許多系統上,CPU 可以完全訪問 UEFI BIOS 和 GbE,只能讀取閃存描述符,根本無法訪問 Intel ME 區域。 為什麼很多而不是全部? 推薦的是可選的。 我們將在本文後面告訴您更多信息。

保護計算機平台固件不被修改的機制

顯然,應該保護計算機平台的固件免受可能的危害,這將允許潛在的攻擊者在其中立足(在操作系統更新/重新安裝後倖存下來),以最高特權模式執行他們的代碼等。 當然,限定對 SPI 閃存區域的訪問是不夠的。 因此,針對每個執行環境的各種機制被用來保護固件不被修改。

因此,英特爾 ME 固件經過簽名以實現完整性和真實性控制,並在每次加載到 ME UMA 內存時由 ME 控制器進行檢查。 我們已經在其中一個討論過這個驗證過程 用品專用於 Intel ME 子系統。

通常,僅檢查 ACPI EC 固件的完整性。 但是,由於此二進製文件包含在 UEFI BIOS 中,它幾乎總是受到與 UEFI BIOS 使用的相同保護機制的約束。 讓我們談談他們。

這些機制可以分為兩類。

對 UEFI BIOS 區域的寫保護

  1. 使用寫保護跳線對 SPI 閃存的內容進行物理保護;
  2. 使用芯片組的 PRx 寄存器保護 UEFI BIOS 區域在 CPU 地址空間中的投影;
  3. 通過設置芯片組寄存器中的 BIOS_WE / BLE 和 SMM_BWP 位來生成和處理相應的 SMI 中斷來阻止寫入 UEFI BIOS 區域的嘗試;
  4. 這種保護的更高級版本是 Intel BIOS Guard (PFAT)。

除了這些機制之外,供應商還可以開發和實施自己的安全措施(例如,使用 UEFI BIOS 更新對膠囊進行簽名)。

重要的是要注意,在特定係統上(取決於供應商),並非所有上述保護機制都可以應用,它們可能根本不應用,或者它們可能以易受攻擊的方式實現。 您可以閱讀更多關於這些機制及其實施情況的信息 這篇文章. 對於那些感興趣的人,我們建議您閱讀有關 UEFI BIOS 安全性的整個系列文章 代碼拉什.

UEFI BIOS 身份驗證驗證

當我們談論可信啟動技術時,首先想到的是安全啟動。 但是,在架構上,它旨在驗證 UEFI BIOS 外部的組件(驅動程序、加載程序等),而不是固件本身。

因此,Intel在Bay Trail微架構(2012)的SoC中實現了硬件不可切換的安全啟動(Verified Boot),這與前述的安全啟動技術無關。 後來(2013 年),該機制得到改進,並以 Intel Boot Guard 的名稱發布,用於具有 Haswell 微體系結構的桌面。

在描述 Intel Boot Guard 之前,讓我們先了解一下 Intel 64 架構中的運行時,它們結合起來就是這種受信任的引導技術的信任根。

英特爾CPU

Cap暗示處理器是Intel 64架構中的主要執行環境,為什麼它也是信任根呢? 事實證明,正是由於擁有以下要素才使它如此:

  • Microcode ROM是一種用於存儲微碼的非易失性、不可重寫的存儲器。 微碼被認為是處理器指令系統在最簡單的指令上的實現。 也發生在微碼中 . 所以在 BIOS 中你可以找到帶有微代碼更新的二進製文件(它們在啟動時疊加,因為 ROM 無法被覆蓋)。 這些二進製文件的內容是加密的,這使得分析變得非常複雜(因此,微碼的具體內容只有開發者才知道),並進行了簽名以控製完整性和真實性;
  • 用於解密微碼更新內容的 AES 密鑰;
  • 驗證微代碼更新簽名的 RSA 公鑰的散列;
  • RSA 公鑰哈希,它檢查 Intel 開發的 ACM(認證代碼模塊)代碼模塊的簽名,當某些事件發生時,CPU 可以在 BIOS 啟動之前(hello 微代碼)或運行期間運行這些代碼模塊。

英特爾我

我們博客中的這個子系統專門用於 文章. 回想一下,這個可執行環境基於芯片組內置的微控制器,是系統中最隱蔽和最特權的環境。

儘管隱身,Intel ME 也是信任的根,因為它有:

  • ME ROM - 非易失性、不可重寫的存儲器(未提供更新方法),包含啟動代碼以及 RSA 公鑰的 SHA256 哈希值,用於檢查 Intel ME 固件的簽名;
  • 用於存儲秘密信息的 AES 密鑰;
  • 訪問集成到芯片組中的一組熔絲(FPF,現場可編程熔絲),用於永久存儲某些信息,包括計算機系統供應商指定的信息。

英特爾引導衛士 1.x

小免責聲明。 我們在本文中使用的 Intel Boot Guard 技術的版本號是任意的,可能與 Intel 內部文檔中使用的編號沒有任何關係。 此外,此處提供的有關此技術實施的信息是在逆向工程期間獲得的,與 Intel Boot Guard 的規範相比可能包含不准確的信息,Intel Boot Guard 的規範不太可能永遠發布。

因此,Intel Boot Guard (BG) 是一種硬件支持的 UEFI BIOS 身份驗證技術。 從它在[平台嵌入式安全技術揭曉,Chapter Boot with Integrity,or Not Boot]一書中的簡短描述來看,它作為一個可信的引導鏈工作。 而其中的第一個環節是CPU內部的引導代碼(微碼),由RESET事件觸發(不要與BIOS中的RESET向量混淆!)。 CPU在SPI閃存上找到Intel開發簽名的代碼模塊(Intel BG startup ACM),加載到自己的緩存中,進行驗證(上面已經提到CPU有一個公鑰hash來驗證ACM簽名) 並開始。

薛定諤值得信賴的靴子。 英特爾引導衛士

此代碼模塊負責驗證 UEFI BIOS 的一小部分起始部分 - 初始引導塊 (IBB),後者又包含用於驗證 UEFI BIOS 主要部分的功能。 因此,英特爾 BG 允許您在啟動操作系統之前驗證 BIOS 的真實性(這可以在安全啟動技術的監督下執行)。

英特爾 BG 技術提供兩種操作模式(一種不干擾另一種,即兩種模式都可以在系統上啟用,也可以禁用)。

測量引導

在測量引導 (MB) 模式下,每個引導組件(從 CPU 引導 R​​OM 開始)使用可信平台模塊 (TPM) 的功能“測量”下一個引導組件。 對於那些不知道的人,讓我解釋一下。

TPM有PCRs(Platform Configuration Registers),根據公式記錄哈希運算的結果:

薛定諤值得信賴的靴子。 英特爾引導衛士

那些。 當前的 PCR 值取決於前一個,只有當系統復位時,這些寄存器才會被復位。

因此,在 MB 模式下,在某個時間點,PCR 反映了被“測量”的代碼或數據的唯一(在哈希操作的能力範圍內)標識符。 PCR值可用於某些數據的加密(TPM_Seal)操作。 之後,只有當 PCR 值沒有因加載而改變(即,沒有一個“測量的”組件被修改)時,它們的解密(TPM_Unseal)才有可能。

驗證啟動

對於那些喜歡修改 UEFI BIOS 的人來說,最可怕的是 Verified Boot (VB) 模式,在該模式下,每個引導組件都會以加密方式驗證下一個組件的完整性和真實性。 並且在驗證錯誤的情況下,(以下之一)發生:

  • 超時關機從 1 分鐘到 30 分鐘(以便用戶有時間了解為什麼他的計算機無法啟動,並且如果可能的話,會嘗試恢復 BIOS);
  • 立即關機(這樣用戶就沒有時間去了解,也沒有時間去做);
  • 板著臉繼續工作(沒有時間安全的情況,因為有更重要的事情要做)。

動作的選擇取決於指定的英特爾 BG 配置(即所謂的強制執行策略),該配置由計算機平台供應商永久記錄在專門設計的存儲 - 芯片組保險絲(FPF)中。 稍後我們將更詳細地討論這一點。

除了配置之外,供應商還生成了兩個 RSA 2048 密鑰並創建了兩個數據結構(如圖所示):

  1. 供應商根密鑰清單(KEYM,OEM Root Key Manifest),裡面放了本清單的SVN(Security Version Number),下一個清單公鑰的SHA256哈希值,RSA公鑰(即公鑰部分)供應商根密鑰)來驗證此清單的簽名和簽名本身;
  2. IBB Manifest(IBBM,Initial Boot Block Manifest),裡面放了這個manifest的SVN,IBB的SHA256 hash,驗證這個manifest簽名的公鑰,以及簽名本身。

OEM 根密鑰的 SHA256 哈希被永久寫入芯片組熔絲 (FPF),就像英特爾 BG 配置一樣。 如果英特爾 BG 配置規定包含此技術,那麼從現在開始,此系統上只有 OEM Root Key 私有部分的所有者可以更新 BIOS(即能夠重新計算這些清單),即小販。

薛定諤值得信賴的靴子。 英特爾引導衛士

當您查看圖片時,您會立即懷疑是否需要這麼長的驗證鏈——您本可以使用一個清單。 為什麼要復雜化?

事實上,英特爾因此為供應商提供了為不同的產品線使用不同的 IBB 密鑰的機會,一個作為根。 如果 IBB 密鑰的私有部分(簽署第二個清單)被洩露,該事件只會影響一個產品線,並且只會影響到供應商生成一對新產品並在下一次 BIOS 更新中啟用重新計算的清單。

但是如果根密鑰被洩露(第一個清單用它簽名),將無法替換它,不提供撤銷程序。 該密鑰的公共部分的哈希值被一次性編程到 FPF 中。

英特爾引導防護配置

現在讓我們仔細看看英特爾 BG 配置及其創建過程。 如果您查看英特爾系統工具包 (STK) 閃存映像工具 GUI 中的相應選項卡,您會注意到英特爾 BG 配置包括供應商根密鑰公共部分的哈希值,一些模糊的價值觀等等。 英特爾 BG 簡介。

薛定諤值得信賴的靴子。 英特爾引導衛士

此配置文件的結構:

typedef struct BG_PROFILE
{
	unsigned long Force_Boot_Guard_ACM : 1;
	unsigned long Verified_Boot : 1;
	unsigned long Measured_Boot : 1;
	unsigned long Protect_BIOS_Environment : 1;
	unsigned long Enforcement_Policy : 2; // 00b – do nothing
                                              // 01b – shutdown with timeout
                                              // 11b – immediate shutdown
	unsigned long : 26;
};

總的來說,Intel BG 配置是一個非常靈活的實體。 例如,考慮 Force_Boot_Guard_ACM 標誌。 當清零時,如果沒有找到SPI flash上​​的BG啟動ACM模塊,將不會發生可信啟動。 這將是不可信的。

我們在上面已經寫過,可以配置 VB 模式的強制策略,以便如果驗證失敗,將再次發生不受信任的下載。

把這樣的事情留給供應商......

該實用程序的 GUI 提供以下“現成的”配置文件:


政權
描述

0
否_FVME
禁用英特爾 BG 技術

1
VE
VB 模式啟用,超時關閉

2
虛擬機
兩種模式都啟用(VB 和 MB),超時關閉

3
VM
兩種模式都啟用,無需關閉系統

4
FVE
VB 模式啟用,立即關閉

5
FVME
兩種模式都啟用,立即關閉

前面已經提到,Intel BG配置必須由系統供應商一次性寫入芯片組熔絲(FPF)——芯片組內部的一個小型(據未經證實的信息,只有256字節)硬件信息存儲,可以在外部進行編程英特爾的生產設施(這就是為什麼 現場可編程 保險絲)。

它非常適合存儲配置,因為:

  • 有一個一次性可編程的數據存儲區(就是寫Intel BG配置的地方);
  • 只有 Intel ME 可以讀取和編程它。

因此,為了在特定係統上設置英特爾 BG 技術的配置,供應商在生產期間執行以下操作:

  1. 使用 Flash Image Tool 實用程序(來自 Intel STK),創建具有給定 Intel BG 配置的固件映像作為 Intel ME 區域內的變量(所謂的 FPF 臨時鏡像);
  2. 使用閃存編程工具(來自英特爾 STK),將此映像寫入系統的 SPI 閃存並關閉所謂的。 製造模式(在這種情況下,相應的命令被發送到 Intel ME)。

作為這些操作的結果,Intel ME 將從 ME 區域中的 FPF 鏡像中向 FPF 提交指定值,將 SPI 閃存描述符中的權限設置為 Intel 推薦的值(在開頭描述)文章)並執行系統重置。

Intel Boot Guard實現分析

為了具體分析該技術在具體實例上的實現情況,我們對以下系統進行了Intel BG技術的痕跡檢測:

系統
注意

技嘉GA-H170-D3H
Skylake,有支持

技嘉GA-Q170-D3H
Skylake,有支持

技嘉GA-B150-HD3
Skylake,有支持

微星H170A Gaming Pro
Skylake,不支持

聯想ThinkPad 460
Skylake,支持可用,技術支持

聯想瑜伽2專業版
哈斯韋爾,不支持

聯想U330p
哈斯韋爾,不支持

“支持”是指存在英特爾 BG 啟動 ACM 模塊、上述清單以及 BIOS 中的相應代碼,即用於分析的實現。

我們以從辦公室下載的那個為例。 技嘉 GA-H170-D3H(F4 版)的 SPI 閃存供應商站點圖像。

英特爾 CPU 引導 R​​OM

首先,讓我們談談啟用英特爾 BG 技術後處理器的動作。

無法找到已解密微碼的樣本,因此,如何實施下面描述的操作(在微碼或硬件中)是一個懸而未決的問題。 然而,現代英特爾處理器“可以”執行這些操作是事實。

退出 RESET 狀態後,處理器(閃存內容已映射到其地址空間)找到 FIT(固件接口表)。 找到它很容易,指向它的指針寫在地址 FFFF FFC0h 處。

薛定諤值得信賴的靴子。 英特爾引導衛士
在此示例中,此地址包含值 FFD6 9500h。 轉向這個地址,處理器看到 FIT 表,其內容被分成記錄。 第一個條目是以下結構的標題:

typedef struct FIT_HEADER
{
	char           Tag[8];     // ‘_FIT_   ’
	unsigned long  NumEntries; // including FIT header entry
	unsigned short Version;    // 1.0
	unsigned char  EntryType;  // 0
	unsigned char  Checksum;
};

薛定諤值得信賴的靴子。 英特爾引導衛士
由於某些未知原因,校驗和並不總是在這些表中計算(該字段保留為空)。

其餘條目指向在執行 BIOS 之前需要解析/執行的各種二進製文件,即在切換到舊版 RESET 向量 (FFFF FFF0h) 之前。 每個這樣的條目的結構如下:

typedef struct FIT_ENTRY
{
	unsigned long  BaseAddress;
	unsigned long  : 32;
	unsigned long  Size;
	unsigned short Version;     // 1.0
	unsigned char  EntryType;
	unsigned char  Checksum;
};

薛定諤值得信賴的靴子。 英特爾引導衛士
EntryType 字段指示該條目指向的塊類型。 我們知道幾種類型:

enum FIT_ENTRY_TYPES
{
	FIT_HEADER = 0,
	MICROCODE_UPDATE,
	BG_ACM,
	BIOS_INIT = 7,
	TPM_POLICY,
	BIOS_POLICY,
	TXT_POLICY,
	BG_KEYM,
	BG_IBBM
};

現在很明顯,其中一個條目指向英特爾 BG 啟動 ACM 二進製文件的位置。 此二進製文件的標頭結構是 Intel 開發的代碼模塊(ACM、微代碼更新、Intel ME 代碼部分,...)的典型結構。

typedef struct BG_ACM_HEADER
{
	unsigned short ModuleType;     // 2
	unsigned short ModuleSubType;  // 3
	unsigned long  HeaderLength;   // in dwords
	unsigned long  : 32;
	unsigned long  : 32;
	unsigned long  ModuleVendor;   // 8086h
	unsigned long  Date;           // in BCD format
	unsigned long  TotalSize;      // in dwords
	unsigned long  unknown1[6];
	unsigned long  EntryPoint;
	unsigned long  unknown2[16];
	unsigned long  RsaKeySize;     // in dwords
	unsigned long  ScratchSize;    // in dwords
	unsigned char  RsaPubMod[256];
	unsigned long  RsaPubExp;
	unsigned char  RsaSig[256];
};

薛定諤值得信賴的靴子。 英特爾引導衛士
處理器將這個二進製文件加載到它的緩存中,驗證並啟動。

英特爾 BG 啟動 ACM

作為對該 ACM 工作的分析結果,很明顯它做了以下工作:

  • 從 Intel ME 接收寫入芯片組熔絲 (FPF) 的 Intel BG 配置;
  • 找到 KEYM 和 IBBM 清單,驗證它們。

為了找到這些清單,ACM 還使用 FIT 表,該表有兩種類型的條目指向這些結構(參見上面的 FIT_ENTRY_TYPES)。

讓我們仔細看看宣言。 在第一個清單的結構中,我們看到幾個模糊的常量,第二個清單中的公鑰哈希,以及作為嵌套結構簽名的公共 OEM 根密鑰:

typedef struct KEY_MANIFEST
{
	char           Tag[8];          // ‘__KEYM__’
	unsigned char  : 8;             // 10h
	unsigned char  : 8;             // 10h
	unsigned char  : 8;             // 0
	unsigned char  : 8;             // 1
	unsigned short : 16;            // 0Bh
	unsigned short : 16;            // 20h == hash size?
	unsigned char  IbbmKeyHash[32]; // SHA256 of an IBBM public key
	BG_RSA_ENTRY   OemRootKey;
};

typedef struct BG_RSA_ENTRY
{
	unsigned char  : 8;             // 10h
	unsigned short : 16;            // 1
	unsigned char  : 8;             // 10h
	unsigned short RsaPubKeySize;   // 800h
	unsigned long  RsaPubExp;
	unsigned char  RsaPubKey[256];
	unsigned short : 16;            // 14
	unsigned char  : 8;             // 10h
	unsigned short RsaSigSize;      // 800h
	unsigned short : 16;            // 0Bh
	unsigned char  RsaSig[256];
};

薛定諤值得信賴的靴子。 英特爾引導衛士
為了驗證 OEM Root Key 的公鑰,我們記得使用了來自 fuses 的 SHA256 哈希,此時已經從 Intel ME 收到了它。

讓我們繼續第二個宣言。 它由三個結構組成:

typedef struct IBB_MANIFEST
{
	ACBP Acbp;         // Boot policies
	IBBS Ibbs;         // IBB description
	IBB_DESCRIPTORS[];
	PMSG Pmsg;         // IBBM signature
};

第一個包含一些常量:

typedef struct ACBP
{
	char           Tag[8];          // ‘__ACBP__’
	unsigned char  : 8;             // 10h
	unsigned char  : 8;             // 1
	unsigned char  : 8;             // 10h
	unsigned char  : 8;             // 0
	unsigned short : 16;            // x & F0h = 0
	unsigned short : 16;            // 0 < x <= 400h
};

第二個包含 IBB 的 SHA256 散列和描述 IBB 內容的描述符的數量(即散列的計算依據):

typedef struct IBBS
{
	char           Tag[8];            // ‘__IBBS__’
	unsigned char  : 8;               // 10h
	unsigned char  : 8;               // 0
	unsigned char  : 8;               // 0
	unsigned char  : 8;               // x <= 0Fh
	unsigned long  : 32;              // x & FFFFFFF8h = 0
	unsigned long  Unknown[20];
	unsigned short : 16;              // 0Bh
	unsigned short : 16;              // 20h == hash size ?
	unsigned char  IbbHash[32];       // SHA256 of an IBB
	unsigned char  NumIbbDescriptors;
};

IBB 描述符遵循此結構,一個接一個。 它們的內容具有以下格式:

typedef struct IBB_DESCRIPTOR
{
	unsigned long  : 32;
	unsigned long  BaseAddress;
	unsigned long  Size;
};

很簡單:每個描述符都包含 IBB 塊的地址/大小。 因此,這些描述符指向的塊的串聯(按照描述符本身的順序)是 IBB。 而且,通常,IBB 是 SEC 和 PEI 階段所有模塊的組合。

第二個清單以包含 IBB 公鑰(由第一個清單的 SHA256 哈希驗證)和此清單的簽名的結構結尾:

typedef struct PMSG
{
	char           Tag[8];            // ‘__PMSG__’
	unsigned char  : 8;               // 10h
	BG_RSA_ENTRY   IbbKey;
};

薛定諤值得信賴的靴子。 英特爾引導衛士
因此,即使在 UEFI BIOS 執行開始之前,處理器也會啟動 ACM,這將使用 SEC 和 PEI 階段代碼驗證部分內容的真實性。 接下來,處理器退出 ACM,沿著 RESET 向量移動,並開始執行 BIOS。

PEI 驗證分區必須包含一個模塊,該模塊將檢查 BIOS 的其餘部分(DXE 代碼)。 該模塊已經由 IBV(獨立 BIOS 供應商)或系統供應商本身開發。 因為只有 Lenovo 和 Gigabyte 系統可供我們使用並且具有 Intel BG 支持,讓我們考慮從這些系統中提取的代碼。

UEFI BIOS 模塊 LenovoVerifiedBootPei

就聯想而言,它原來是聯想開發的 LenovoVerifiedBootPei {B9F2AC77-54C7-4075-B42E-C36325A9468D} 模塊。

它的工作是查找(通過 GUID)DXE 的哈希表並驗證 DXE。

if (EFI_PEI_SERVICES->GetBootMode() != BOOT_ON_S3_RESUME)
{
	if (!FindHashTable())
		return EFI_NOT_FOUND;
	if (!VerifyDxe())
		return EFI_SECURITY_VIOLATION;
}

Хеш таблица {389CC6F2-1EA8-467B-AB8A-78E769AE2A15} имеет следующий формат:

typedef struct HASH_TABLE
{
	char          Tag[8];            // ‘$HASHTBL’
	unsigned long NumDxeDescriptors;
	DXE_DESCRIPTORS[];
};

typedef struct DXE_DESCRIPTOR
{
	unsigned char BlockHash[32];     // SHA256
	unsigned long Offset;
	unsigned long Size;
};

UEFI BIOS 模塊 BootGuardPei

就技嘉而言,它原來是由 AMI 開發的 BootGuardPei {B41956E1-7CA2-42DB-9562-168389F0F066} 模塊,因此存在於任何支持英特爾 BG 的 AMI BIOS 中。

它的操作算法有些不同,但是歸結起來是一樣的:

int bootMode = EFI_PEI_SERVICES->GetBootMode();

if (bootMode != BOOT_ON_S3_RESUME &&
    bootMode != BOOT_ON_FLASH_UPDATE &&
    bootMode != BOOT_IN_RECOVERY_MODE)
{
	HOB* h = CreateHob();
	if (!FindHashTable())
		return EFI_NOT_FOUND;
	WriteHob(&h, VerifyDxe());
	return h;
}

它查找的哈希表 {389CC6F2-1EA8-467B-AB8A-78E769AE2A15} 具有以下格式:

typedef HASH_TABLE DXE_DESCRIPTORS[];

typedef struct DXE_DESCRIPTOR
{
	unsigned char BlockHash[32];     // SHA256
	unsigned long BaseAddress;
	unsigned long Size;
};

英特爾引導衛士 2.x

讓我們簡單談談 Intel Boot Guard 的另一種實現,它是在基於具有 Apollo Lake 微架構的 Intel SoC 的較新系統 - ASRock J4205-IT 中發現的。

雖然這個版本只會在 SoC 中使用(採用 Kaby Lake 處理器微架構的新系統繼續使用 Intel Boot Guard 1.x),但對於探索基於 Intel SoC 的平台的新架構選項具有很大的興趣,這已經看到了切實的變化,例如:

  • BIOS 和 Intel ME 區域(或者更確切地說,根據 Intel SoC 術語,Intel TXE)現在是一個 IFWI 區域;
  • 雖然平台啟用了Intel BG,但在flash memory中並沒有發現FIT、KEYM、IBBM等結構;
  • 除了 TXE 和 ISH 內核 (x86) 之外,芯片組中還添加了第三個內核(又是 ARC)——PMC(電源管理控制器),用於確保電源子系統的可操作性和性能監控。

薛定諤值得信賴的靴子。 英特爾引導衛士
新 IFWI 區域的內容是一組以下模塊:

移位

描述

0000 2000小時
SMIP
一些平台配置,由供應商簽署

0000 6000小時
RBEP
英特爾 TXE 固件代碼部分,x86,由英特爾簽名

0001 0000小時
PMCP
固件代碼部分 Intel PMC,ARC,由 Intel 簽名

0002 0000小時
FTPR
英特爾 TXE 固件代碼部分,x86,由英特爾簽名

0007B000h
超臨界COD
英特爾簽署的 CPU 微代碼更新

0008 0000小時
IBBP
UEFI BIOS、SEC/PEI 階段、x86、供應商簽名

0021 8000小時
國際衛生保健中心
英特爾 ISH 固件的代碼部分,x86,由供應商簽名

0025 8000小時
網絡FTP
英特爾 TXE 固件代碼部分,x86,由英特爾簽名

0036 1000小時
國際聯合會
不明

0038 1000小時
OBBP
UEFI BIOS,DXE 階段,x86,未簽名

在分析 TXE 固件的過程中,很明顯在 RESET 之後,TXE 將處理器保持在該狀態,直到它為 CPU 準備好地址空間的基本內容(FIT、ACM、RESET 向量...)。 此外,TXE 將此數據放在其 SRAM 中,之後它暫時為處理器提供在那裡的訪問權限,並將其從 RESET 中“釋放”。

防範 Rootkit

好吧,現在讓我們繼續討論“熱門”。 我們曾經發現,在許多系統上,SPI 閃存描述符具有訪問 SPI 閃存區域的權限,因此該內存的所有用戶都可以寫入和讀取任何區域。 那些。 決不。

在使用 MEinfo 實用程序(來自 Intel STK)進行檢查後,我們發現這些系統上的製造模式並未關閉,因此芯片組保險絲 (FPF) 處於不確定狀態。 是的,在這種情況下既未啟用也未禁用 Intel BG。

我們正在討論以下系統(關於 Intel BG 以及本文後面將介紹的內容,我們將討論具有 Haswell 處理器微架構及更高版本的系統):

  • 所有技嘉產品;
  • 所有 MSI 產品;
  • 21 款聯想筆記本電腦型號和 4 款聯想服務器型號。

當然,我們向這些供應商以及英特爾報告了這一發現。

只有來自 聯想誰承認了這個問題並且 發布補丁.

技嘉 他們似乎接受了有關該漏洞的信息,但沒有以任何方式發表評論。

MSI 在我們要求發送我們的公共 PGP 密鑰(以便向他們發送加密的安全建議)時完全停止。 他們表示他們“是硬件製造商,不製造 PGP 密鑰”。

但更重要的是。 由於熔絲處於未定義狀態,用戶(或攻擊者)可以自己對它們進行編程(最困難的是 找到英特爾 STK). 這需要以下步驟。

1. 引導至 Windows 操作系統(通常,如果您為所需操作系統開發了英特爾 STK 的類似物,則下面描述的步驟也可以在 Linux 下完成)。 使用 MEinfo 實用程序,確保該系統上的保險絲未被編程。

薛定諤值得信賴的靴子。 英特爾引導衛士
2. 使用閃存編程工具讀取閃存的內容。

薛定諤值得信賴的靴子。 英特爾引導衛士
3. 使用任何 UEFI BIOS 編輯工具打開讀取的圖像,進行必要的更改(例如,實施 rootkit),創建/編輯 ME 區域中現有的 KEYM 和 IBBM 結構。

薛定諤值得信賴的靴子。 英特爾引導衛士
薛定諤值得信賴的靴子。 英特爾引導衛士
RSA 密鑰的公共部分在圖片中突出顯示,其哈希將與英特爾 BG 配置的其餘部分一起被編程到芯片組保險絲中。

4. 使用閃存映像工具構建新的固件映像(通過設置英特爾 BG 配置)。

薛定諤值得信賴的靴子。 英特爾引導衛士
5. 使用閃存編程工具將新映像寫入閃存,使用 MEinfo 驗證 ME 區域現在包含英特爾 BG 配置。

薛定諤值得信賴的靴子。 英特爾引導衛士
6. 使用閃存編程工具關閉製造模式。

薛定諤值得信賴的靴子。 英特爾引導衛士
7. 系統將重新啟動,之後,您可以使用 MEinfo 驗證 FPF 是否已編程。

薛定諤值得信賴的靴子。 英特爾引導衛士
這些動作 永遠 在此系統上啟用 Intel BG。 撤消操作將是不可能的,這意味著:

  • 只有根密鑰私有部分的所有者(即啟用英特爾 BG 的人)才能更新此系統上的 UEFI BIOS;
  • 如果您將原始固件返回到此系統,例如,使用編程器,它甚至不會打開(驗證錯誤時執行策略的結果);
  • 要擺脫這樣的 UEFI BIOS,您需要用“乾淨”的芯片組替換帶有編程 FPF 的芯片組(即,如果您可以以汽車的價格使用紅外焊台,則重新焊接芯片組,或者只是更換主板).

要了解這樣的 Rootkit 可以做什麼,您需要評估是什麼使得在 UEFI BIOS 環境中執行您的代碼成為可能。 比如說,在處理器的最高特權模式下 - SMM。 這樣的 Rootkit 可能具有以下屬性:

  • 與操作系統並行執行(您可以通過生成 SMI 中斷來配置處理,該中斷將由定時器觸發);
  • 具有處於 SMM 模式的所有優勢(對 RAM 和硬件資源的內容的完全訪問,操作系統的保密性);
  • Rootkit 代碼可以在 SMM 模式下啟動時進行加密和解密。 任何僅在 SMM 模式下可用的數據都可以用作加密密鑰。 例如,來自 SMRAM 中一組地址的散列。 要獲得此密鑰,您需要進入 SMM。 這可以通過兩種方式完成。 在 SMM 代碼中找到 RCE 並利用它,或者將您自己的 SMM 模塊添加到 BIOS,這是不可能的,因為我們啟用了 Boot Guard。

因此,此漏洞允許攻擊者:

  • 在系統中創建一個隱藏的、不可刪除的、用途不明的 rootkit;
  • 在英特爾 SoC 中的一個芯片組核心上執行您的代碼,即在英特爾 ISH 上(仔細查看圖片)。

薛定諤值得信賴的靴子。 英特爾引導衛士
薛定諤值得信賴的靴子。 英特爾引導衛士
儘管尚未探索英特爾 ISH 子系統的功能,但它似乎是針對英特爾 ME 的一個有趣的攻擊媒介。

發現

  1. 該研究對英特爾 Boot Guard 技術的工作原理進行了技術描述。 通過模糊模型減去英特爾安全性中的幾個秘密。
  2. 提出了一個攻擊場景,允許在系統中創建一個不可刪除的 rootkit。
  3. 我們已經看到,現代英特爾處理器甚至能夠在 BIOS 啟動之前執行大量專有代碼。
  4. 採用 Intel 64 架構的平台越來越不適合運行自由軟件:硬件驗證、越來越多的專有技術和子系統(SoC 芯片組中的三個核心:x86 ME、x86 ISH 和 ARC PMC)。

緩解措施

故意讓製造模式​​保持開放狀態的供應商絕對應該關閉它。 到目前為止,他們只是閉上眼睛,新的 Kaby Lake 系統就證明了這一點。

用戶可以通過運行帶有 -closemnf 選項的閃存編程工具在他們的系統(受所述漏洞影響)上禁用英特爾 BG。 首先,您應該確保(使用 MEinfo)在 ME 區域中英特爾 BG 的配置提供了在 FPF 中編程後完全關閉該技術的功能。

來源: www.habr.com

添加評論