为 HID 集合强制实施安全读取
本文介绍了用户模式应用程序或内核模式驱动程序如何为顶级 HID 集合强制实施安全读取。
如果为集合启用了安全读取,则只有“受信任的”客户端(具有 SeTcbPrivilege 权限的客户端)才能从集合的打开文件中获取输入。 内核模式驱动程序默认具有 SeTcbPrivilege 权限,但用户模式应用程序不会。 有关如何在用户模式下获取系统权限的信息,请参阅 Microsoft Windows SDK 文档中有关授权的信息。
主要提供此机制,以便“受信任的”用户模式系统组件可以阻止用户模式应用程序,而无需 SeTcbPrivilege 特权在关键系统操作期间从集合获取输入。 例如,“受信任的”用户模式系统组件可以防止用户模式应用程序没有 SeTcbPrivilege 特权,从而在登录操作期间获取用户提供的机密信息。
“受信任的”客户端使用IOCTL_HID_ENABLE_SECURE_READ和IOCTL_HID_DISABLE_SECURE_READ请求来启用和禁用集合的安全读取。 如果没有 SeTcbPrivilege 权限的客户端使用这些请求,则请求不会更改集合的安全读取状态,HID 类驱动程序将返回状态值STATUS_PRIVILEGE_NOT_HELD。
为集合启用和禁用安全读取的工作原理如下:
HID 类驱动程序为集合的每个打开文件维护特定于文件的安全读取计数。 HID 类驱动程序还维护集合的安全读取计数,这是特定于文件的安全读取计数之和。 创建集合时,集合的安全读取计数初始化为零,打开文件时,文件的安全读取计数将初始化为零。
当 HID 类驱动程序收到文件的启用请求时,它会为文件的安全读取计数递增 1(递增 1 个集合的安全读取计数)。
当 HID 类驱动程序收到文件的禁用请求时:
- 如果文件的安全读取计数大于零,驱动程序会将文件的安全读取计数递减 1(并将集合的安全读取计数递减 1)。
- 如果文件的安全读取计数等于零,驱动程序不会更改安全读取计数。
如果集合的安全读取计数大于零,HID 类驱动程序将强制对集合进行安全读取。 否则,驱动程序不会为集合强制实施安全读取。
客户端应使用禁用请求来取消相应的启用请求。 但是,如果客户端不执行此操作,HID 类驱动程序会在处理 文件的IRP_MJ_CLOSE 请求时适当递减集合的安全读取计数。 当驱动程序处理关闭请求时,它会通过关闭的文件的安全读取计数来递减集合的安全读取计数。