侵入テスト (デバイス基礎)

デバイス基礎侵入テストでは、セキュリティ テストの重要な要素である入力攻撃をさまざまな形で実行します。 攻撃と侵入のテストは、ソフトウェア インターフェイスの脆弱性を特定するのに役立ちます。

浸入

侵入テストには、ファジー テストと、I/O Spy および I/O Attack テストの 2 つのカテゴリのテストがあります。 ファジー テストは、Device Path Exceriser テスト ツールの機能でもありました。

テスト 説明

I/O Spy の無効化

1 台以上のデバイスで I/O Spy を無効にします。

テスト バイナリ: Devfund_IOSpy_DisableSupport.wsc

テスト メソッド: DisableIoSpy

パラメーター: - 「デバイス基礎テストのパラメーター」を参照してください

DQ

I/O Spy 対応デバイスの表示

I/O Spy が有効になっているデバイスを表示します。

テスト バイナリ: Devfund_IOSpy_DisplayEnabledDevices.wsc

テスト メソッド: DisplayIoSpyDevices

I/O Spy の有効化

1 台以上のデバイスで I/O Spy を有効にします。

テスト バイナリ: Devfund_IOSpy_EnableSupport.wsc

テスト メソッド: EnableIoSpy

パラメーター: - 「デバイス基礎テストのパラメーター」を参照してください

DQ

DFD - IoSpy データ ファイルへのパスを指定します。 既定の位置は %SystemDrive%\DriverTest\IoSpy です

Fuzz Misc API テスト

Fuzz Misc API テストは、ドライバーがカーネル モード ドライバーからのさまざまな共通の呼び出しを処理できるかどうかを判断するテストです。

このテストには、次のテストが含まれます。

  • ZwReadFile および ZwWriteFile への呼び出し。有効なデータ バッファー ポインター、さまざまな長さ (ゼロを含む)、0、-1、64 ビットのバイト オフセットを含むさまざまなバイト オフセットを指定します。

  • I/0 をキャンセルし、バッファーをフラッシュする呼び出し。

  • 有効なユーザー データ バッファー ポインターとさまざまなバッファー長 (ゼロを含む) を持つ共通ファイル情報クラスを使用した一連のディレクトリ クエリ呼び出し。

  • Virtual DOS Machine (VDM) の制御下で実行されているプログラムによって発行された呼び出しと似たディレクトリ クエリ呼び出し。

  • さまざまなバッファー サイズと長さを持つファイルの拡張属性を取得する呼び出し。

  • さまざまなセクション ページ保護とセクション割り当て属性 (コミット済みセクション、イメージ ファイル セクション) がセクション オブジェクトを作成および閉じる呼び出し。

  • ファイルをロックおよびロック解除する呼び出し。

  • ボリュームのクォータ エントリを取得する呼び出し。

  • ファイル属性テスト。ObjectAttributes 構造体への有効なポインターによる一連のファイル属性クエリ。

    ファイル属性テストには、オプションのゼロ長テストがあります。 このテストでは、ファイルの拡張属性を取得しようするときに、空 (ゼロ長) のクエリと無効なバッファー アドレスをドライバーに渡します。

テスト バイナリ: Devfund_DevicePathExerciser.dll

テスト メソッド: DoMiscAPITest

パラメーター: - 「デバイス基礎テストのパラメーター」を参照してください

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

長さ 0 のクエリによる Fuzz Misc API テスト

このテストでは、Fuzz Misc API テストと同じテストが実行されます。また、ファイルの拡張属性の取得を試みながら、空白 (長さ 0) のクエリと無効なバッファー アドレスをドライバーに渡します。

テスト バイナリ: Devfund_DevicePathExerciser.dll

テスト メソッド: DoMiscAPIWithZeroLengthTest

パラメーター: - 「デバイス基礎テストのパラメーター」を参照してください

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

オープン/クローズ ファジー テスト

このテストでは、何千もの create-open-close シーケンスが実行されます。

このテストの詳細については、「オープン/クローズ ファジー テストについて」を参照してください。

テスト バイナリ: Devfund_DevicePathExerciser.dll

テスト メソッド: DoOpenCloseTest

パラメーター: - 「デバイス基礎テストのパラメーター」を参照してください

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

クエリおよびファイル情報設定ファジー テスト

このテストでは、デバイスのオブジェクト、ファイル、ボリュームの情報を取得および変更する呼び出しを発行します。

"ファイル情報のクエリおよび設定のテスト" では、Fuzz Sub-opens テストで行った操作を含め、ファジー テストによって、基本的なオープン操作やその他のオープン操作で開いたデバイスのオブジェクト、ファイル、ボリューム情報を取得、変更するための呼び出しが発行されます。

