滲透測試 (裝置基本概念)

裝置基本概念滲透測試會執行各種形式的輸入攻擊,這是安全性測試的重要元件。 攻擊和滲透測試可協助識別軟體介面中的弱點。

滲透

滲透測試包括兩種測試類別:模糊測試和 I/O Spy 和 I/O 攻擊 測試。 模糊測試也是 裝置路徑演練器 測試工具的一項功能。

測試 描述

停用 I/O Spy

在 1 或多個裝置上停用 I/O Spy。

測試二進位檔: Devfund_IOSpy_DisableSupport.wsc

測試方法: DisableIoSpy

參數: - 請參閱 裝置基本概念測試參數

DQ

顯示已啟用「I/O Spy」功能的裝置

顯示已啟用 I/O Spy 的裝置。

測試二進位檔: Devfund_IOSpy_DisplayEnabledDevices.wsc

Test 方法: DisplayIoSpyDevices

啟用 I/O Spy

在一或多個裝置上啟用 I/O Spy。

測試二進位檔: Devfund_IOSpy_EnableSupport.wsc

測試方法: EnableIoSpy

參數: - 請參閱 裝置基本概念測試參數

DQ

DFD - 指定 IoSpy 資料檔的路徑。 默認位置 %SystemDrive%\DriverTest\IoSpy

模糊 Misc API 測試

Fuzz Misc API 測試是測試,可判斷驅動程式是否可以處理來自核心模式驅動程式的各種常見呼叫。

測試包含下列項目:

  • 呼叫 ZwReadFile 和 ZwWriteFile,指定有效的數據緩衝區指標、不同的長度(包括零)、以及不同的位元組位移,包括零、-1 和 64 位元組位移。

  • 取消 I/0 並排清緩衝區的呼叫。

  • 一系列的目錄查詢呼叫,使用具有有效用戶數據緩衝區指標和不同緩衝區長度的一般檔案信息類別(包括零)。

  • 目錄查詢呼叫類似於在虛擬 DOS 機器 (VDM) 控制下執行之程式所發出的呼叫。

  • 呼叫 以擷取具有不同緩衝區大小和長度之檔案的擴充屬性。

  • 呼叫以建立和關閉區段物件,這些物件具有不同的區段頁面保護和區段配置屬性(已承諾的區段、影像文件區段)。

  • 鎖定和解除鎖定檔案的呼叫。

  • 呼叫 以擷取磁碟區的配額專案。

  • 檔案屬性測試,一系列具有 ObjectAttributes 結構之有效指標的檔案屬性查詢。

    檔案屬性測試具有選擇性的零長度測試。 擷取檔案的擴充屬性時,Fuzz 測試會將空白(零長度)查詢和無效的緩衝區位址傳遞給驅動程式。

測試二進位檔: Devfund_DevicePathExerciser.dll

測試方法: DoMiscAPITest

參數: - 請參閱 裝置基本概念測試參數

DoPoolCheck

DQ

測試週期

更改緩衝區保護標識

冒充

FillZeroPageWithNull

含零長度查詢測試的模糊雜項 API

此測試會執行與 Fuzz Misc API 測試相同的測試,這次會在嘗試擷取檔案的擴充屬性時,將空白(零長度)查詢和無效的緩衝區位址傳遞給驅動程式。

測試二進位檔: Devfund_DevicePathExerciser.dll

測試方法: DoMiscAPIWithZeroLengthTest

參數: - 請參閱 裝置基本概念測試參數

DoPoolCheck

DQ

測試週期

更改緩衝區保護標識

冒充

FillZeroPageWithNull

模糊開啟和關閉測試

此測試會執行數千個 create-open-close 序列。

如需此測試的詳細資訊,請參閱 關於模糊開啟和關閉測試。

測試二進位檔: Devfund_DevicePathExerciser.dll

測試方法: DoOpenCloseTest

參數: - 請參閱 裝置基本概念測試參數

DoPoolCheck

DQ

測試週期

更改緩衝區保護標識

冒充

FillZeroPageWithNull

模糊查詢和設定檔案信息測試

此測試會發出呼叫來擷取和變更裝置的物件、檔案和磁碟區資訊。

在 查詢和設定檔案資訊測試期間,Fuzz 測試會呼叫以擷取和變更由 Basic Open Operations 和其他開啟作業所開啟之裝置的對象、檔案和磁碟區資訊,包括由 Fuzz 子開啟測試執行的操作。

