セキュリティの検査

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

セキュリティの検査オプションでは、具体的には次のような不適切なドライバー動作を監視します。

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

  • 不適切な形式の UNICODE_STRING をパラメーターとして使ったカーネル ZwXxx ルーチンの呼び出し。ドライバーが任意の ZwXxx ルーチンを呼び出すと、UNICODE_STRING 値であるすべてのパラメーターがドライバー検証ツールによってチェックされます。 ドライバー検証ツールは、このような文字列に含まれる次のような一般的なエラーを検出します。
    • バッファー フィールドがユーザー モード メモリをポイントしている。
    • Length パラメーターまたは MaximumLength パラメーターが正しくない。たとえば、MaximumLength よりも Length の方が大きい。 あるいは、これらの値の一方または両方が奇数である。 これらの値は Unicode 文字列を表すために使用されるバイト数であるため、両方とも常に偶数である必要があります。
  • 不適切な OBJECT_ATTRIBUTE 構造体をパラメーターとして使ったカーネル 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 に変化します。つまり、既に解放済みのオブジェクトの参照カウンターの値が、ドライバーによって引き上げられたということです。他のメモリ割り当てが破損する可能性があるため、この操作は常に不適切です。

このオプションのアクティブ化

セキュリティの検査オプションは、ドライバーの検証ツール マネージャーまたは Verifier.exe コマンド ラインを使って、1 つ以上のドライバーに対してアクティブ化できます。詳しくは、「ドライバーの検証ツールのオプションの選択」をご覧ください。

  • コマンド ラインの使用

    コマンド ラインでは、セキュリティの検査オプションが Bit 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. ドライバーの検証ツール マネージャーを起動します。コマンド プロンプト ウィンドウで、「Verifier」と入力します。
    2. [カスタム設定を作成する (コード開発者用)] をクリックして、[次へ] をクリックします。
    3. [一覧から個別の設定を選択する] をクリックします。
    4. [セキュリティの検査] を選びます。

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

 

 

表示:
© 2014 Microsoft