ファジー テストでは、有効なバッファーとさまざまなバッファー長やファイル情報クラスで、各クエリまたはセットコールを最低 1024 回発行します。 各型の 1 つの要求も、無効なバッファー ポインターと 0 バッファー長で送信されます。

保護オプションを設定 する ChangeBufferProtectionFlags パラメーターを使用する場合、ファジー テストでは、各クエリおよび設定呼び出しでバッファーのセキュリティ設定が変わります。

このテストでは、Fuzz Sub-opens テストも実行されます。

このテストでは、ZwQueryInformationFileZwSetInformationFileZwQueryVolumeInformationFileZwSetVolumeInformationFile 関数を使用しています。

テスト バイナリ: Devfund_DevicePathExerciser.dll

テスト メソッド: DoQueryAndSetFileInformationTest

パラメーター: - 「デバイス基礎テストのパラメーター」を参照してください

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

クエリおよびセキュリティ設定ファジー テスト

このテストでは、セキュリティ記述子を取得し、デバイスのセキュリティ状態を変更する呼び出しを発行します。

セキュリティテストのクエリと設定の間に、ファジー テストでは、の呼び出しを発行してセキュリティ記述子を取得し、基本的なオープン操作によって開いたデバイスのセキュリティ状態と、ファジー サブオープン テストによって実行される操作を含む他の開いている操作を変更します。

ファジー テストでは、有効なバッファーとさまざまなバッファー長とセキュリティ情報の種類 (OWNER_SECURITY_INFORMATION、GROUP_SECURITY_INFORMATION、DACL_SECURITY_INFORMATION、SACL_SECURITY_INFORMATION、情報の種類なし) を使用して、各クエリまたはセット呼び出しを少なくとも 1024 回発行します。 各型の 1 つの要求も、無効なバッファー ポインターと 0 バッファー長で送信されます。

保護オプションを設定 する ChangeBufferProtectionFlags パラメーターを使用する場合、ファジー テストでは、各クエリおよび設定呼び出しでバッファーのセキュリティ設定が変わります。

テスト バイナリ: Devfund_DevicePathExerciser.dll

テスト メソッド: DoQueryAndSetSecurityTest

パラメーター: - 「デバイス基礎テストのパラメーター」を参照してください

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

ランダム FSCTL ファジー テスト/ランダム IOCTL ファジー テスト

このテストでは、指定した値の範囲からランダムに選択された関数コード、デバイスの種類、データ転送方法、アクセス要件を使用して、DeviceIoControl 関数への一連の呼び出しを発行します。 呼び出しに含まれる入出力バッファーには、バッファーのポインターと長さが有効なものと無効なものがあり、ランダムに生成されたコンテンツも呼び出しに含まれます。

ランダム テスト中、ファジー テストでは、指定した値の範囲からランダムに選ばれた関数コード、デバイスの種類、データ転送方法、およびアクセス要件を使用して、DeviceIoControl 関数に対する一連の呼び出しを発行します。 呼び出しに含まれる入出力バッファーには、バッファーのポインターと長さが有効なものと無効なものがあり、ランダムに生成されたコンテンツも呼び出しに含まれます。

ファジー テストでは、基本的なオープン操作テストと追加のオープン テスト中に開かれたすべてのデバイスに対してランダム テストが実行されます。 このテストは、次のパラメーターを使用してカスタマイズできます。

  • MinFunctionCode および MaxFunctionCode を使用して、呼び出しで使用される IOCTL または FSCTL 関数コードの範囲を指定します

  • MinDeviceType および MaxDeviceType を使用して、呼び出しで使用されるデバイスの種類の範囲を指定します

  • SeedNumber を使用して、乱数生成ルーチンのシード番号を指定します。

ファジー テストでテスト用の乱数の生成に使用する関数では、乱数生成アルゴリズム用の開始番号であるシード番号を使用します。 テスト条件を再現するには、シード番号パラメーターを使用して、元のテスト試行で使用されたシード番号を指定します。

テーラード ランダム テストは、ランダム テストの一部として含まれています。 調整されたランダム テストでは、ランダム テストの結果を使用して、IOCTL または FSCTL 要求に対するドライバーの応答を詳細に確認します。 テーラード ランダム テストでは、ランダム テストで見逃された領域と、ランダム テストの呼び出しによって返されたステータスに基づいてドライバーが期待どおりに応答しなかった領域をプローブします。

テスト バイナリ: Devfund_DevicePathExerciser.dll

テスト メソッド: DoRandomIOCTLTest、DoRandomFSCTLTest

パラメーター: - 「デバイス基礎テストのパラメーター」を参照してください

MinInBuffer

MaxInBuffer

MinOutBuffer

MaxOutBuffer

MaxRandomCalls

MaxTailoredCalls

SeedNumber

MinDeviceType

MaxDeviceType

MinFunctionCode