Fuzz 測試會針對每個查詢或設定的呼叫,以有效的緩衝區以及各種緩衝區長度和檔案資訊類別,至少執行 1024 次。 每個類型的一個要求也會以無效的緩衝區指標和零的緩衝區長度傳送。

如果您使用 ChangeBufferProtectionFlags 參數來設定保護選項,則 Fuzz 測試會在每個查詢中變更緩衝區上的安全性設定,並設定呼叫。

此測試也會執行 Fuzz Sub-opens 測試。

此測試會使用 ZwQueryInformationFile、ZwSetInformationFile、ZwQueryVolumeInformationFile和 ZwSetVolumeInformationFile 函式。

測試二進位檔: Devfund_DevicePathExerciser.dll

測試方法: DoQueryAndSetFileInformationTest

參數: - 請參閱 裝置基本概念測試參數

DoPoolCheck

DQ

測試週期

更改緩衝區保護標識

冒充

FillZeroPageWithNull

模糊查詢和設定安全性測試

此測試會發出呼叫來擷取安全性描述元,並變更裝置的安全性狀態。

在 查詢和設定安全性測試期間,模糊測試會發出呼叫來擷取安全性描述元,並變更 基本開啟作業所開啟之裝置的安全性狀態, 和其他開啟作業,包括 Fuzz 子開啟測試所執行的作業。

模糊測試會發出每個查詢或設定呼叫至少 1024 次,且具有有效的緩衝區,以及各種緩衝區長度和安全性資訊類型(OWNER_SECURITY_INFORMATION、GROUP_SECURITY_INFORMATION、DACL_SECURITY_INFORMATION、SACL_SECURITY_INFORMATION和無資訊類型)。 每個類型的一個要求也會以無效的緩衝區指標和零的緩衝區長度傳送。

如果您使用 ChangeBufferProtectionFlags 參數來設定保護選項,則 Fuzz 測試會在每個查詢中變更緩衝區上的安全性設定,並設定呼叫。

測試二進位檔: Devfund_DevicePathExerciser.dll

測試方法: DoQueryAndSetSecurityTest

參數: - 請參閱 裝置基本概念測試參數

DoPoolCheck

DQ

測試週期

更改緩衝區保護標識

冒充

FillZeroPageWithNull

模糊隨機 FSCTL 測試 / 模糊隨機 IOCTL 測試

此測試會發出一系列對 DeviceIoControl 函式的呼叫,其中包含函式代碼、裝置類型、數據傳輸方法,以及從指定值範圍隨機選取的存取需求。 呼叫包括輸入和輸出緩衝區,其中包含有效且無效的緩衝區指標和長度,以及隨機產生的內容。

在隨機測試期間,Fuzz 測試會發出一系列呼叫 DeviceIoControl 函式,其中包含函式代碼、裝置類型、數據傳輸方法和從指定值範圍隨機選取的存取需求。 呼叫包括輸入和輸出緩衝區,其中包含有效且無效的緩衝區指標和長度,以及隨機產生的內容。

Fuzz 測試會在 基本開啟作業 和其他開啟測試期間開啟的所有裝置上執行隨機測試。 您可以使用下列參數來自訂此測試。

  • 使用 MinFunctionCode 和 MaxFunctionCode 來指定呼叫中使用的 IOCTL 或 FSCTL 函式程式碼範圍

  • 使用 MinDeviceType 和 MaxDeviceType 來指定呼叫中使用的裝置類型範圍

  • 使用 SeedNumber 為隨機數生成例程指定種子號。

Fuzz 測試用來為測試產生隨機數的函式會使用 種子編號,這是隨機數產生演算法的起始數位。 若要重現測試條件,請使用 種子編號 參數來指定原始測試試用版中使用的種子編號。

量身訂做隨機測試 包含在隨機測試中。 量身訂做的隨機測試會使用隨機測試的結果,更詳細地檢查驅動程序回應IOCTL或 FSCTL 要求。 量身訂做的隨機測試探查會根據隨機測試呼叫傳回的狀態,偵測到隨機測試遺漏的區域,以及驅動程式未如預期響應的區域。

測試二進位檔: Devfund_DevicePathExerciser.dll

測試方法: DoRandomIOCTLTest、DoRandomFSCTLTest

參數: - 請參閱 裝置基本概念測試參數

MinInBuffer

MaxInBuffer

MinOutBuffer

MaxOutBuffer

