WindowsVista/Windows7特権:Sedebugprivilege&OpenProcess
-
05-10-2019 - |
質問
私のニーズのために適切な特権にエスカレートすることについて私が見つけることができたすべてのことは、私の現在の方法に同意していますが、問題は存在します。私は、誰かが暗闇しかない場所に光を輝かせるかもしれないWindows Vista/Windows 7 Internals Experienceを持っているかもしれないことを願っています。私はこれが長くなると確信していますが、私と一緒に耐えてください。
コンテクスト
現在のマシン上の他のプロセスのメモリにアクセスする必要があるアプリケーションに取り組んでいます。これには、明らかに、管理者の権利が必要です。それも必要です SeDebugPrivilege
(いいえ、それは間違いではありません SetDebugPrivilege
)、私は自分自身が正しく獲得していると信じていますが、より多くの特権が必要ではないかどうか、したがって私の問題の原因であるかどうか疑問に思います。これまでのところ、コードはWindows XPのすべてのバージョンと、テストVista 32ビットおよびWindows 7 64ビット環境で正常に機能しています。
プロセス
- プログラムはそうします いつも 管理者の権利で実行されます。これは、この投稿全体で想定できます。
- 現在のプロセスのエスカレート
Access Token
含めるSeDebugPrivilege
権利。 - 使用
EnumProcesses
システム上に現在のPIDのリストを作成するには - 使用してハンドルを開く
OpenProcess
とPROCESS_ALL_ACCESS
アクセス権 - 使用
ReadProcessMemory
他のプロセスの記憶を読む。
問題:
開発中および私の個人テスト中にすべてが正常に機能しています(Windows XP 32&64、Windows Vista 32、およびWindows 7 X64を含む)。ただし、同僚のWindows Vista(32ビット)とWindows 7(64ビット)マシンの両方にテスト展開中に、特権/権利の問題があるようです OpenProcess
ジェネリックで失敗します Access Denied
エラー。これは、限られたユーザーとして実行されるとき(予想されるように)、および管理者として明示的に実行するときにも発生します(右クリック→ 管理者として実行 そして、管理者レベルのコマンドプロンプトから実行するとき)。
しかし、この問題は、私のテスト環境では自分にとっては非形成できません。私は問題を直接目撃したので、問題が存在すると信じています。実際の環境とテスト環境の間で識別できる唯一の違いは、 実際 UACプロンプトでドメイン管理者アカウントを使用するとエラーが発生しますが、私のテスト(エラーなしで動作します)は、UACプロンプトでローカル管理者アカウントを使用します。
使用されている資格情報はUACが「管理者として実行」することを可能にしますが、プロセスはまだ正しい権利を取得していないようです OpenProcess
別のプロセスについて。私はこれが何であるかを知るためにVista/Windows 7の内部に十分に精通していません。誰かが何が原因であるかについてのアイデアを持っていることを望んでいます。
キッカー
このエラーを報告した人、そして環境がこのバグを定期的に再現できる人は、の線に沿って名前が付けられた小さなアプリケーションを持っています RunWithDebugEnabled
これは、独自の特権をエスカレートするように見える小さなブートストラッププログラムであり、それに渡された実行可能ファイルを起動します(したがって、エスカレートされた特権を継承します)。このプログラムで実行すると、UACプロンプトで同じドメイン管理者資格情報を使用して、プログラムは正しく機能し、正常に呼び出すことができます OpenProcess
意図したとおりに動作します。
したがって、これは間違いなく正しい特権を取得することの問題であり、ドメイン管理者アカウントが知られています は 正しい権利にアクセスできるはずの管理者アカウント。 (明らかにこのソースコードを取得するのは素晴らしいことですが、それが可能であればここにはいません)。
ノート
前述のように、失敗したエラー OpenProcess
試みはそうです Access Denied
. 。のMSDNドキュメントによると OpenProcess
:
発信者がSedebugprivilegeの特権を有効にした場合、セキュリティ記述子の内容に関係なく、要求されたアクセスが許可されます。
これにより、(1)取得することで、これらの条件下で問題があると信じるようになります。 SeDebugPrivileges
または(2)MSDNドキュメントで言及されていない他の特権を要求し、ドメイン管理者アカウントとローカル管理者アカウント間で異なる場合がある
サンプルコード:
void sample()
{
/////////////////////////////////////////////////////////
// Note: Enabling SeDebugPrivilege adapted from sample
// MSDN @ http://msdn.microsoft.com/en-us/library/aa446619%28VS.85%29.aspx
// Enable SeDebugPrivilege
HANDLE hToken = NULL;
TOKEN_PRIVILEGES tokenPriv;
LUID luidDebug;
if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken) != FALSE)
{
if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luidDebug) != FALSE)
{
tokenPriv.PrivilegeCount = 1;
tokenPriv.Privileges[0].Luid = luidDebug;
tokenPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if(AdjustTokenPrivileges(hToken, FALSE, &tokenPriv, 0, NULL, NULL) != FALSE)
{
// Always successful, even in the cases which lead to OpenProcess failure
cout << "SUCCESSFULLY CHANGED TOKEN PRIVILEGES" << endl;
}
else
{
cout << "FAILED TO CHANGE TOKEN PRIVILEGES, CODE: " << GetLastError() << endl;
}
}
}
CloseHandle(hToken);
// Enable SeDebugPrivilege
/////////////////////////////////////////////////////////
vector<DWORD> pidList = getPIDs(); // Method that simply enumerates all current process IDs
/////////////////////////////////////////////////////////
// Attempt to open processes
for(int i = 0; i < pidList.size(); ++i)
{
HANDLE hProcess = NULL;
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pidList[i]);
if(hProcess == NULL)
{
// Error is occurring here under the given conditions
cout << "Error opening process PID(" << pidList[i] << "): " << GetLastError() << endl;
}
CloseHandle(hProcess);
}
// Attempt to open processes
/////////////////////////////////////////////////////////
}
ありがとう!
上記の条件下でWindows VistaおよびWindows 7で別のプロセスを正しく開くために(実行可能ファイルが適切に「管理者として実行される」と仮定していると仮定して、私が不足している可能性のある許可、特権、権利などについての洞察がある場合は、それは最も大歓迎です。
私が絶対に困惑していなければここにはいませんでしたが、グループの経験と知識が明るく輝くことをもう一度期待しています。このテキストの壁を読んでくれてありがとう。善意だけで高く評価されています。スタックオーバーフローをすべての人にとって非常に便利にするタイプの人であることに感謝します!
解決
だから、多くのデバッグをして多くの人々を情報のために悩ませた後、私はついに書いた男を追跡することができました RunWithDebugEnabled
アプリケーションとそれがどのように動作するかの要約を取得します。
この場合、問題はそれです Debug programs
ドメイン管理者のローカルポリシーの特権は削除されていたため、 SeDebugPrivilege
トークンはプロセスのアクセストークンには存在しませんでした。まったく存在しない場合は有効にすることはできません。既存のアクセストークンに特権を追加する方法はまだわかりません。
現在の魔法の仕組み:
だから RunWithDebugEnabled
マジックアプリケーションは、管理者の権利を使用してサービスとしてインストールし、それ自体を開始し、したがって、 SYSTEM
ドメイン管理者ではなくユーザーアカウント。と SYSTEM
その後、アプリは、管理者トークンと同一の新しいアクセストークンを作成します。 SeDebugPrivilege
トークンプレゼント。この新しいトークンは慣れています CreateProcessAsUser()
新しく有効になっている状態でプログラムを実行します SeDebugPrivilege
それは前に欠けていました。
私は実際にこの「解決策」が好きではなく、この特権を得るための「クリーン」な方法を探し続けています。私はこれをここで別の質問として投稿します。これは、他の人が将来の参照のために従うのを助けるために、ここにもリンクすることを忘れないようにします。
編集: 管理者アカウントからシステム(または同等)になりすまします
この問題のデバッグと解決を手伝ってくれたあなたの時間とエネルギーに感謝します。本当に大歓迎です!