渗透测试(设备基本功能)

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

渗透

渗透测试包括两类测试:模糊测试和 I/O 间谍I/O 攻击 测试。 模糊测试也是 设备路径检索器 测试工具的一项功能。

测试 DESCRIPTION

禁用 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

Fuzz 其他 API 测试

Fuzz Misc API 测试是用于确定驱动程序是否可以处理内核模式驱动程序的各种常见调用的测试。

这些测试包括以下测试:

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

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

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

  • 目录查询调用类似于受虚拟 DOS 计算机(VDM)控制的程序发出的调用。

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

  • 调用创建和关闭区段对象,并具有不同的区段页保护和区段分配属性(已提交区段,图像文件区段)。

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

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

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

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

测试二进制文件: Devfund_DevicePathExerciser.dll

测试方法: DoMiscAPITest

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

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags(改变缓冲区保护标志)

冒充

FillZeroPageWithNull

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

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

测试二进制文件: Devfund_DevicePathExerciser.dll

测试方法: DoMiscAPIWithZeroLengthTest

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

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

冒充

FillZeroPageWithNull

模糊打开和关闭测试

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

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

测试二进制文件: Devfund_DevicePathExerciser.dll

测试方法: DoOpenCloseTest

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

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

冒充

FillZeroPageWithNull

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

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

查询和设置文件信息测试期间,模糊测试发出调用,以检索和更改由基本打开操作及其他打开操作(包括模糊子打开测试执行的操作)打开的设备的对象、文件和卷信息。

模糊测试会对每个查询或设定调用至少执行 1024 次测试,并使用有效的缓冲区,以及多种缓冲区长度和文件信息类别。 每种类型的请求还包括一个带有无效缓冲区指针和缓冲区长度为零的请求。

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

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

此测试使用 ZwQueryInformationFileZwSetInformationFileZwQueryVolumeInformationFileZwSetVolumeInformationFile 函数。

测试二进制文件: Devfund_DevicePathExerciser.dll

测试方法: DoQueryAndSetFileInformationTest

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

DoPoolCheck

DQ

TestCycles

更改缓冲区保护标志

冒充

FillZeroPageWithNull

模糊查询和设置安全测试

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

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

Fuzz测试对于每个查询或设置调用会至少发出1024次请求,使用有效的缓冲区,并包括各种缓冲区长度和安全信息类型(OWNER_SECURITY_INFORMATION、GROUP_SECURITY_INFORMATION、DACL_SECURITY_INFORMATION、SACL_SECURITY_INFORMATION,以及无信息类型)。 每个类型的一个请求还发送了无效的缓冲区指针和零个缓冲区长度。

如果使用 ChangeBufferProtectionFlags 参数来设置保护选项,Fuzz测试工具会在每次查询和设置调用中改变缓冲区的安全设置。

测试二进制文件: Devfund_DevicePathExerciser.dll

测试方法: DoQueryAndSetSecurityTest

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

DoPoolCheck

DQ

TestCycles

更改缓冲保护标志

冒充

FillZeroPageWithNull

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

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

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

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

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

  • 使用 MinDeviceTypeMaxDeviceType 指定调用中使用的设备类型范围

  • 使用 SeedNumber 为随机数生成例程指定种子编号。

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

定制随机测试包含在随机测试中。 定制的随机测试使用随机测试的结果来更详细地检查驱动程序对 IOCTL 或 FSCTL 请求的响应。 定制随机测试探测随机测试未命中的区域以及驱动程序未按预期响应的区域,具体取决于随机测试调用返回的状态。

测试二进制文件: Devfund_DevicePathExerciser.dll

测试方法: DoRandomIOCTLTest、DoRandomFSCTLTest

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

MinInBuffer

MaxInBuffer

MinOutBuffer

MaxOutBuffer

MaxRandomCalls

MaxTailoredCalls

SeedNumber

MinDeviceType

MaxDeviceType

MinFunctionCode

MaxFunctionCode

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

冒充

FillZeroPageWithNull

模糊子功能打开测试

测试执行一系列快速调用,以打开设备命名空间中的对象。 在这些调用中,它传递一个以设备开头的路径,其中包含长度和内容不固定的任意名称和随机字符串。

相对开放测试(也称为 子打开测试)期间,模糊测试会尝试打开设备 命名空间中的对象。

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

