【问题标题】:Multilevel usage of thread impersonation线程模拟的多级使用
【发布时间】:2011-06-16 15:12:21
【问题描述】:

我对一些很久以前编写的执行线程级模拟和进程生成的类有一些问题。问题似乎是我对这些实用程序类的使用超出了其他人尝试使用它们的程度。

第一个使用 OpenThreadToken 和 DuplicateToken 以及 ImpersonateLoggedOnUser 进行线程级模拟。

第二次尝试使用 CreateProcessAsUser 和通过 OpenThreadToken / DuplicateToken 获得的令牌创建进程。

我遇到的问题是:

Thread 1 running in IIS with the correct user
Thread 2 that is created by Thread 1 - which is impersonated
Thread 3 that is created by Thread 2 - which is impersonated
Process 1 that is spawned by Thread 3 - which I attempt to impersonate

Spawning Process 1 失败,OpenThreadToken 出现错误代码 5。如果我从线程 1 生成进程 1,OpenThreadToken 不会给我任何闲聊。我从 OpenThreadToken 和 DuplicateToken 请求 TOKEN_ACCESS_ALL 并且直到我从线程 3 实际执行它才失败。有人知道我在这里可能实际需要什么权限吗?

这是生成进程的代码:

(模拟线程只涉及获取线程令牌句柄并调用 ImpersonateLoggedOnUser...)

//process spawn
    if (!::OpenThreadToken(::GetCurrentThread(), 
        TOKEN_ALL_ACCESS,
     false,
      &hThreadUserToken))
    {

    Handle hNewProcessUserToken;
    if (!DuplicateTokenEx(
       hThreadUserToken,          
       TOKEN_ALL_ACCESS,   
       NULL,  
       SecurityDelegation, 
       TokenPrimary ,  
       &hNewProcessUserToken))
     {
     m_dwCreateError = ::GetLastError();
     return false;
    }

      bReturnValue = ::CreateProcessAsUserA(
          hNewProcessUserToken, 
          AppName,
          cmdLine,
          NULL,
          NULL,
          TRUE,
          0, 
          m_lpEnvironment,
          cwdStr
          &m_StartupInfo,
          &piProcInfo);

有什么明显的我做错了吗?我不能真正从线程 1 生成进程 - 它只是没有所需的正确信息,并且从线程 3 处理返回它......不是一个好的解决方案,也不是好的设计。

【问题讨论】:

  • 我不知道 IIS 在模拟方面是如何工作的(可能出于安全目的它做了一些奇怪的事情),但您可以尝试在进程上下文中打开令牌(通过将 TRUE 传递给 OpenThreadToken ) 或仅请求您实际需要的访问权限(而不是 TOKEN_ALL_ACCESS)。
  • 我试图使用 TOKEN_ALL_ACCESS 以防需要的权限没有得到很好的记录。它实际上成功到第三个线程。也无法在进程的上下文中打开它 - 它没有使用我尝试生成的进程所需的权限(出于安全原因)。

标签: c++ windows security winapi impersonation


【解决方案1】:

OpenThreadToken 在模拟情况下失败,因为模拟用户没有访问线程令牌的权限。你应该通过 OpenAsSelf = TRUE。

【讨论】:

  • 不能这样做 - 进程用户没有所需的权限,我无法更改。模拟用户与我打开第一个线程和第二个线程的用户相同 - 为什么第三次会失败?
  • OpenAsSelf 并不意味着给我主要令牌。这意味着在评估对令牌的访问时,再次检查主要而不是模拟。
  • 我意识到这一点。主令牌无权访问模拟令牌 - 它是受限权限默认 IIS 用户。
  • 这行得通——尽管我真的希望我能更好地理解为什么。这对我来说没有多大意义。
  • 有道理;该进程创建了相关令牌,因此它具有访问权限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
  • 2016-02-21
相关资源
最近更新 更多