2011-01-27 21 views
3

私は、スレッドレベルの偽装とプロセス生成を行う、以前に書かれたクラスでいくつか問題があります。問題は、私がこれらのユーティリティクラスを使用していることが他の誰かがそれらを使って何をしようとしているかを超えていることにあります。スレッド偽装のマルチレベル使用

最初に、ImpersonateLoggedOnUserと共にOpenThreadTokenとDuplicateTokenを使用してスレッドレベルのなりすましを行います。

OpenThreadToken/DuplicateTokenで取得したトークンを使用してCreateProcessAsUserを使用してプロセスを作成しようとします。

私はに実行している問題は、私が持っているということです。

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 

産卵プロセス1は、OpenThreadTokenからエラーコード5で失敗します。私がスレッド1からプロセス1を起動すると、OpenThreadTokenは私に何のguffも与えません。私は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からそれに戻ってハンドルを持っている...良いソリューションではなく、良いデザインではありません。

+1

IISが偽装に関してどのように動作するのかわかりません(セキュリティ上の理由から奇妙なことがあります)。ただし、プロセスのコンテキストで(TRUEをOpenThreadTokenに渡すことによって)トークンを開こうとするか、実際に必要なアクセス権(TOKEN_ALL_ACCESSではなく)。 – Luke

+0

私はTOKEN_ALL_ACCESSを使用しようとしていましたが、必要な権限が十分に文書化されていない場合があります。実際には3番目のスレッドまで成功します。 プロセスのコンテキストで開くことはできません。セキュリティ上の理由から、生成しようとしているプロセスを使用するために必要な権限がありません。 –

答えて

2

偽装されたユーザーにスレッドのトークンにアクセスする権限がないため、OpenThreadTokenが偽装されたケースで失敗します。 OpenAsSelf = TRUEを渡す必要があります。

+0

これを行うことはできません - プロセスユーザーに必要な権限がなく、変更できません。偽装されたユーザーは、最初のスレッドと2番目のスレッドを開いたユーザーと同じです - なぜ3回失敗するのですか? –

+0

OpenAsSelfは私にプライマリトークンを与えることを意味しません。これは、トークンへのアクセスを評価し、偽装されたものではなくプライマリを再度チェックすることを意味します。 – John

+0

私はこれを実現します。プライマリトークンには、偽装トークンにアクセスする権限がありません。これは、制限された権利の既定のIISユーザーです。 –

関連する問題