使用 CustomCapability + Signed SCCD 限制驱动程序仅访问 UWP 应用程序

Limit driver access only to UWP app with CustomCapability + Signed SCCD

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

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

考虑到这个问题,我知道我必须以另一种方式拒绝来自 Win32 应用程序的请求。

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

的访问权限

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

是否应该有这种方法的另一种替代方法、另一种类型的描述符或任何类似的东西来支持限制 win32 应用程序使用 IOCTL 的目标?

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

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

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