2

サービスから実行できない BlockInput() 関数や NVIDIA の NVAPI 関数など、デスクトップ関連のリソースにアクセスできるように、ヘルパー インタラクティブ プロセスを管理者として作成するシステム サービスがあります。ログオンしたユーザーが管理者のメンバーである場合、次のことが機能しました。

  1. SE_TCB_NAME を含む特権レベルの設定
  2. WTSGetActiveConsoleSessionId() でアクティブなセッション ID を取得する
  3. WTSQueryUserToken() を使用して、セッション ID からログオン ユーザーを取得します。
  4. TokenLinkedToken を使用した GetTokenInformation()
  5. SecurityImpersonation を使用した DuplicateTokenEx()
  6. CreateProcessAsUser() でプロセスを起動

ただし、現在ログオンしているセッションを管理者ではなく標準ユーザーにすると、おそらく標準ユーザーに管理者レベルのトークンがリンクされていないため、ステップ 4. が失敗します。ここでの解決策は何ですか?管理者ユーザーの 1 人のトークンを取得する必要があると思いますが、どうすればよいですか? また、そのユーザーがログオンしていない場合でも、現在のデスクトップと対話する機能にアクセスできますか?

4

1 に答える 1

3

独自のトークンを複製し、SetTokenInformation関数を使用して複製したトークンのセッションを変更し、対話型セッションに入れることができます。

お気づきのように、対話型セッションで実行SYSTEMすることは推奨されません。対話型ユーザーがプロセスを攻撃するための開口部を与え、昇格された特権を取得する可能性があるためです。(詳細については、「粉砕攻撃」を検索してください。) ただし、この問題は、非管理ユーザーのセッションで管理ユーザーとして実行されているプロセスにも同様に当てはまります。

理想的には、対話型セッションで非管理プロセスを使用して対話型セッションを必要とする機能を実行し、サービスを使用して管理者特権を必要とする機能を実行する必要があります。両方を必要とする関数は存在しないはずですが、NVAPI がこの規則に違反している場合、それに対してできることはあまりありません。

このリスクを最小限に抑えるために、インタラクティブなユーザーのセッションで特別に作成された (適切に保護された) ワークステーションにプロセスを起動することを検討してください。

于 2014-01-15T01:21:29.567 に答える