MaxRandomCalls

最大化量身定制呼叫

SeedNumber

(if applicable, maintain "MinDeviceType" untranslated due to it being a technical term or placeholder) zh-TW: MinDeviceType

MaxDeviceType

最小功能代碼

MaxFunctionCode

DoPoolCheck

DQ

測試週期

更改緩衝區保護標識

冒充

FillZeroPageWithNull

模糊子測試開啟

測試會執行一系列快速呼叫,以開啟裝置命名空間中的物件。 在這些呼叫中,它會傳遞以裝置開頭的路徑,並包含長度和內容不一的任意名稱和無意義的字串。

在 相對開啟測試期間,(亦稱為 子開啟測試)模糊測試會嘗試在裝置的 命名空間中開啟物件。

在此測試期間,Fuzz 測試會快速執行一系列呼叫,以開啟透過 基本開啟操作 和其他開啟操作開啟的裝置命名空間中的物件。 在這些呼叫中,Fuzz 測試會通過一條路徑,該路徑從裝置開始,並包含隨機名稱和各種長短不一、內容不明的字串。

此測試會決定驅動程式或檔案系統在其命名空間中如何管理開啟的要求。 特別是,如果驅動程式在其命名空間中不支持開啟要求,它必須藉由失敗要求來防止未經授權的存取,或在使用 IoCreateDevice 或 IoCreateDeviceSecure 來建立裝置物件時設定FILE_DEVICE_SECURE_OPEN裝置特性。

如需裝置命名空間的詳細資訊,請參閱 控制裝置命名空間存取。

測試二進位檔: Devfund_DevicePathExerciser.dll

Test 方法: DoSubOpensTest

參數: - 請參閱 裝置基本概念測試參數

DoPoolCheck

DQ

測試週期

更改緩衝區保護標識

冒充

FillZeroPageWithNull

在使用 Streams 測試中模糊子開啟

此測試會嘗試在裝置上開啟各種具名數據流。 測試會使用一系列任意串流名稱,其內容和字元可能適用於某些裝置上的其他用途。

在 串流測試期間,Fuzz測試會嘗試開啟裝置上的各種具名資料流。 測試會使用一系列任意串流名稱與內容和字元,這些名稱可能適用於某些裝置上的其他用途。 此測試會判斷驅動程式是否可以正確處理數據流要求,特別是當驅動程式匯出不支援或預期數據流的裝置時。

名為數據流 是檔案對象的屬性。 您可以藉由寫入檔名、冒號和數據流的名稱來指定具名數據流,例如“File01.txt:AccessDate”,其中 AccessDate 是具名數據流,也就是 File01.txt 檔案的屬性。

Fuzz 測試會記錄測試中使用的資料流名稱。

測試二進位檔: Devfund_DevicePathExerciser.dll

測試方法: DoSubOpensWithStreamsTest

參數: - 請參閱 裝置基本概念測試參數

DoPoolCheck

DQ

測試週期

更改緩衝區保護標識

冒充

FillZeroPageWithNull

模糊 Zero-Length 緩衝區 FSCTL 測試 / 模糊 Zero-Length 緩衝區 IOCTL 測試

此測試會發出一系列對 deviceIoControl 函式的呼叫, 輸入及/或輸出緩衝區長度為 0。 測試會使用不同的函式程式代碼、裝置類型、數據傳輸方法和存取需求來產生不同的檔系統控制碼。

在 Zero-Length 緩衝區測試期間,模糊測試會發出一系列對 deviceIoControl 函式的呼叫, 輸入及/或輸出緩衝區長度為 0。 測試會使用不同的函式程式代碼、裝置類型、數據傳輸方法和存取需求來產生不同的 I/O 控制碼。 如需 I/O 控制件代碼內容的相關資訊,請參閱 定義 I/O 控制件代碼。

若要測試驅動程式處理無效的緩衝區指標,這些使用者模式呼叫中的緩衝區指標會指定核心虛擬位址空間中的高位址,例如0xFFFFFC00)。

Fuzz 測試會在基本和其他開啟測試期間開啟的所有裝置上執行 Zero-Length Buffer 測試。 您可以使用 MinFunctionCode 和 MaxFunctionCode 命令參數來自定義此測試,以指定呼叫中使用的 IOCTL 或 FSCTL 函式程式代碼範圍,MinDeviceType 和 MaxDeviceType 指定呼叫中使用的裝置類型範圍。

