渗透压力测试(设备基础功能)

设备基础渗透测试执行各种形式的输入攻击,这是安全测试的关键组成部分。 攻击和渗透测试可帮助识别软件接口中的漏洞。

渗透

渗透测试包括两类测试:模糊测试和 I/O SpyI/O 攻击 测试。 模糊测试也是 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

在一个或多个设备上启用 I/O Spy

测试二进制文件: Devfund_IOSpy_EnableSupport.wsc

测试方法: EnableIoSpy

参数: - 请参阅 设备基础知识测试参数

DQ

DFD - 指定 IoSpy 数据文件的路径。 默认位置为 %SystemDrive%\DriverTest\IoSpy

模糊杂项 API 测试

模糊杂项 API 测试是用来确定驱动程序是否可以处理来自内核模式驱动程序的各种常见调用的测试。

测试包括以下测试:

  • 调用 ZwReadFileZwWriteFile,指定有效的数据缓冲区指针、不同长度 (包括零) ,以及不同的字节偏移量,包括零位、-1 位和 64 位字节偏移量。

  • 调用以取消 I/0 和刷新缓冲区。

  • 使用具有有效用户数据缓冲区指针和不同缓冲区长度(包括零)的通用文件信息类的一系列目录查询调用。

  • 与在 DOS 虚拟机 (VDM) 控制下运行的程序发出的调用类似的目录查询调用。

  • 用于检索具有不同缓冲区大小和长度的文件的扩展属性的调用。

  • 用于创建和关闭具有不同部分页面保护和部分分配属性(已提交部分、映像文件部分)的部分对象的调用。

  • 用于锁定和解锁文件的调用。

  • 用于检索卷的配额条目的调用。

  • 文件属性测试,一系列文件属性查询,其中包含指向 ObjectAttributes 结构的有效指针。

    文件属性测试具有可选的零长度测试。 在检索文件的扩展属性时,此模糊测试会将空白(零长度)查询和无效缓冲区地址传递给驱动程序。

测试二进制文件: Devfund_DevicePathExerciser.dll

测试方法: DoMiscAPITest

参数: - 请参阅 设备基础知识测试参数

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

具有零长度查询测试的模糊杂项 API

