将驱动程序访问权限仅限制为具有CustomCapability + Signed SCCD的UWP应用

问题描述

我有一个UMDF驱动程序,该驱动程序提供IOCTL命令以供UWP应用程序访问。 UWP应用程序已提交到商店,并具有适当的自定义功能和已签名的SCCD,以便访问UMDF驱动程序。

我从SCCD MS documentation中了解到,这允许UWP应用访问驱动程序及其IOCTL,因此,当其他UWP应用尝试获取访问权限时,它们将被拒绝。但是,SCCD并未明确声明Win32应用程序仍然能够访问IOCTL,我认为这违背了具有自定义功能和SCCD的目的。

鉴于此问题,我知道我必须以其他方式拒绝来自Win32应用程序的请求。

我们想使用此GetApplicationusermodelId函数来确定该应用程序是否不是UWP应用程序。这需要pID,我们可以使用WdfRequestGetRequestorProcessId获取它。但是,获取此pID的进程句柄需要访问其他进程的内存。由于UMDF驱动程序没有特权,因为它不拥有该进程,因此它没有特权,即使试图访问ERROR_ACCESS_DENIED,也要返回PROCESS_QUERY_LIMITED_informatION

OpenProcess documentation建议,为了打开另一个本地进程的句柄并获得完全访问权限,我们必须启用SeDebugPrivilege特权。我相信这样做会使驾驶员面临更大的安全风险,因此,推进它可能不是一个好主意。

这种方法是否应该有另一种选择,或者是其他类型的描述符,还是可以支持限制Win32应用程序使用IOCTL的目标的任何类似方法

解决方法

对于UMDF驱动程序,可以使用WdfRequestImpersonate函数。此函数创建一个事件回调函数,UMDF可以使用该事件回调函数来模拟请求进程的访问权限。

请注意,Impersonation level应该是SecurityImpersonation。这需要在INF文件中声明,也需要在WdfRequestImpersonate函数参数中提供。现在可以从回调函数中调用OpenProcess

请注意,WdfRequestImpersonate在回调函数结束之前不会返回,并且模拟仅限于回调函数的内容。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...