共用方式為


ELAM 驅動程式需求

驅動程式安裝必須使用現有的工具進行線上和離線安裝,並透過一般 INF 處理來註冊驅動程式。 如需範例 ELAM 驅動程式程式碼,請參閱下列內容: https://github.com/Microsoft/Windows-driver-samples/tree/main/security/elam

AM 驅動程式安裝

為了確保驅動程式安裝相容性,ELAM 驅動程式會將本身公告為開機啟動驅動程式,類似于所有其他開機啟動驅動程式。 INF 會將開始類型設定為 SERVICE_BOOT_START (0) ,這表示驅動程式應該由開機載入器載入,並在核心初始化期間初始化。 ELAM 驅動程式會將其群組公告為「早期啟動」。 此群組中驅動程式的早期啟動行為將會在 Windows 中實作,如下一節所述。

以下是 ELAM 驅動程式 INF 的驅動程式安裝區段範例。

[SampleAV.Service]
DisplayName    = %SampleAVServiceName%
Description    = %SampleAVServiceDescription%
ServiceType    = 1       ; SERVICE_KERNEL_DRIVER
StartType      = 0       ; SERVICE_BOOT_START
ErrorControl   = 3       ; SERVICE_ERROR_CRITICAL
LoadOrderGroup = “Early-Launch”

因為 AM 驅動程式沒有擁有任何裝置,所以必須將 AM 驅動程式安裝為舊版,因此驅動程式只會新增為登錄中的服務。 (如果 AM 驅動程式安裝為一般 PNP 驅動程式,則會將其新增至登錄的列舉區段,因此會有 PDO 參考,這會導致卸載 driver.)

您也需要在 ELAM 驅動程式的 INF 檔案中包含 SignatureAttributes 區段

備份驅動程式安裝

為了在 ELAM 驅動程式意外損毀時提供復原機制,ELAM 安裝程式也會在備份位置安裝驅動程式的複本。 這可讓 WinRE 擷取全新複本並復原安裝。

安裝程式會從儲存在 中的 BackupPath 金鑰讀取備份檔案位置

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\EarlyLaunch

然後,安裝程式會將備份複本放在 regkey 中指定的資料夾中。

AM 驅動程式初始化

Windows 開機載入器 Winload 會將所有開機啟動驅動程式及其相依 DLL 載入至記憶體,再交接至 Windows 核心。 開機啟動驅動程式代表必須在磁片堆疊初始化之前初始化的設備磁碟機。 這些驅動程式包括磁片堆疊和磁片區管理員,以及作業系統裝置的檔案系統驅動程式和匯流排驅動程式。

AM 驅動程式回呼介面

ELAM 驅動程式會使用回呼來為 PnP 管理員提供每個開機啟動驅動程式和相依 DLL 的描述,而且可以將每個開機映射分類為已知的良好二進位檔、已知錯誤的二進位檔或未知的二進位檔。

預設作業系統原則不會初始化已知的不良驅動程式和 DLL。 原則可以設定,並由 Winload 測量為開機證明的一部分。

PnP 會使用 AM 驅動程式所提供的原則和分類來決定是否初始化每個開機映射。

登錄回呼

早期啟動驅動程式可以使用登錄或開機驅動程式回呼來監視和驗證每個開機啟動驅動程式的輸入所使用的設定資料。 組態資料會儲存在系統登錄區中,這是由 Winload 載入,而且可在開機驅動程式初始化時使用。

注意

在系統開機之前,會捨棄 ELAM 登錄區的任何變更。 因此,ELAM 驅動程式應該使用適用于 Windows (ETW 的標準事件追蹤) 記錄,而不是寫入登錄。

這些回呼在 ELAM 驅動程式的存留期內有效,並在卸載驅動程式時取消註冊。 如需詳細資訊,請參閱:

開機驅動程式回呼

使用 IoRegisterBootDriverCallbackIoUnRegisterBootDriverCallback 來註冊和取消註冊 BOOT_DRIVER_CALLBACK_FUNCTION

此回呼會提供從 Windows 到 ELAM 驅動程式的狀態更新,包括當所有開機啟動驅動程式都已初始化且回呼設備不再運作時。

回呼類型

BDCB_CALLBACK_TYPE列舉描述兩種類型的回呼:

  • 提供 ELAM 驅動程式狀態更新的回呼, (BdCbStatusUpdate)
  • AM 驅動程式用來分類開機啟動驅動程式和相依 DLL 的回呼,再將其映射初始化 (BdCbInitializeImage)

這兩個回呼類型具有唯一的內容結構,可提供回呼特定的其他資訊。

狀態更新回呼的內容結構包含描述 Windows 圖說文字的單一列舉類型。

初始化映射回呼的內容結構較為複雜,其中包含每個載入映射的雜湊和憑證資訊。 結構也包含一個欄位,這是 AM 驅動程式儲存驅動程式分類類型的輸出參數。

從狀態更新回呼傳回的錯誤會被視為嚴重錯誤,並導致系統錯誤檢查。 這可讓 ELAM 驅動程式指出何時到達 AM 原則以外的狀態。 例如,如果未載入和初始化 AM 執行時間驅動程式,早期啟動驅動程式可能會使準備到卸載回呼失敗,以防止 Windows 在未載入 AM 驅動程式的情況下進入狀態。

當從初始化映射回呼傳回錯誤時,會將映射視為未知。 未知的驅動程式會初始化,或根據 OS 原則略過其初始化。

惡意程式碼簽章