此测试执行与模糊杂项 API 测试相同的测试,这次在尝试检索文件的扩展属性时,会将零长度) 查询的空白 (和无效的缓冲区地址传递给驱动程序。

测试二进制文件: Devfund_DevicePathExerciser.dll

测试方法: DoMiscAPIWithZeroLengthTest

参数: - 请参阅 设备基础知识测试参数

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

模糊打开和关闭测试

此测试执行数千个 create-open-close 序列。

有关此测试的详细信息,请参阅 关于模糊打开和关闭测试

测试二进制文件: Devfund_DevicePathExerciser.dll

测试方法: DoOpenCloseTest

参数: - 请参阅 设备基础知识测试参数

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

模糊查询和设置文件信息测试

此测试发出调用以检索和更改设备的对象、文件和卷信息。

在“查询和设置文件信息测试”过程中,模糊测试问题会调用以检索和更改由“基本打开操作”和其他打开的操作打开的设备的对象、文件和卷信息,包括由模糊子测试执行的操作。

模糊测试将使用有效的缓冲区和各种缓冲区长度和文件信息类,至少发出每个查询或设置调用 1024 次。 还会发送每种类型的一个请求,其中缓冲区指针无效,缓冲区长度为零。

如果使用 ChangeBufferProtectionFlags 参数(用于设置保护选项),则模糊测试会每个查询和设置调用中更改缓冲区的安全设置。

此测试还会执行模糊子打开测试。

此测试使用 ZwQueryInformationFileZwSetInformationFileZwQueryVolumeInformationFileZwSetVolumeInformationFile 函数。

测试二进制文件: Devfund_DevicePathExerciser.dll

测试方法: DoQueryAndSetFileInformationTest

参数: - 请参阅 设备基础知识测试参数

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

模糊查询和设置安全性测试

此测试发出调用以检索安全描述符并更改设备的安全状态。

在查询和设置安全性测试期间,模糊测试问题会发出调用以检索安全描述符并更改由基本打开操作和其他打开操作打开的设备的安全状态,包括由模糊子打开测试执行的操作。

模糊测试发出每个查询或设置调用至少 1024 次,具有有效缓冲区和各种缓冲区长度和安全信息类型 (OWNER_SECURITY_INFORMATION、GROUP_SECURITY_INFORMATION、DACL_SECURITY_INFORMATION、SACL_SECURITY_INFORMATION,并且没有信息类型) 。 还会发送每种类型的一个请求,其中缓冲区指针无效,缓冲区长度为零。

如果使用 ChangeBufferProtectionFlags 参数(用于设置保护选项),则模糊测试会在每个查询和设置调用中更改缓冲区的安全设置。

测试二进制文件: Devfund_DevicePathExerciser.dll

测试方法: DoQueryAndSetSecurityTest

参数: - 请参阅 设备基础测试参数

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

模糊随机 FSCTL 测试/模糊随机 IOCTL 测试

此测试使用从指定值范围随机选择的函数代码、设备类型、数据传输方法和访问要求发出对 DeviceIoControl 函数的一系列调用。 调用包括具有有效和无效缓冲区指针和长度的输入和输出缓冲区,以及随机生成的内容。

在随机测试期间,模糊测试会颁发一系列 DeviceIoControl 函数的调用,其中函数代码、设备类型、数据传输方法和访问要求都是随机从指定值范围选择的。 调用包括具有有效和无效缓冲区指针和长度的输入和输出缓冲区,以及随机生成的内容。

模糊测试在 基本开放操作和其他开放 测试期间打开的所有设备上执行随机测试。 可以使用以下参数来自定义此测试:

  • 使用 MinFunctionCode 和 MaxFunctionCode 指定调用中使用的 IOCTL 或 FSCTL 函数代码的范围

  • 使用 MinDeviceType 和 MaxDeviceType 指定调用中使用的设备类型的范围

  • 使用 SeedNumber 指定随机数字生成例程的种子数字。

模糊测试用于为测试生成随机数字的函数使用种子数字,即 random-number-generating 算法的起始数字。 若要重现测试条件,请使用 种子编号 参数指定在原始测试试用版中使用的种子编号。

定制随机测试是随机测试的一部分。 定制的随机测试使用随机测试结果来更详细地检查驱动程序对 IOCTL 或 FSCTL 请求的响应。 定制随机测试根据随机测试调用返回的状态来探测随机测试错过的区域和驱动程序未按预期响应的区域。

测试二进制文件: Devfund_DevicePathExerciser.dll

测试方法: DoRandomIOCTLTest、DoRandomFSCTLTest

参数: - 请参阅 设备基础测试参数

MinInBuffer

MaxInBuffer

MinOutBuffer

MaxOutBuffer

MaxRandomCalls

MaxTailoredCalls

SeedNumber

MinDeviceType

MaxDeviceType

MinFunctionCode

MaxFunctionCode

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

模糊子打开测试

测试对设备命名空间中的打开对象执行一系列快速调用。 在这些调用中,它传递以设备开头的路径,包括长度和内容的任意名称和无稽之谈的字符串。

在相对打开测试(也称为 sub-open 测试)期间,模糊测试尝试打开设备命名空间中的对象。

在此测试期间,模糊测试将执行一系列快速调用,以打开通过使用基本打开操作和其他打开操作打开的设备的命名空间中的对象。 在这些调用中,模糊测试传递一条路径,该路径以设备开头,并包含任意名称和不同长度和内容的无意义字符串。

此测试确定驱动程序或文件系统如何管理其命名空间中的打开请求。 具体而言,如果驱动程序不支持其命名空间中的打开请求,则它必须阻止未经授权的访问,方法是使请求失败,或者在使用 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

模糊Zero-Length缓冲区 FSCTL 测试/模糊Zero-Length缓冲区 IOCTL 测试

此测试发出一系列对 DeviceIoControl 函数 的调用,其输入和/或输出缓冲区长度为 0。 该测试使用不同的功能代码、设备类型、数据传输方法和访问要求生成不同的文件系统控制代码。

在Zero-Length缓冲区测试期间,模糊测试会发出一系列对 DeviceIoControl 函数 的调用,其输入和输出缓冲区长度为 0。 该测试通过使用不同的函数代码、设备类型、数据传输方法和访问要求,生成不同的 I/O 控制代码。 有关 I/O 控制代码的内容的信息,请参阅定义 I/O 控制代码

为了测试驱动程序对无效缓冲区指针的处理,这些用户模式调用中的缓冲区指针指定内核虚拟地址空间中的高位地址,例如 0xFFFFFC00)。

