您的设备命名空间有多安全?
经过您的允许之后,I/O 管理器可以保护设备的命名空间不被无特权的用户访问。设置 FILE_DEVICE_SECURE_OPEN 设备特性会引导 I/O 管理器将设备对象的安全描述符应用于所有打开的请求,包括设备命名空间中的文件打开请求。基本上,I/O 管理器执行访问检查并拒绝没有对设备对象的访问特权的请求。Microsoft Windows NT 4.0 SP5 和更高版本的 Windows 都支持 FILE_DEVICE_SECURE_OPEN。
客户打开驱动程序的已命名设备对象 ("\Device\MyDevice"),以访问设备。但是,客户还可以尝试将一个文件路径追加到设备对象名 ("\Device\MyDevice\Some\Arbitrary\Path\To\A\File") 来打开设备上的文件。当发生这种情况时,文件对象的 FileName 等于名称 ("\Some\Arbitrary\Path\To\A\File") 的结尾部分。除非设备驱动程序监视这种情况并且拒绝创建请求,或应用安全检查,否则这可能在系统中创建一个安全漏洞,因为无特权的用户可以绕过安全性并通过读写访问(只需打开设备命名空间中的文件)获得句柄。
您的驱动程序始终负责管理其命名空间,以及使用 FILE_DEVICE_SECURE_OPEN 使管理更容易(通过让 I/O 管理器为您的驱动程序执行安全检查)。设置 FILE_DEVICE_SECURE_OPEN 可以防止潜在的安全漏洞,因为设备的安全描述符被应用于所有打开尝试(包括那些带有尾部名称的尝试),无论它们处在命名空间中的什么 位置。(要完全防止调用方打开文件,请确保在您的驱动程序接收到的每个创建 IRP 中的 IrpSp->FileObject->FileName.Length 都是 0)。
您应该做什么?
几乎创建设备对象的所有驱动程序都应该在创建设备对象时设置 FILE_DEVICE_SECURE_OPEN。唯一不应该这样做的驱动程序是那些实现其自己的安全检查的驱动程序,例如文件系统。
| • | 当调用 IoCreateDevice 或 IoCreateDeviceSecure 来创建设备对象时设置 FILE_DEVICE_SECURE_OPEN。 |
| • | 对于 Microsoft Windows 2000 和更高操作系统版本的即插即用驱动程序,使用 INF 文件将 FILE_DEVICE_SECURE_OPEN 指定给注册表中的 DeviceCharacteristics 值名称。 |
| • | 如果您的驱动程序出于某种原因不能使用 FILE_DEVICE_SECURE_OPEN,那么执行您自己的访问检查或拒绝来自无特权调用方的 I/O 请求。 |
| • | 如果您的驱动程序不支持打开文件或支持独占打开,那么拒绝任何使用非零长度指定 IrpSp->FileObject->FileName 参数的 IRP_MJ_CREATE 请求。 |
更多信息:
常见的驱动程序可靠性问题
Windows DDK:
控制设备命名空间访问
在设备 INF 文件中加强文件打开安全性