MaxFunctionCode

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

サブオープン ファジー テスト

このテストでは、デバイスの名前空間内にオブジェクトを開くために、一連の高速呼び出しを実行します。 これらの呼び出しでは、デバイスで始まり、任意の名前と、長さと内容が異なる意味のない文字列を含むパスが渡されます。

相対オープン テスト (別名サブオープン テスト) 中に、ファジー テストはデバイスの名前空間のオブジェクトを開こうとします。

このテスト中、ファジー テストは、基本的なオープン操作やその他のオープン操作を使用して開いたデバイスの名前空間でオブジェクトを開くために一連の呼び出しを高速で実行します。 ファジー テストは、これらの呼び出しで、デバイス名から始まり、長さや内容が異なる任意の名前や無意味な文字列を含むパスを渡します。

このテストは、ドライバーまたはファイルシステムがその名前空間でオープンリクエストをどのように管理するかを決定します。 特に、ドライバーがその名前空間でのオープン要求をサポートしない場合、要求を失敗させるか、IoCreateDevice または IoCreateDeviceSecure を使用してデバイス オブジェクトを作成するときに FILE_DEVICE_SECURE_OPEN デバイス特性を設定して、不正なアクセスを防ぐ必要があります。

デバイスの名前空間の詳細については、「デバイスの名前空間へのアクセスの制御」を参照してください。

テスト バイナリ: Devfund_DevicePathExerciser.dll

テスト メソッド: DoSubOpensTest

パラメーター: - 「デバイス基礎テストのパラメーター」を参照してください

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

ストリームによるサブオープン ファジー テスト

このテストでは、デバイス上のさまざまな名前付きデータ ストリームを開こうとします。 このテストでは、一部のデバイスで他の用途に有効な可能性があるコンテンツと文字を含む一連の任意のストリーム名を使用します。

ストリーム テスト中、ファジー テストはデバイス上のさまざまな名前付きデータ ストリームを開こうとします。 テストでは、コンテンツと文字を含む一連の任意のストリーム名を使用します。これは、一部のデバイスで他の用途に有効である可能性があります。 このテストでは、ドライバーがデータ ストリーム要求を適切に処理できるかを判断します。特に、ドライバーがデータ ストリームをサポートしていない、または予期せぬデバイスをエクスポートする場合に、このテストを行います。

名前付きデータ ストリームは、ファイル オブジェクトの属性です。 名前付きデータ ストリームを指定するには、ファイルの名前、コロン、データ ストリームの名前を記述します。たとえば "File01.txt:AccessDate "のように、AccessDate は名前付きのデータ ストリーム、つまり File01.txt ファイルの属性です。

ファジー テストでは、テストで使用されているストリーム名を記録します。

テスト バイナリ: Devfund_DevicePathExerciser.dll

テスト メソッド: DoSubOpensWithStreamsTest

パラメーター: - 「デバイス基礎テストのパラメーター」を参照してください

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

長さ 0 バッファー FSCTL ファジー テスト/長さ 0 バッファー IOCTL ファジー テスト

このテストでは、入力バッファー長または出力バッファー長、あるいはその両方を 0 にして、DeviceIoControl 関数への一連の呼び出しを発行します。 このテストでは、さまざまな関数コード、デバイスの種類、データ転送方式、アクセス要件を使用して、さまざまなファイル システム制御コードを生成します。

0 長バッファー テスト中、ファジー テストでは、入出力のバッファー長が 0 である DeviceIoControl 関数に対する一連の呼び出しが発行されます。 このテストでは、さまざまな関数コード、デバイスの種類、データ転送方法、およびアクセス要件を使用して、さまざまな I/O 制御コードが生成されます。 I/O 制御コードの内容については、「I/O 制御コードの定義」を参照してください。

ドライバーによる無効なバッファー ポインターの処理をテストするために、これらのユーザー モード呼び出しのバッファー ポインターでは、カーネル仮想アドレス空間の上位アドレス (0xFFFFFC00 など) を指定します。

ファジー テストでは、基本テストと追加オープン テストの間に開かれたすべてのデバイスで 0 長バッファー テストを実行します。 このテストは、MinFunctionCode および MaxFunctionCode コマンド パラメーターを使用して、呼び出しで使用される IOCTL または FSCTL 関数コードの範囲を指定し、MinDeviceTypeMaxDeviceType を使用して、呼び出しで使用されるデバイスの種類の範囲を指定するとカスタマイズできます。

テスト バイナリ: Devfund_DevicePathExerciser.dll

テスト メソッド: DoZeroLengthBufferIOCTLTest、DoZeroLengthBufferFSCTLTest

パラメーター: - 「デバイス基礎テストのパラメーター」を参照してください

MinDeviceType

MaxDeviceType

MinFunctionCode

