Windows 10 Driver Verifier の「コードの整合性チェック」フラグについて

こんにちは、JS です。今回は、ドライバー検証用ツール Driver Verifier にて Windows 10 で新しく追加された機能について、紹介していきたいと思います。

 

Driver Verifier は、OS に標準で含まれているドライバー検証用のツールで、さなえすさんの記事「ドライバー検証ツール」でも使い方などが紹介されています。

この Driver Verifier ですが、Windows 10 では新しいフラグが追加されました。「コードの整合性チェック」と呼ばれるものです。

「コードの整合性チェック」フラグが何を検証するか、そしてフラグをどのように設定するのかをについて、以下に記載しましたので、ご参照いただけたらと思います。

 

「コードの整合性チェック」フラグは、どの動作をチェックするのか?

「コードの整合性チェック」フラグは、対象ドライバーに対し、カーネル メモリ内に「書き込み可能」と同時に「実行可能」なコードがあるかどうかを確認します。前述のようなコードが見つかった場合、Bug Check が作動し、BSoD と共にダンプ ファイルが作成されます。

ダンプ ファイルを WinDbg で開き、!analyze -v を行うと以下の記述が確認できます。

 

0: kd> !analyze -v

*******************************************************************************

* *

* Bugcheck Analysis *

* *

*******************************************************************************

 

DRIVER_VERIFIER_DETECTED_VIOLATION (c4)

A device driver attempting to corrupt the system has been caught. This is

because the driver was specified in the registry as being suspect (by the

administrator) and the kernel has enabled substantial checking of this driver.

If the driver attempts to corrupt the system, bugchecks 0xC4, 0xC1 and 0xA will

be among the most commonly seen crashes.

Arguments:

Arg1: 0000000000002003, Code Integrity Issue: The image contains an executable and writable section.

Arg2: <第 2 引数>, The image file name (Unicode string).

Arg3: <第 3 引数>, The address of the section header.

Arg4: <第 4 引数>, The section name (UTF-8 encoded string).

 

上記 出力結果内の赤文字からも分かる通り、「コードの整合性チェック」フラグにより、Driver Verifier は「書き込み可能」と同時に「実行可能」なコードがカーネル ドライバー内にあることを検知しました。

なお、「コードの整合性チェック」フラグでは、以下のような Bugcheck も確認できます。ここでは、Pool が実行可能であることがトリガーとなっています。出力結果より、Driver Verifier が、ドライバーが実行不可能 (Non Executable) な Pool を指定してメモリの割り当てをすることを期待していることがわかります。

 

0: kd> !analyze -v

*******************************************************************************

* *

* Bugcheck Analysis *

* *

*******************************************************************************

 

DRIVER_VERIFIER_DETECTED_VIOLATION (c4)

A device driver attempting to corrupt the system has been caught. This is

because the driver was specified in the registry as being suspect (by the

administrator) and the kernel has enabled substantial checking of this driver.

If the driver attempts to corrupt the system, bugchecks 0xC4, 0xC1 and 0xA will

be among the most commonly seen crashes.

Arguments:

Arg1: 0000000000002000, Code Integrity Issue: The caller specified an executable pool type. (Expected: NonPagedPoolNx)

Arg2: <第 2 引数>, The address in the driver's code where the error was detected.

Arg3: <第 3 引数>, Pool Type.

Arg4: <第 4 引数>, Pool Tag (if provided).

 

Driver Verifier でフラグを設定するには?

Driver Verifier で「コードの整合性チェック」フラグを有効にする方法は 2 通りあります。それぞれの手順は以下の通りです。

 

1. GUI から設定する方法

Driver Verifier の GUI から設定を行えます。

a. まず Verifier を起動します。[タスクの選択] にて、 「カスタム設定を作成する (コード開発者用)」 を選択し 、[次へ] をクリックします。

 

clip_image001

 

b.    「完全な一覧からの個別の設定の選択」にて各フラグの一覧が表示されます。「テストの種類」コラムでは、一番下の項目として「コードの整合性チェック」があります。 「有効?」 コラム内のチェックボックスを ON にし、 [次へ] をクリックします。

 

clip_image002

 

c. [検証するドライバーの選択] から、任意のオプションで対象のドライバーを選択します。ここでは例として、 「一覧からドライバーを選択する」 オプションを選択し [次へ] をクリックした後、適当なドライバーを選択し、 [完了] をクリックしています。

 

clip_image003

 

