我有一个系统服务,它以管理员身份创建一个辅助交互进程,以便它可以访问一些与桌面相关的资源,包括 BlockInput() 函数和 NVIDIA 的 NVAPI 函数,这些函数无法从服务运行。当登录用户是管理员成员时,以下操作有效:
- 设置权限级别,包括 SE_TCB_NAME
- 使用 WTSGetActiveConsoleSessionId() 获取活动会话 ID
- 使用 WTSQueryUserToken() 从会话 ID 获取登录用户
- GetTokenInformation() 和 TokenLinkedToken
- 使用 SecurityImpersonation 的 DuplicateTokenEx()
- 使用 CreateProcessAsUser() 启动进程
但是,当我将当前登录的会话设置为标准用户而不是管理员中的用户时,步骤 4. 会失败,可能是因为标准用户没有与其链接的管理级别令牌。这里有什么解决办法呢?我假设我需要获取其中一位管理员用户的令牌,但我该怎么做呢?如果该用户不是登录用户,它是否仍然可以访问与当前桌面交互的功能?
您可以复制自己的令牌,然后使用以下命令更改复制令牌上的会话SetTokenInformation
函数将其放入交互式会话中。
正如您所注意到的,运行为SYSTEM
在交互式会话中不鼓励这样做,因为它为交互式用户提供了攻击您的进程的机会,可能会获得更高的权限。 (搜索“粉碎攻击”以获取更多信息。)但是,这种担忧同样适用于在非管理用户会话中以管理用户身份运行的进程。
理想情况下,您应该在交互式会话中使用非管理进程来执行需要交互式会话的功能,同时使用服务来执行需要管理权限的功能。不应该有任何函数同时需要两者,但如果 NVAPI 违反了此规则,则您无能为力。
考虑在交互式用户会话中将进程启动到专门创建的(并适当保护的)工作站中,以尽量减少这种风险。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)