MaxFunctionCode

DoPoolCheck

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

I/O Attack の実行

指定した 1 台のデバイスまたは複数台のデバイスに対して I/O Attack を実行します。

テスト バイナリ: Devfund_IOAttack_DeleteDataFile.wsc

テスト メソッド: RunIoAttack

パラメーター: - 「デバイス基礎テストのパラメーター」を参照してください

DQ

オープン/クローズ ファジー テストについて

オープン/クローズ ファジー テストでは、指定したデバイスのインスタンスを開いたり閉じたりするために、複数の異なる方法 (基本的なオープン操作ダイレクト デバイス オープン操作オープン/クローズ テスト) が使用されます。

基本的なオープン操作

基本的なオープン操作では、ファジー テストはさまざまな方法やオプションを使用して、指定したデバイスまたは指定したドライバーでエクスポートされたデバイスのインスタンスを繰り返しオープン (作成) します。

ファジー テストでは、常に基本的なオープン操作を実行します。 これらを選択する必要はなく、テスト セッションから除外することもできません。

ファジー テストでは、デバイスに適したシステム サービス (ZwXxx ルーチン) を呼び出すことにより、すべてのオープン操作をユーザー モードで実行します。 オープン呼び出しでデバイスのハンドルが返される場合、ファジー テストではそのハンドルを使用して、テスト セッションで選ばれた他のデバイス テストを実行します。

基本的なオープン操作には 5 つのタイプがあります。

  • 標準オープン。 ファジー テストで、デバイスを非同期的に開きて、ネイティブ デバイス名のみを指定します。

  • バックスラッシュ追加によるオープン。 ファジー テストで、デバイス内のルート ディレクトリを開くかのように、デバイス名の後にバックスラッシュ () が続くオープン呼び出しが発行されます (例: \device\cdrom\)。

    この操作は、ドライバーやファイル システムがその名前空間でオープン要求をどのように管理するかを決定します。 特に、デバイスがその名前空間でのオープン要求をサポートしない場合、ドライバーは要求を失敗させるか、IoCreateDevice または IoCreateDeviceSecure を呼び出してデバイス オブジェクトを作成するときに FILE_DEVICE_SECURE_OPEN デバイス特性を設定するかのいずれかで、不正なアクセスを防ぐ必要があります。

  • 名前付きパイプとして開く。 ファジー テストで、デバイスを開いて、デバイスへの名前付きパイプを確立します。 アクセス パラメーター (ShareAccess) は、最初は読み取りと書き込みに設定されていますが、要求が失敗した場合は調整されます。 デバイスが名前付きパイプをサポートしていない場合、要求は失敗します。

  • メールスロットとして開く。 ファジー テストで、デバイスがメールスロットとして開かれます。 デバイスがこの種類の接続をサポートしていない場合、要求は失敗します。

  • ツリー接続として開く。 ファジー テストは、リモート ネットワーク アクセスで使用するツリー接続としてデバイスを開きます。 アクセス パラメーター (ShareAccess) は、最初は読み取りと書き込みに設定されていますが、要求が失敗した場合は調整されます。 デバイスがこの種類の接続をサポートしていない場合、要求は失敗します。

オープン呼び出しで使われるパラメーターは、デバイスの特性に適応して、呼び出しが成功する可能性を高めるために変化します。 たとえば、基本的なオープン操作が、呼び出しがデバイスのセキュリティ要件を満たさなかったために失敗した場合、ファジー テストは、より低いアクセス権の要求でオープン操作を繰り返します。 たとえば、書き込みアクセスを要求したオープン操作でセキュリティ違反のエラーが返された場合、読み取りアクセスの要求でオープン操作を繰り返します。

デバイスの直接オープン操作

デバイスの直接オープン操作では、ファジー テストは、ファイル システム内のファイルとしてではなく、デバイスとして直接デバイスを開きます。 デバイスの直接オープン操作は常に同期となります。 呼び出しが成功した場合、ファジー テストは取得したハンドルを使用して他に選んだテストを実行します。

オープン/クローズ テスト

オープン/クローズ テストでは、ファジー テストはいくつかのスレッドを作成し、それぞれ、多数の作成/オープン/クローズ シーケンスを実行します。 このテストでは、それ以外の点では単純で予想通りの、異常な量の呼び出しを処理するドライバーの能力をテストします。

オープン/クローズ テストでは、基本的なオープン操作テストやバックスラッシュ追加によるオープン テストで使用されるのと同じオプションが使用されます。また、これらのテストの直前に実行されます。

Visual Studio を使用して実行時にドライバーをテストする方法

デバイス基礎テストの選択方法と構成方法

Device Fundamental のテスト

提供されている WDTF シンプル I/O プラグイン

コマンド プロンプトから実行時にドライバーをテストする方法