问题描述
我有一个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
在回调函数结束之前不会返回,并且模拟仅限于回调函数的内容。