clip_image004

 

d. コンピューターの再起動を促すダイアログが表示されます。 [OK] をクリックして終了です。

 

2. コマンドラインから実行する方法

「コードの整合性チェック」オプションは、フラグの値として、0x02000000 が指定されています。

有効にするためには、コマンドプロンプトより、以下のコマンドを入力します。

 

verifier.exe /flags 0x02000000 /driver <対象ドライバー名>.sys

 

この場合も、設定を有効にするためにはコンピューターを再起動する必要があります。

 

なぜ検証をする必要があるのか?

カーネル ドライバーが、Driver Verifier の「コードの整合性チェック」フラグによる検証の中 Bugcheckを起こさずに実行できることは、ハードウェア互換性プログラムへの申請を行う上で必要です。

 

互換性プログラムへの申請の上で利用する、認定用のテスト ツール Hardware Lab Kit (HLK) では、Driver Verifier 上のこのフラグを使用した上で検証を進める、HyperVisor Code Integrity Readiness Test と呼ばれるテストがあります。

ハードウェア互換性プログラムへの申請を検討している際は、申請を可能とする条件として、このテストを問題なく実行する必要がございますので、予めご確認ください。以下の MSDN サイトから、テストの詳細が記載されております。

 

DF - HyperVisor Code Integrity Readiness Test

https://msdn.microsoft.com/en-us/library/windows/hardware/dn955152(v=vs.85).aspx

 

補足 : 「コードの整合性チェック」フラグの用途について

「コードの整合性チェック」フラグは、Windows 10 より追加された、Device Guard と呼ばれる、OS 内の機能に合わせてできたものです。Device Guard (デバイス ガード) は、信頼された者より署名されたモジュールしか実行できないようにするために、Windows 10 Enterprise で実装された機能です。

Device Guard の概要は、以下の MSDN サイトにて確認いただけますので、ご参照いただけたら幸いです。

 

デバイス ガードの概要

https://technet.microsoft.com/ja-jp/library/Dn986865(v=VS.85).aspx

 

なお、Device Guard には、新しく実装された、「仮想化ベースの保護」というセキュリティ機能があります。「コードの整合性チェック」フラグは、ドライバーがこの「仮想化ベースの保護」機能に準拠した動作をすることができるかを確認するためのフラグです。

 

従来におけるコードの整合性チェックは、カーネル モードのドライバーに対して、ファイルの改ざんが行われていないかを検証する方法として、ドライバーのロード時にドライバー署名を確認します。

「仮想化ベースの保護」では、そのコードの整合性チェックを行う処理部分が Windows のカーネルから分離することにより、OS のカーネル メモリを含む OS 全体に対して、コードの整合性チェックを施すことができます。(ここにおける「仮想化」は、前述の処理部分を除いた OS を「仮想化」し、いわゆる仮想マシンとして見立てた上で、コードの整合性チェックが動作することを指しています)

つまり、「仮想化ベースの保護」によって、ドライバーがロードされた後でも、ドライバーを含めたカーネル モードのモジュールにおけるコード整合性を確認する、より強固なセキュリティ実装を実現することが可能です。

 

「仮想化ベースの保護」を使用している場合、カーネル上のメモリは、コード整合性の認証を受け、問題ないものと判断された後に初めて実行可能となります。そのため、カーネル メモリ内に含まれるドライバーのコードは、初めから「書き込み可能」であると同時に「実行可能」であることを禁止します。Driver Verifier の「コードの整合性チェック」フラグは、対象のドライバーに対し、この前述の動作が行われているか否かの検証を行うのです。

 

参考

Device Guard 及び Driver Verifier の詳細や、このチェックがハードウェア互換性プログラムで必須となるといった点については、以下の MSDN ブログ エントリでも記載されております。

 

Driver compatibility with Device Guard in Windows 10

https://blogs.msdn.com/b/windows_hardware_certification/archive/2015/05/22/driver-compatibility-with-device-guard-in-windows-10.aspx

 

New device-level test to be included as part of the Compatibility Program in November 2015

https://blogs.msdn.com/b/windows_hardware_certification/archive/2015/10/29/new-device-level-test-to-be-included-as-part-of-the-compatibility-program-in-november-2015.aspx

 

以上が、Driver Verifier の新機能、「コードの整合性チェック」フラグのご紹介となります。

Windows 10 で、ドライバー検証やハードウェア互換性プログラムへの申請を行う予定の方のご参考になれば幸いです。