驅動程式安裝必須使用現有的工具進行線上和離線安裝,並透過一般 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 參考,這會導致卸載驅動程式時發生不必要的行為。
您也必須在 ELAM 驅動程式的 INF 檔案中包含 SignatureAttributes 區段 。
備份驅動程式安裝
若要在 ELAM 驅動程式不小心損毀時提供復原機制,ELAM 安裝程式也會在備份位置安裝驅動程式的複本。 這將允許 WinRE 檢索乾淨的副本並恢復安裝。
安裝程式會從儲存在BackupPath金鑰的備份檔案位置讀取内容。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\EarlyLaunch
然後,安裝程式會將備份複本放在 regkey 中指定的資料夾中。
AM 驅動程式初始化
Windows 開機載入程式 Winload 會在移交至 Windows 核心之前,將所有開機啟動驅動程式及其相依 DLL 載入記憶體。 開機啟動驅動程式代表在初始化磁碟堆疊之前需要初始化的裝置驅動程式。 這些驅動程式包括磁碟堆疊和磁碟區管理員,以及作業系統裝置的檔案系統驅動程式和匯流排驅動程式。
AM 驅動程式回呼介面
ELAM 驅動程式會使用回呼來為 PnP 管理員提供每個開機啟動驅動程式和相依 DLL 的描述,而且它可以將每個開機映像分類為已知良好的二進位檔、已知的錯誤二進位檔或未知的二進位檔。
預設作業系統原則是不會初始化已知的錯誤驅動程式和 DLL。 政策可以設定,並由 Winload 作為開機驗證過程的一部分進行測量。
PnP 會使用 AM 驅動程式所提供的原則和分類來決定是否要初始化每個開機映像。
登錄回調
早期啟動驅動程式可以使用登錄或開機驅動程式回呼來監視和驗證用作每個開機啟動驅動程式輸入的組態數據。 組態資料會儲存在系統登錄配置區中,該配置是由 Winload 載入,並在開機驅動程式初始化時提供。
備註
在系統開機之前,會捨棄 ELAM 登錄配置區的任何變更。 因此,ELAM 驅動程式應該使用適用於 Windows 的標準事件追蹤 (ETW) 記錄,而不是寫入登錄。
這些回呼函式在 ELAM 驅動程式的生命週期內有效,而且會在卸載驅動程式時取消註冊。 如需詳細資訊,請參閱:
驅動程式開機回呼
使用 IoRegisterBootDriverCallback 和 IoUnRegisterBootDriverCallback 來註冊和取消註冊 BOOT_DRIVER_CALLBACK_FUNCTION。
此回呼提供從 Windows 到 ELAM 驅動程式的狀態更新,包括當所有開機啟動驅動程式都已初始化,且回呼功能不再運作時。
回呼類型
BDCB_CALLBACK_TYPE 枚舉描述兩種回呼類型:
- 用於提供 ELAM 驅動程式狀態更新的回呼(BdCbStatusUpdate)
- AM 驅動程式使用的回呼,用於在初始化其映像(BdCbInitializeImage)之前,對開機驅動程式和相依 DLL 進行分類。
這兩個回呼類型具有唯一的內容結構,可提供回呼特有的其他資訊。
狀態更新回呼的上下文結構包含描述 Windows 標注的單一列舉類型。
初始化圖像回調的上下文結構更複雜,包含每個載入圖像的雜湊和憑證資訊。 結構也包含輸出參數的欄位,其中 AM 驅動程式會儲存驅動程式的分類類型。
從狀態更新回呼傳回的錯誤會被視為嚴重錯誤,並導致系統錯誤檢查。 這可讓 ELAM 驅動程式指出何時達到 AM 原則外部的狀態。 例如,如果未載入和初始化 AM 執行階段驅動程式,則 Early Launch 驅動程式可能會失敗準備卸載回呼,以防止 Windows 進入未載入 AM 驅動程式的狀態。
當從影像初始化回呼返回錯誤時,該影像將被視為未知。 未知驅動程式會根據 OS 原則進行初始化或略過其初始化。
惡意軟體特徵碼
惡意代碼簽章數據是由 AM ISV 所決定,但至少應該包含已核准的驅動程式雜湊清單。 簽章資料被儲存在由 Winload 載入的 HKLM 下的新「早期啟動驅動程式」分支的登錄中。 每個 AM 驅動程式都有一把獨特的金鑰,用於儲存其簽名的二進位大型物件(BLOB)。 登錄路徑和機碼的格式為:
HKLM\ELAM\<VendorName>\
在索引鍵內,廠商可以自由定義和使用任何值。 已定義的三個二進位資料塊值是由測量開機過程所測量的,廠商可以選擇使用每個值。
- 經過測量
- 原則
- 設定
ELAM Hive 會在 Early Launch Antimalware 使用之後卸載,以提高效能。 如果使用者模式服務想要更新簽章資料,它應該從檔案位置 \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 驅動程式驗證的啟動驅動程式。
績效
驅動程式必須符合下表所定義的效能需求:
場景 |
開始時間 |
結束時間 |
上限 |
在允許初始化之前,先評估載入的開機重要驅動程式。 這也包括狀態更新回呼函式。 |
核心(Kernel)會回呼反惡意軟體驅動程式,以評估載入的啟動關鍵驅動程式。 |
反惡意代碼驅動程式會傳回評估結果。 |
0.5毫秒 |
評估所有載入的開機關鍵驅動程式 |
內核會回呼反惡意軟體驅動程式,以評估最先載入的開機重要驅動程式。 |
反惡意代碼驅動程式會傳回上次開機關鍵驅動程式的評估結果。 |
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 的目前狀態,而且遠端系統將無法在系統的安全性狀態中形成信任。