驱动程序验证程序安全检查

驱动程序验证程序的安全检查选项监视驱动程序中可能导致安全漏洞的常见错误。 从 Vista 开始,此选项Windows可用。

具体而言,"安全检查"选项会查找以下不正确的驱动程序行为:

  • 调用以用户模式地址作为参数的内核 ZwXxx 例程。 驱动程序调用任何 ZwXxx 例程时,驱动程序验证程序将检查所有参数都不是用户模式地址。 调用任何 ZwXxx 例程时,当前KPROCESSOR_MODE成为 KernelMode,传递给该例程的任何参数都被视为内核模式地址。 因此,在调用内核 ZwXxx 例程之前,驱动程序必须探测从应用程序接收的任何用户模式缓冲区,并放入内核模式内存 (例如,在内核堆栈) 上分配的池块或数据结构中。 驱动程序必须使用捕获的缓冲区而不是用户模式缓冲区作为 ZwXxx 例程的参数。

  • 调用格式错误的内核 ZwXxx UNICODE_STRINGs作为参数。 驱动程序调用任何 ZwXxx 例程时,驱动程序验证程序将检查任何UNICODE_STRING参数。 驱动程序验证程序在此类字符串中检测到的常见错误包括:

    • 缓冲区字段指向用户模式内存。
    • Length 或 MaximumLength 参数不正确。 例如 MaximumLengthLength<。 或者,这两个值中的一个或两个都是奇数。 这两个值必须始终为,因为它们表示用于表示 Unicode 字符串的字节数。
  • 调用包含错误参数的内核 ZwXxx OBJECT_ATTRIBUTES参数。 当驱动程序调用任何 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。 对系统函数(如 ObReferenceObjectByPointerObReferenceObjectByHandle )的调用会递增引用计数器。 每次对 同一对象的 ObDereferenceObject 调用都会使引用计数器减值。

引用计数器达到 0 值后,对象就有资格释放。 对象管理器可能会立即释放它,或稍后释放它。 驱动程序验证程序检查对同一对象的 ObReferenceObjectByPointerObReferenceObject 的后续调用。 这些调用将引用计数器从 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
    
  • 使用驱动程序验证程序管理器

    1. 启动驱动程序验证程序管理器。 在 命令提示 符窗口中键入"验证程序"。
    2. 选择 "为代码开发人员 (自定义设置) ,然后单击 "下一步 "
    3. 完整列表中选择"选择单个设置"
    4. 选择 "安全检查"

    安全检查功能也包含在标准设置中。 若要在驱动程序验证程序管理器中使用此功能,请单击"创建标准设置