測試二進位檔: Devfund_DevicePathExerciser.dll

測試方法: DoZeroLengthBufferIOCTLTest、DoZeroLengthBufferFSCTLTest

參數: - 請參閱 裝置基本概念測試參數

(if applicable, maintain "MinDeviceType" untranslated due to it being a technical term or placeholder) zh-TW: MinDeviceType

MaxDeviceType

最小功能代碼

MaxFunctionCode

DoPoolCheck

測試週期

更改緩衝區保護標識

冒充

FillZeroPageWithNull

執行 I/O 攻擊

在指定的裝置或裝置上執行 I/O 攻擊。

測試二進位檔: Devfund_IOAttack_DeleteDataFile.wsc

測試方法: RunIoAttack

參數: - 請參閱 裝置基本概念測試參數

DQ

關於模糊開啟和關閉測試

模糊開啟和關閉測試採用數種不同的開啟和關閉指定裝置實例的方式:基本開放作業、直接裝置開啟作業,以及 Open 和 Close 測試。

基本開啟操作

在 基本開啟作業期間,Fuzz測試會重複使用不同的方法和選項開啟(建立)指定裝置或由指定驅動程式提供的裝置的實例。

模糊測試總是會執行基本的開啟動作。 您不需要選取它們,而且您無法從測試會話中排除它們。

Fuzz 測試會呼叫適用於裝置的系統服務(ZwXxx 例程),在使用者模式中執行所有開啟作業。 如果開啟的呼叫傳回裝置的控制代碼,Fuzz 測試將使用該控制代碼來執行為測試會話選取的其他裝置的測試。

開放作業基本類型有五種:

  • 標準開啟。 模糊測試會以異步方式開啟裝置,並只指定原生裝置名稱。

  • 以新增反斜杠開啟。 Fuzz測試會對裝置名稱發出開啟呼叫,後面接著反斜杠 \,例如 \device\cdrom\,如同是在開啟裝置內的根目錄。

    此作業會決定驅動程式或檔案系統在其命名空間中如何管理開啟的要求。 特別是,如果裝置在其命名空間中不支持開啟要求,則驅動程式必須藉由失敗要求來防止未經授權的存取,或在呼叫 IoCreateDevice 或 IoCreateDeviceSecure 來建立裝置物件時設定FILE_DEVICE_SECURE_OPEN裝置特性。

  • 以命名管道開啟。 模糊測試會開啟裝置,並建立裝置的命名管道。 存取參數 (ShareAccess) 一開始設定為讀取和寫入,但如果要求失敗,則會調整。 若裝置不支援命名管道,則應使該請求失敗。

  • 以郵件槽方式開啟。 模糊測試會將裝置開啟為郵件槽。 如果裝置不支援這種類型的連線,它應該會失敗要求。

  • 以樹狀結構連接開啟。 模糊測試會將裝置開啟為樹狀結構連接,以用於遠端網路存取。 存取參數 (ShareAccess) 一開始設定為讀取和寫入,但如果要求失敗,則會調整。 如果裝置不支援這種類型的連線,它應該會失敗要求。

開啟呼叫中使用的參數會因應裝置的特性而有所不同,而且可能會讓呼叫成功。 例如,如果基本開啟作業失敗,因為呼叫不符合裝置的安全性需求,Fuzz 測試會重複開啟作業,並要求較少存取。 例如,如果要求寫入存取權的開啟作業返回安全性違規錯誤,則會再次嘗試開啟,改為要求讀取存取。

直接的裝置開啟操作

在 直接裝置開啟作業期間,Fuzz 測試會將裝置作為裝置直接開啟,而不是作為文件系統中的檔案。 此類直接設備開啟操作皆為同步進行。 如果呼叫成功,模糊測試會使用提供的控制代碼來執行其他選擇的測試。

開啟和關閉測試

在 Open 和 Close Test期間,Fuzz 測試會建立數個線程,每個線程都會執行數千個 create-open-close 序列。 這會測試驅動程序處理非常大量其他簡單且預期的通話的能力。

開啟和關閉測試會使用與 基本開啟操作 和 新增反斜杠開啟測試相同的選項,並且在進行這些測試之前執行。

如何使用 Visual Studio 在運行時間測試驅動程式

如何選取及設定裝置基本概念測試

裝置基本測試

提供的 WDTF 簡單 I/O 外掛程式

如何在運行時間從命令提示字元 測試驅動程式