惡意程式碼簽章資料是由 AM ISV 決定,但至少應包含已核准的驅動程式雜湊清單。 簽章資料會儲存在登錄中,並儲存在 Winload 所載入之 HKLM 下的新「早期啟動驅動程式」Hive 中。 每個 AM 驅動程式都有唯一的金鑰,用來儲存其簽章二進位大型物件 (BLOB) 。 登錄路徑和機碼的格式如下:

HKLM\ELAM\<VendorName>\

在索引鍵內,廠商可以免費定義及使用任何值。 測量開機測量的二進位 Blob 值有三個定義,廠商可以使用每個值:

  • 測量
  • 原則
  • Config

ELAM Hive 會在早期啟動反惡意程式碼軟體使用後卸載,以達到效能。 如果使用者模式服務想要更新簽章資料,它應該從檔案位置 \Windows\System32\config\ELAM 掛接 Hive 檔案。 例如,您可以產生 UUID、將它轉換成字串,然後使用它作為掛接 Hive 的唯一索引鍵。 這些資料 BLOB 的儲存和擷取格式會保留給 ISV,但簽章資料必須經過簽署,AM 驅動程式才能驗證資料的完整性。

驗證惡意程式碼簽章

驗證惡意程式碼簽章資料完整性的方法會保留給每個 AM ISV。 CNG 密碼編譯基本函式可用來協助驗證惡意程式碼簽章資料的數位簽章和憑證。

惡意程式碼簽章失敗

如果 ELAM 驅動程式檢查簽章資料的完整性,且該檢查失敗,或如果沒有簽章資料,ELAM 驅動程式的初始化仍會成功。 在此情況下,針對每個開機驅動程式,ELAM 驅動程式必須針對每個初始化回呼傳回「未知」。 此外,ELAM 驅動程式應該在啟動之後,將此資訊傳遞至執行時間 AM 元件。

卸載 AM 驅動程式

回呼 StatusType 為 BdCbStatusPrepareForUnload 時,這是 AM 驅動程式的指示,指出所有開機驅動程式都已初始化,而且 AM 驅動程式應該準備卸載。 卸載之前,早期啟動 AM 驅動程式必須取消註冊其回呼。 取消註冊無法在回呼期間發生;而是必須在 DriverUnload 函式中發生,驅動程式可以在 DriverEntry 期間指定。

若要維持惡意程式碼保護的持續性,並確保適當的交接,應該在卸載早期啟動 AM 驅動程式之前啟動執行時間 AM 引擎。 這表示執行時間 AM 引擎應該是早期啟動 AM 驅動程式所驗證的開機驅動程式。

效能

驅動程式必須符合下表中定義的效能需求:

案例

開始時間

結束時間

上限

先評估載入的開機關鍵驅動程式,再允許它初始化。 這也包括狀態更新回呼。

核心會回呼反惡意程式碼驅動程式,以評估已載入的開機關鍵驅動程式。

反惡意程式碼驅動程式會傳回評估結果。

0.5ms

評估所有載入的開機關鍵驅動程式

核心會回呼反惡意程式碼驅動程式,以評估第一個載入的開機關鍵驅動程式。

反惡意程式碼驅動程式會傳回最後一個開機關鍵驅動程式的評估結果。

50 毫秒

磁片使用量 (驅動程式 + 記憶體中的設定資料)

N/A

N/A

128kB

初始化驅動程式

ELAM 驅動程式評估開機驅動程式之後,核心會使用 ELAM 傳回的分類來決定是否初始化驅動程式。 此決策是由原則所決定,並儲存在登錄中,網址為:

HKLM\System\CurrentControlSet\Control\EarlyLaunch\DriverLoadPolicy

這可以透過已加入網域的用戶端上的群組原則進行設定。 反惡意程式碼解決方案可能會想要在非受控案例中向終端使用者公開這項功能。 下列值是針對 DriverLoadPolicy 所定義的:

PNP_INITIALIZE_DRIVERS_DEFAULT 0x0  (initializes known Good drivers only)
PNP_INITIALIZE_UNKNOWN_DRIVERS 0x1  
PNP_INITIALIZE_BAD_CRITICAL_DRIVERS 0x3 (this is the default setting)
PNP_INITIALIZE_BAD_DRIVERS 0x7

開機失敗

如果因為初始化原則而略過開機驅動程式,核心會繼續嘗試初始化清單中的下一個開機驅動程式。 這會繼續執行,直到驅動程式全部初始化,或開機失敗,因為略過開機的開機驅動程式對開機很重要。 如果磁片堆疊啟動之後發生當機,則發生損毀傾印,其中包含有關原因或當機的一些資訊,以包含遺漏驅動程式的相關資訊。 這可用於 WinRE,以判斷失敗的原因,並嘗試補救。

ELAM 和測量開機

如果 ELAM 驅動程式在 rootkit (偵測到原則違規,例如) ,它應該立即呼叫 Tbsi_Revoke_Attestation ,使表示系統處於良好狀態的 PCR 失效。 如果測量開機發生問題,函式會傳回錯誤,例如系統上沒有 TPM。

Tbsi_Revoke_Attestation 可從核心模式呼叫。 它會以未指定的值擴充PCR[12],並遞增 TPM 中的事件計數器。 這兩個動作都是必要的,因此信任會從此處開始建立的所有引號中中斷。 因此,測量開機記錄不會反映 TPM 的目前狀態,在 TPM 已啟動的其餘時間,遠端系統將無法在系統的安全性狀態中形成信任。