次の方法で共有


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

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

浸透

侵入テストには、2 つのカテゴリのテスト、つまりファジーテストと、I/O SpyおよびI/O 攻撃テストが含まれます。 ファズテストは、デバイス パス エクササイザー テスト ツールの機能でもあります。

テスト 説明

I/O Spy を無効にする

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

バイナリのテスト: Devfund_IOSpy_DisableSupport.wsc

テスト メソッド: DisableIoSpy

パラメーター: - Device Fundamentals テスト パラメーターを参照してください

DQ

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

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

バイナリのテスト: Devfund_IOSpy_DisplayEnabledDevices.wsc

テスト メソッド: DisplayIoSpyDevices

I/O Spy を有効にする

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

バイナリのテスト: Devfund_IOSpy_EnableSupport.wsc

テスト メソッド: EnableIoSpy

パラメーター: - Device Fundamentals テスト パラメーターを参照してください

DQ

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

ファジーその他の API テスト

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

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

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

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

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

  • ディレクトリ クエリの呼び出しは、Virtual DOS マシン (VDM) の制御下で実行されているプログラムによって発行されたものと同様です。

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

  • さまざまなページ保護や割り当て属性(コミットされたセクション、イメージファイルセクション)を持つセクションオブジェクトの作成と閉鎖の呼び出し。

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

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

  • File Attributes Test( ObjectAttributes 構造体への有効なポインターを持つ一連のファイル属性クエリ)。

    ファイル属性テストには、省略可能な長さ 0 のテストがあります。 ファイルの拡張属性を取得するときに、ファジー テストは空の (長さ 0 の) クエリと無効なバッファー アドレスをドライバーに渡します。

テスト バイナリ: Devfund_DevicePathExerciser.dll

テスト メソッド: DoMiscAPITest

パラメーター: - Device Fundamentals テスト パラメーターを参照してください

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

偽装

FillZeroPageWithNull

長さ 0 のクエリテストを使用した、その他のAPIのファズテスト

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

テスト バイナリ: Devfund_DevicePathExerciser.dll

テスト メソッド: DoMiscAPIWithZeroLengthTest

パラメーター: - Device Fundamentals テスト パラメーターを参照してください

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

偽装

FillZeroPageWithNull

ファジーテストを開いて閉じる

このテストでは、何千もの作成と終了のシーケンスが実行されます。

このテストの詳細については、「 ファジーの開閉テストについて」を参照してください。

テスト バイナリ: Devfund_DevicePathExerciser.dll

テスト メソッド: DoOpenCloseTest

パラメーター: - Device Fundamentals テスト パラメーターを参照してください

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

偽装

FillZeroPageWithNull

ファジー クエリとファイル情報の設定テスト

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

クエリおよびファイル情報の設定テスト中、ファズ テストでは、基本オープン操作やその他のオープン操作で開かれたデバイスのオブジェクト、ファイル、ボリューム情報を取得および変更するために、呼び出しを行います。この呼び出しには、ファズ サブオープン テストによって実行される操作も含まれます。

ファジー テストでは、有効なバッファーとさまざまなバッファー長とファイル情報クラスを使用して、各クエリまたはセット呼び出しを少なくとも 1024 回発行します。 各型の 1 つの要求も、無効なバッファー ポインターとバッファー長ゼロで送信されます。

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

このテストでは、Fuzz サブオープン テストも実行されます。

このテストでは、 ZwQueryInformationFileZwSetInformationFileZwQueryVolumeInformationFileおよび ZwSetVolumeInformationFile 関数を使用します。

テスト バイナリ: Devfund_DevicePathExerciser.dll

テスト メソッド: DoQueryAndSetFileInformationTest

パラメーター: - Device Fundamentals テスト パラメーターを参照してください

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags(バッファ保護フラグの変更)

偽装

FillZeroPageWithNull

クエリのファズテストとセキュリティテストの設定

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

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

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

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

テスト バイナリ: Devfund_DevicePathExerciser.dll

テスト メソッド: DoQueryAndSetSecurityTest

パラメーター: - Device Fundamentals テスト パラメーターを参照してください

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

