侵入テスト (デバイス基礎)
デバイス基礎侵入テストでは、セキュリティ テストの重要な要素である入力攻撃をさまざまな形で実行します。 攻撃と侵入のテストは、ソフトウェア インターフェイスの脆弱性を特定するのに役立ちます。
浸入
侵入テストには、ファジー テストと、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 テストは、ドライバーがカーネル モード ドライバーからのさまざまな共通の呼び出しを処理できるかどうかを判断するテストです。 このテストには、次のテストが含まれます。
テスト バイナリ: 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 テストも実行されます。 このテストでは、ZwQueryInformationFile、ZwSetInformationFile、ZwQueryVolumeInformationFile、ZwSetVolumeInformationFile 関数を使用しています。 テスト バイナリ: 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 関数に対する一連の呼び出しを発行します。 呼び出しに含まれる入出力バッファーには、バッファーのポインターと長さが有効なものと無効なものがあり、ランダムに生成されたコンテンツも呼び出しに含まれます。 ファジー テストでは、基本的なオープン操作テストと追加のオープン テスト中に開かれたすべてのデバイスに対してランダム テストが実行されます。 このテストは、次のパラメーターを使用してカスタマイズできます。
ファジー テストでテスト用の乱数の生成に使用する関数では、乱数生成アルゴリズム用の開始番号であるシード番号を使用します。 テスト条件を再現するには、シード番号パラメーターを使用して、元のテスト試行で使用されたシード番号を指定します。 テーラード ランダム テストは、ランダム テストの一部として含まれています。 調整されたランダム テストでは、ランダム テストの結果を使用して、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 関数コードの範囲を指定し、MinDeviceType と MaxDeviceType を使用して、呼び出しで使用されるデバイスの種類の範囲を指定するとカスタマイズできます。 テスト バイナリ: 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) は、最初は読み取りと書き込みに設定されていますが、要求が失敗した場合は調整されます。 デバイスがこの種類の接続をサポートしていない場合、要求は失敗します。
オープン呼び出しで使われるパラメーターは、デバイスの特性に適応して、呼び出しが成功する可能性を高めるために変化します。 たとえば、基本的なオープン操作が、呼び出しがデバイスのセキュリティ要件を満たさなかったために失敗した場合、ファジー テストは、より低いアクセス権の要求でオープン操作を繰り返します。 たとえば、書き込みアクセスを要求したオープン操作でセキュリティ違反のエラーが返された場合、読み取りアクセスの要求でオープン操作を繰り返します。
デバイスの直接オープン操作
デバイスの直接オープン操作では、ファジー テストは、ファイル システム内のファイルとしてではなく、デバイスとして直接デバイスを開きます。 デバイスの直接オープン操作は常に同期となります。 呼び出しが成功した場合、ファジー テストは取得したハンドルを使用して他に選んだテストを実行します。
オープン/クローズ テスト
オープン/クローズ テストでは、ファジー テストはいくつかのスレッドを作成し、それぞれ、多数の作成/オープン/クローズ シーケンスを実行します。 このテストでは、それ以外の点では単純で予想通りの、異常な量の呼び出しを処理するドライバーの能力をテストします。
オープン/クローズ テストでは、基本的なオープン操作テストやバックスラッシュ追加によるオープン テストで使用されるのと同じオプションが使用されます。また、これらのテストの直前に実行されます。