Share via


ドライバー検証ツールのセキュリティ チェック

ドライバー検証ツールのセキュリティ チェック オプションは、セキュリティの脆弱性が発生する可能性がある一般的なエラーがないかドライバーを監視します。 このオプションは、Windows Vista 以降で使用できます。

具体的には、[セキュリティ チェック] オプションは、次の不適切なドライバーの動作を検索します。

  • ユーザー モード アドレスをパラメーターとして使用してカーネル ZwXxx ルーチンを呼び出します。 ドライバーがZwXxx ルーチンを呼び出すと、ドライバー検証ツールは、パラメーターのいずれもユーザー モード アドレスではないチェックします。 ZwXxx ルーチンを呼び出すと、現在のKPROCESSOR_MODEが KernelMode になり、そのルーチンに渡されるすべてのパラメーターがカーネル モード アドレスであるかのように扱われます。 したがって、ドライバーは、カーネル ZwXxxルーチンを呼び出す前に、アプリケーションから受信したユーザー モード バッファーをプローブし、カーネル モード メモリ (たとえば、カーネル スタックに割り当てられたプール ブロックまたはデータ構造内) に配置する必要があります。 ドライバーは、ZwXxx ルーチンのパラメーターとしてユーザー モード バッファーではなく、キャプチャされたバッファーを使用する必要があります。

  • UNICODE_STRINGs の形式が正しくないカーネル ZwXxx ルーチンをパラメーターとして呼び出します。 ドライバーが ZwXxx ルーチンを呼び出すと、ドライバー検証ツールは、UNICODE_STRING 値であるパラメーターをチェックします。 このような文字列でドライバー検証ツールによって検出される一般的なエラーは次のとおりです。

    • バッファー フィールドは、ユーザー モード メモリを指します。
    • Length パラメーターまたは MaximumLength パラメーターが正しくありません。 たとえば、MaximumLength<Length などです。 または、これらの値の一方または両方が奇数です。 これらの値は、Unicode 文字列を表す際に使用されるバイト数を表すので、いつでも偶数である必要があります。
  • パラメーターとして正しくない OBJECT_ATTRIBUTES 構造体を使用してカーネル ZwXxx ルーチンを呼び出します。 ドライバーが ZwXxx ルーチンを呼び出すと、ドライバー検証ツールは構造体 OBJECT_ATTRIBUTE パラメーターをチェックします。 各 OBJECT_ATTRIBUTE 構造体パラメーターのメンバーには、前述のユーザー モード アドレスと UNICODE_STRING 値に対して同じチェックが適用されます。

  • Irp->RequestorMode パラメーターと I/O 要求パラメーターに一貫性がありません。 Irp-> RequestorModeKernelMode に設定されるたびに、ドライバー検証ツールは I/O 要求パラメーター、Irp->AssociatedIrp.SystemBuffer または Irp->UserBuffer がユーザーモードのアドレスでないことをチェックします。

Windows 7 以降では、ドライバー検証ツール オプションを有効にすると、ドライバー検証ツールは次のドライバーの動作をチェックします。

オブジェクト参照カウンターが 0 から 1 に変化する Windows カーネル オブジェクト マネージャーが File オブジェクトや Thread オブジェクトなどのオブジェクトを作成すると、新しいオブジェクトの参照カウンターが 1 に設定されます。 ObReferenceObjectByPointerObReferenceObjectByHandle などのシステム関数を呼び出すと、参照カウンターが増加します。 同じオブジェクトに対して ObDereferenceObject を呼び出すたびに減少します。

参照カウンタが 0 の値に達すると、オブジェクトは解放できるようになります。 オブジェクト マネージャーはそれをすぐに解放することも、後で解放することもできます。 ドライバー検証ツールは、同じオブジェクトの ObReferenceObjectByPointerObReferenceObject への後続の呼び出しにチェックします。 これらの呼び出しにより、参照カウンターが 0 から 1 に変更されます。これは、ドライバーが既に解放されているオブジェクトの参照カウンターが増加したことを意味します。 他のメモリ割り当てが破損する可能性があるため、これは常に正しくありません。

このオプションをアクティブにする

Driver Verifier Manager または Verifier.exe コマンド ラインを使用して、1 つ以上のドライバーのセキュリティ チェック オプションをアクティブにできます。 詳細については、「ドライバー検証ツール オプションの選択」をご参照ください 。

  • コマンド ラインの使用

    コマンド ラインでは、[セキュリティ チェック] オプションは ビット 8 (0x100) で表されます。 セキュリティ チェックを有効にするには、0x100 のフラグ値を使用するか、フラグ値に 0x100 を追加します。 次に例を示します。

    verifier /flags 0x100 /driver MyDriver.sys
    

    このオプションは、コンピューターを再起動した後にアクティブになります。

    Windows Vista 以降では、/volatile パラメーターをコマンドに追加することで、コンピューターを再起動せずにセキュリティ チェックをアクティブ化および非アクティブ化することもできます。 次に例を示します。

    verifier /volatile /flags 0x100 /adddriver MyDriver.sys
    

    この設定はすぐに有効になりますが、コンピューターをシャットダウンまたは再起動すると失われます。 詳細については、「揮発性設定の使用」をご参照ください。

    [セキュリティ チェック] オプションも標準設定に含まれています。 次に例を示します。

    verifier /standard /driver MyDriver.sys
    
  • ドライバー検証マネージャーの使用

    1. ドライバー検証マネージャーを起動します。 コマンド プロンプト ウィンドウに「検証ツール」と入力します。
    2. [カスタム設定の作成 (コード開発者用)] を選択し、[次へ] をクリックします。
    3. 選択 全リストから [個々の設定を選択] を選択します
    4. [セキュリティ チェック] を選択します。

    [セキュリティ チェック] 機能も標準設定に含まれています。 この機能を使用するには、ドライバー検証ツール マネージャーで、 [標準設定の作成]をクリックします。