模糊测试对基本和其他开放性测试期间打开的所有设备执行零长度缓冲区测试。 可以使用 MinFunctionCodeMaxFunctionCode 命令参数来自定义此测试,以指定调用中使用的 IOCTL 或 FSCTL 函数代码的范围 ,并使用 MinDeviceTypeMaxDeviceType 指定调用中使用的设备类型范围。

测试二进制文件: Devfund_DevicePathExerciser.dll

测试方法: DoZeroLengthBufferIOCTLTest、DoZeroLengthBufferFSCTLTest

参数: - 请参阅 设备基础测试参数

MinDeviceType

MaxDeviceType

MinFunctionCode

MaxFunctionCode

DoPoolCheck

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

运行 I/O 攻击

在指定的设备上运行 I/O 攻击

测试二进制文件: Devfund_IOAttack_DeleteDataFile.wsc

测试方法: RunIoAttack

参数: - 请参阅 设备基础知识测试参数

DQ

关于模糊打开和关闭测试

模糊打开和关闭测试采用多种不同的方法来打开和关闭指定设备实例: 基本打开操作直接设备打开操作以及 打开和关闭测试

基本打开操作

基本打开操作期间,模糊测试会重复打开, (使用不同的方法和选项创建指定设备的) 实例或指定驱动程序导出的设备。

模糊测试始终执行基本打开操作。 你不需要选择它们,也不能从测试会话中排除它们。

模糊测试通过调用系统服务 (适用于设备的 ZwXxx 例程) ,在用户模式下执行所有打开操作。 如果某个打开调用返回了设备的句柄,则模糊测试会使用该句柄来执行为测试会话选择的其他设备测试。

基本打开操作有五种类型:

  • 标准打开。 模糊测试以异步方式打开设备,并仅指定本机设备名称。

  • 打开并添加反斜杠。 模糊测试针对设备名称发出打开调用,后跟反斜杠 () (如 \device\cdrom\),就好像调用是在设备中打开根目录一样。

    此操作确定驱动程序或文件系统如何管理其命名空间中的打开请求。 特别是,如果设备不支持其命名空间中的打开请求,驱动程序必须阻止未经授权的访问,方法是使请求失败,或者在调用 IoCreateDevice 或 IoCreateDeviceSecure 时设置FILE_DEVICE_SECURE_OPEN设备特征来创建设备对象。

  • 以命名管道的形式打开。 模糊测试将打开设备,并建立指向设备的命名管道。 Access 参数 (ShareAccess) 最初设置为 read 和 write,但如果请求失败,则会调整此参数。 如果设备不支持命名管道,则会让该请求失败。

  • 以 mailslot 形式打开。 模糊测试以 mailslot 的形式打开设备。 如果设备不支持此类型的连接,则会让该请求失败。

  • 以树连接形式打开。 模糊测试将设备作为树连接打开,用于远程网络访问。 Access 参数 (ShareAccess) 最初设置为 read 和 write,但如果请求失败,则会调整此参数。 如果设备不支持此类型的连接,则会让该请求失败。

在打开调用中使用的参数因设备特征而异,这样调用才有可能成功。 例如,如果某个基本打开操作因调用未满足设备的安全要求而失败,则模糊测试将使用对访问权限要求较低的请求来重复该打开操作。 例如,如果某个请求了写入访问权限的打开操作返回安全冲突错误,则使用读取访问请求重复该打开操作。

直接设备打开操作

在执行直接设备打开操作的过程中,模糊测试会直接以设备形式打开设备,而不是以文件系统中的文件形式打开设备。 直接设备打开操作始终是同步的。 如果调用成功,模糊测试会使用提供的句柄来执行其他选定的测试。

打开和关闭测试

在打开和关闭测试的过程中,模糊测试会创建多个线程,每个线程都执行成千上万个创建-打开-关闭序列。 这会测试驱动程序处理大量在其他情况下会很简单的预期调用的能力。

打开和关闭测试使用 基本打开操作 和打开添加反斜杠测试中使用的相同选项,并且仅在这些测试之前执行。

如何在运行时使用 Visual Studio 测试驱动程序

如何选择和配置设备基础功能测试

设备基础功能测试

Provided WDTF Simple I/O plug-ins(提供的 WDTF 简单 I/O 插件)

如何在运行时通过命令提示符测试驱动程序