次の方法で共有


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 参照が含まれるため、ドライバーをアンロードするときに不要な動作が発生します)。

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 ドライバーの有効期間を通じて有効であり、ドライバーがアンロードされるときに登録解除されます。 詳細については、以下を参照してください。

ブート ドライバーのコールバック

IoRegisterBootDriverCallbackIoUnRegisterBootDriverCallback を使用して、BOOT_DRIVER_CALLBACK_FUNCTIONを登録および登録解除します。

このコールバックは、すべてのブート開始ドライバーが初期化され、コールバック機能が機能しなくなった場合など、Windows から ELAM ドライバーへの状態更新を提供します。

コールバックの種類

BDCB_CALLBACK_TYPE列挙では、次の 2 種類のコールバックについて説明します。

  • 状態の更新を ELAM ドライバーに提供するコールバック (BdCbStatusUpdate)
  • AM ドライバーがイメージを初期化する前にブート開始ドライバーと依存 DLL を分類するために使用されるコールバック (BdCbInitializeImage)

2 つのコールバック型には、コールバックに固有の追加情報を提供する一意のコンテキスト構造があります。

状態更新コールバックのコンテキスト構造には、Windows 吹き出しを記述する 1 つの列挙型が含まれています。

イメージの初期化コールバックのコンテキスト構造は、読み込まれた各イメージのハッシュと証明書の情報を含む、より複雑です。 さらに、構造体には、AM ドライバーがドライバーの分類の種類を格納する出力パラメーターであるフィールドが含まれています。

状態更新コールバックから返されたエラーは致命的なエラーとして扱われ、システムのバグ チェックにつながります。 これにより、ELAM ドライバーは、AM ポリシーの外部で状態に達したタイミングを示す機能を提供します。 たとえば、AM ランタイム ドライバーが読み込まれ、初期化されていない場合、早期起動ドライバーは、AM ドライバーが読み込まれていない状態に Windows が入らないようにするために、アンロード準備コールバックに失敗する可能性があります。

イメージの初期化コールバックからエラーが返されると、イメージは不明として扱われます。 不明なドライバーは初期化されるか、OS ポリシーに基づいて初期化がスキップされます。

マルウェアシグネチャ

マルウェア署名データは AM ISV によって決定されますが、少なくともドライバー ハッシュの承認済みリストを含める必要があります。 署名データは、Winload によって読み込まれる HKLM の下の新しい "早期起動ドライバー" ハイブのレジストリに格納されます。 各 AM ドライバーには、署名バイナリ ラージ オブジェクト (BLOB) を格納する一意のキーがあります。 レジストリ パスとキーの形式は次のとおりです。

HKLM\ELAM\<VendorName>\

キー内では、ベンダーは任意の値を自由に定義して使用できます。 メジャー ブートによって測定される 3 つの定義済みのバイナリ BLOB 値があり、ベンダーは、それぞれを使用できます。

  • 測定済み
  • Policy
  • 設定

ELAM ハイブは、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 ドライバーはコールバックの登録を解除する必要があります。 登録解除はコールバック中に行うことはできません。ドライバーが DriverEntry 中に指定できる DriverUnload 関数で発生する必要があります。

マルウェア保護の継続性を維持し、適切なハンドオフを確保するには、早期起動 AM ドライバーがアンロードされる前にランタイム AM エンジンを起動する必要があります。 つまり、ランタイム AM エンジンは、早期起動 AM ドライバーによって検証されるブート ドライバーである必要があります。

[パフォーマンス]

ドライバーは、次の表に定義されているパフォーマンス要件を満たす必要があります。

シナリオ

開始時刻

終了時刻

上限

初期化を許可する前に、読み込まれたブート クリティカルドライバーを評価します。 これには、状態更新コールバックも含まれます。

カーネルはマルウェア対策ドライバーを呼び出して、読み込まれたブート クリティカル ドライバーを評価します。

マルウェア対策ドライバーは、評価結果を返します。

0.5 ミリ秒

読み込まれたすべてのブート クリティカル ドライバーを評価する

カーネルはマルウェア対策ドライバーを呼び出して、最初に読み込まれたブート クリティカル ドライバーを評価します。

マルウェア対策ドライバーは、最後のブート クリティカルなドライバーの評価結果を返します。

50 ミリ秒

フットプリント (ドライバー + メモリ内のコンフィギュレーションデータ)

なし

なし

128キロバイト

ドライバーの初期化

ブート ドライバーが 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 ドライバーがポリシー違反 (ルートキットなど) を検出した場合、システムが適切な状態であることを示す PCR を無効にするために、 Tbsi_Revoke_Attestation を直ちに呼び出す必要があります。 この関数は、システムに TPM がないなど、測定されたブートに問題がある場合にエラーを返します。

Tbsi_Revoke_Attestation カーネル モードから呼び出し可能です。 指定されていない値で PCR[12] を拡張し、TPM のイベントカウンターを増加させます。 どちらのアクションも必要であるため、ここから作成されるすべての引用符で信頼が壊れます。 その結果、メジャー ブート ログは、TPM の電源がオンになっている時間の残りの期間、TPM の現在の状態を反映せず、リモート システムはシステムのセキュリティ状態で信頼を形成できません。