偽装

FillZeroPageWithNull

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

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

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

ファジー テストは、 Basic Open Operations および追加のオープン テスト中に開かれたすべてのデバイスでランダム テストを実行します。 このテストは、次のパラメーターを使用してカスタマイズできます。

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

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

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

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

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

テスト バイナリ: Devfund_DevicePathExerciser.dll

テスト メソッド: DoRandomIOCTLTest、DoRandomFSCTLTest

パラメーター: - Device Fundamentals テスト パラメーターを参照してください

MinInBuffer

MaxInBuffer

MinOutBuffer

MaxOutBuffer

MaxRandomCalls

MaxTailoredCalls

SeedNumber

MinDeviceType

MaxDeviceType

MinFunctionCode

MaxFunctionCode

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

偽装

FillZeroPageWithNull

Fuzz Sub-opens テスト

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

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

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

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

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

テスト バイナリ: Devfund_DevicePathExerciser.dll

テスト メソッド: DoSubOpensTest

パラメーター: - Device Fundamentals テスト パラメーターを参照してください

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

偽装

FillZeroPageWithNull

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

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

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

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

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

テスト バイナリ: Devfund_DevicePathExerciser.dll

テスト メソッド: DoSubOpensWithStreamsTest

パラメーター: - Device Fundamentals テスト パラメーターを参照してください

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

偽装

FillZeroPageWithNull

Fuzz Zero-Length Buffer FSCTL テスト/Fuzz Zero-Length Buffer IOCTL テスト

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

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

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

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

テスト バイナリ: Devfund_DevicePathExerciser.dll

テスト メソッド: DoZeroLengthBufferIOCTLTest、DoZeroLengthBufferFSCTLTest

パラメーター: - Device Fundamentals テスト パラメーターを参照してください

MinDeviceType

MaxDeviceType

MinFunctionCode

MaxFunctionCode

DoPoolCheck

TestCycles

ChangeBufferProtectionFlags

偽装

FillZeroPageWithNull

I/O 攻撃の実行

指定したデバイスまたはデバイスに対して I/O 攻撃 を実行します。

バイナリのテスト: Devfund_IOAttack_DeleteDataFile.wsc

テスト メソッド: RunIoAttack

パラメーター: - Device Fundamentals テスト パラメーターを参照してください

DQ

ファズの開閉テストについて

ファジーの開閉テストでは、指定されたデバイスまたはデバイスのインスタンスを開いたり閉じたりするさまざまな方法が採用されています。 基本的な開く操作ダイレクト デバイスの開く操作開くおよび閉じるテストです。

基本的なオープン操作

基本的な開く操作中に、ファジー テストは、異なるメソッドとオプションを使用して、指定したデバイスまたは指定したドライバーによってエクスポートされたデバイスのインスタンスを繰り返し開く (作成) します。

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

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

基本的なオープン操作には、次の 5 種類があります。

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

  • バックスラッシュを追加して開きます。 Fuzz テストでは、デバイス名に対して円記号 (\device\cdrom\ など) を用いた呼び出しを発行し、デバイス内のルートディレクトリを開くかのように指示します。

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

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

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

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

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

ダイレクト デバイスのオープン操作

ダイレクト デバイスのオープン操作中、ファジー テストでは、ファイル システム内のファイルとしてではなく、デバイスとしてデバイスを直接開きます。 ダイレクト デバイスオープン操作は常に同期的です。 呼び出しが成功した場合、ファジー テストでは、指定されたハンドルを使用して、選択した他のテストを実行します。

テストを開く/閉じる

開くテストと閉じるテスト中に、ファジー テストによって複数のスレッドが作成され、それぞれが何千もの作成と終了のシーケンスを実行します。 これにより、ドライバーが特別な量の単純で予想される呼び出しを処理する能力がテストされます。

開くテストと閉じるテストでは、 基本的な開く操作 とバックスラッシュを追加して開くテストで使用されるのと同じオプションが使用され、これらのテストの直前に実行されます。

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

Device Fundamentals テストを選択して構成する方法

デバイス基本テスト

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

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