2

我有一个系统服务,它以管理员身份创建了一个帮助交互进程,以便它可以访问一些与桌面相关的资源,包括 BlockInput() 函数和 NVIDIA 的 NVAPI 函数,它们不能从服务运行。当登录的用户是管理员的成员时,以下工作:

  1. 设置权限级别,包括 SE_TCB_NAME
  2. 使用 WTSGetActiveConsoleSessionId() 获取活动会话 ID
  3. 使用 WTSQueryUserToken() 从会话 ID 获取登录用户
  4. GetTokenInformation() 与 TokenLinkedToken
  5. 带有 SecurityImpersonation 的 DuplicateTokenEx()
  6. 使用 CreateProcessAsUser() 启动进程

但是,当我让当前登录会话成为标准用户而不是管理员时,步骤 4. 失败,大概是因为标准用户没有与其链接的管理级别令牌。这里有什么解决方案?我假设我需要获取其中一位管理员用户的令牌,但我该怎么做呢?如果该用户不是登录用户,它是否仍然可以访问与当前桌面交互的功能?

4

1 回答 1

3

您可以复制自己的令牌,然后使用该SetTokenInformation函数更改复制令牌上的会话以将其放入交互式会话中。

正如您所注意到的,SYSTEM不鼓励在交互式会话中运行,因为它为交互式用户提供了攻击您的进程的机会,可能会获得提升的权限。(搜索“粉碎攻击”以获取更多信息。)但是,这种担忧同样适用于在非管理用户会话中作为管理用户运行的进程。

理想情况下,您应该在交互式会话中使用非管理进程来执行需要交互式会话的功能,同时使用服务执行需要管理权限的功能。不应该有任何函数需要两者,但是如果 NVAPI 违反了这个规则,你就无能为力了。

考虑在交互式用户会话中将进程启动到一个专门创建的(并且适当保护的)工作站中,以最大限度地减少这种风险。

于 2014-01-15T01:21:29.567 回答