此测试确定驱动程序或文件系统如何在其命名空间中管理打开的请求。 具体而言,如果驱动程序不支持其命名空间中的打开请求,则它必须通过失败请求来防止未经授权的访问,或者在使用 IoCreateDeviceIoCreateDeviceSecure 创建设备对象时设置FILE_DEVICE_SECURE_OPEN设备特征。

有关设备的命名空间的详细信息,请参阅 控制设备命名空间访问

测试二进制文件: Devfund_DevicePathExerciser.dll

测试方法: DoSubOpensTest

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

DoPoolCheck

DQ

TestCycles

更改缓冲保护标志

冒充

FillZeroPageWithNull(用空值填充零页)

使用 Streams 测试打开模糊子

此测试尝试在设备上打开各种命名数据流。 该测试使用一系列具有内容和字符的任意流名称,这些名称可能在某些设备上对其他用途有效。

流测试期间,Fuzz测试尝试打开设备上的各种命名数据流。 测试使用一系列具有内容和字符的任意流名称,这些名称可能在某些设备上对其他用途有效。 此测试确定驱动程序是否可以正确处理数据流请求,尤其是在驱动程序导出不支持或预测数据流的设备时。

命名数据流是文件对象的属性。 通过写入文件名、冒号和数据流的名称来指定命名数据流,例如,AccessDate 是命名数据流,即 File01.txt 文件的属性,例如“File01.txt: AccessDate ”。

模糊测试记录在测试中使用的流名称。

测试二进制文件: Devfund_DevicePathExerciser.dll

测试方法: DoSubOpensWithStreamsTest

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

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

冒充

FillZeroPageWithNull(将零页填充为空值)

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

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

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

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

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

测试二进制文件: Devfund_DevicePathExerciser.dll

测试方法: DoZeroLengthBufferIOCTLTest、DoZeroLengthBufferFSCTLTest

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

MinDeviceType

MaxDeviceType

MinFunctionCode

MaxFunctionCode

DoPoolCheck

TestCycles

更改缓冲区保护标志

冒充

FillZeroPageWithNull (填充零页为空)

运行 I/O 攻击

对指定的设备或设备运行 I/O 攻击

测试二进制文件: Devfund_IOAttack_DeleteDataFile.wsc

测试方法: RunIoAttack

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

DQ

关于Fuzz测试的开启和关闭

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

基本打开操作

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

模糊测试始终执行基本打开操作。 无需选择它们,并且无法从测试会话中排除它们。

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

有五种类型的基本开放操作:

  • 标准打开。 Fuzz 测试以异步方式打开设备,并仅指定设备的原生名称。

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

    此操作确定驱动程序或文件系统如何管理其命名空间中的打开的请求。 具体而言,如果设备不支持其命名空间中的打开请求,驱动程序必须通过失败请求来防止未经授权的访问,或在调用 IoCreateDeviceIoCreateDeviceSecure 时设置FILE_DEVICE_SECURE_OPEN设备特征来创建设备对象。

  • 以命名管道的形式打开。 Fuzz测试将启动设备,并建立指向设备的命名管道。 访问参数 (ShareAccess) 最初设置为读取和写入,但如果请求失败,则会进行调整。 如果设备不支持命名管道,则请求应失败。

  • 以邮件槽的形式打开。 模糊测试将设备打开为邮件槽。 如果设备不支持这种类型的连接,则请求应失败。

  • 以树连接的形式打开。 模糊测试将设备以树连接的方式开放,以便用于远程网络访问。 访问参数 (ShareAccess) 最初设置为读取和写入,但如果请求失败,则会进行调整。 如果设备不支持这种类型的连接,则请求应失败。

开放调用中使用的参数因适应设备的特征而有所不同,并可能使调用成功。 例如,如果基本打开操作失败,因为调用不符合设备的安全要求,模糊测试会请求较低访问权限来重复打开操作。 例如,如果一个请求写入访问权限的打开操作返回安全违规错误,则会用读取访问权限请求重新尝试打开。

直接设备打开操作

直接设备打开操作期间,模糊测试将直接打开设备,作为设备而非文件系统中的文件。 直接设备打开操作始终是同步的。 如果调用成功,Fuzz测试将使用提供的句柄来执行其他选定的测试。

打开和关闭测试

“打开”和“关闭测试”期间,模糊测试会创建多个线程,每个线程执行数千个 create-open-close 序列。 这会测试驱动程序处理一系列非同寻常的简单且预期调用的能力。

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

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

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

设备基础知识测试

提供的 WDTF 简单 I/O 插件

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