驱动程序验证程序安全检查
驱动程序验证程序的安全检查选项监视驱动程序中可能导致安全漏洞的常见错误。 此选项从 Windows Vista 开始可用。
具体而言,“安全检查”选项查找以下不正确的驱动程序行为:
使用用户模式地址作为参数调用内核 ZwXxx 例程。 当驱动程序调用任何 ZwXxx 例程时,驱动程序验证程序会检查参数是否不是用户模式地址。 调用任何 ZwXxx 例程时,当前KPROCESSOR_MODE变为 KernelMode,传递给该例程的任何参数都被视为内核模式地址。 因此,驱动程序必须探测从应用程序接收的任何用户模式缓冲区,并将其放入内核模式内存 (例如,在调用内核 ZwXxx 例程之前,在内核堆栈) 分配的池块或数据结构中。 驱动程序必须使用捕获的缓冲区而不是用户模式缓冲区作为 ZwXxx 例程的参数。
使用格式不正确的UNICODE_STRINGs作为参数调用内核 ZwXxx 例程。 当驱动程序调用任何 ZwXxx 例程时,驱动程序验证程序会检查UNICODE_STRING值的任何参数。 驱动程序验证程序在此类字符串中检测到的常见错误包括:
- 缓冲区字段指向用户模式内存。
- Length 或 MaximumLength 参数不正确。 例如 ,MaximumLength<Length。 或者其中一个或两个值都是奇数。 这两个值必须始终为偶数,因为它们表示用于表示 Unicode 字符串的字节数。
使用不正确的OBJECT_ATTRIBUTES结构作为参数调用内核 ZwXxx 例程。 当驱动程序调用任何 ZwXxx 例程时,驱动程序验证程序会检查OBJECT_ATTRIBUTE结构的任何参数。 每个 OBJECT_ATTRIBUTE 结构参数的成员都对上述用户模式地址和UNICODE_STRING值进行相同的检查。
Irp-RequestorMode> 和 I/O 请求参数不一致。 每当 Irp-> RequestorMode 设置为 KernelMode 时,驱动程序验证程序都会检查 I/O 请求参数 Irp-AssociatedIrp.SystemBuffer> 或 Irp-UserBuffer> 是否为用户模式地址。
从 Windows 7 开始,启用任何驱动程序验证程序选项时,驱动程序验证程序会检查以下驱动程序行为:
对象引用计数器从 0 更改为 1。 当 Windows 内核对象管理器创建对象(如 File 对象或 Thread 对象)时,新对象的引用计数器设置为 1。 对系统函数(如 ObReferenceObjectByPointer 或 ObReferenceObjectByHandle) 的调用会递增引用计数器。 每次对同一对象的 ObDereferenceObject 调用都会递减引用计数器。
引用计数器达到 0 值后,对象将有资格被释放。 对象管理器可能会立即释放它,也可能稍后释放它。 驱动程序验证程序检查对同一对象的 ObReferenceObjectByPointer 和 ObReferenceObject 的后续调用。 这些调用将引用计数器从 0 更改为 1,这意味着驱动程序已递增已释放对象的引用计数器。 这始终不正确,因为它可能会损坏其他内存分配。
激活此选项
可以使用驱动程序验证程序管理器或Verifier.exe命令行激活一个或多个驱动程序的安全检查选项。 有关详细信息,请参阅 选择驱动程序验证程序选项。
使用命令行
在命令行中,“安全检查”选项由 位 8 (0x100) 表示。 若要激活安全检查,请使用标志值0x100或向标志值添加0x100。 例如:
verifier /flags 0x100 /driver MyDriver.sys
重启计算机后,选项将处于活动状态。
从 Windows Vista 开始,还可以通过将 /volatile 参数添加到 命令来激活和停用安全检查,而无需重启计算机。 例如:
verifier /volatile /flags 0x100 /adddriver MyDriver.sys
此设置会立即生效,但在关闭或重启计算机时会丢失。 有关详细信息,请参阅 使用易失性设置。
安全检查选项也包含在标准设置中。 例如:
verifier /standard /driver MyDriver.sys
使用驱动程序验证程序管理器
- 启动驱动程序验证程序管理器。 在命令提示符窗口中键入 验证程序 。
- 选择 “为代码开发人员创建自定义设置 () ”,然后单击“ 下一步”。
- 从完整列表中选择“选择单个设置”。
- 选择“ 安全检查”。
安全检查功能也包含在标准设置中。 若要在驱动程序验证程序管理器中使用此功能,请单击“创建标准设置”。