
Steam Client Service のローカル特権昇格の脆弱性

PoC動画: こちら
John Hammondによる素敵な短い動画はこちら
インスピレーションをくれた @MSNIGHTMARE2000 に感謝 - 彼に仕事を与えて、メールを送ってあげてください!
最高の仲間である Tookie、Hazetick、belogen、bet3rd に shoutout。
そしてあなたはまだ私に Overwatch か Starlight Princess のゲームセッションを貸しがあるよ lusilly、にゃー :3
BrokenPipeは、標準のWindowsアカウントからSteamクライアントサービスを介して
NT AUTHORITY\SYSTEMへのローカル権限昇格を実証するものです。このPoCは、管理者資格情報を要求したりUACプロンプトを表示したりすることなく、対話型のSYSTEM
コマンドプロンプトを起動します。
NT AUTHORITY\SYSTEMとして実行されました。whoami /userはローカルシステムSID、S-1-5-18を返しました。常にSYSTEMとして実行されるSteamクライアントサービス(steamservice.exe)は、正規のValve署名済みインストールスクリプトVDFの署名によってカバーされていない、呼び出し元が制御するインストールルートを受け入れます。BrokenPipeはこの署名カバレッジのギャップを利用して、特権サービスに、含まれているランチャーを移転されたパスからSYSTEMとして実行させます。VDF署名を偽造、改変、またはバイパスするものではありません。
パイプライン:
SteamクライアントサービスへのIPC接続を確立(管理者権限不要)
|
v
IClientInstallUtils::AddInstallScriptToWhiteList
|
| 正規のValve署名済みVDF
| 呼び出し元が制御するインストールルート <------ ここに欠陥が存在。
| 移転されたランチャーがホワイトリストに登録される <---------ˡ
v
IClientInstallUtils::RunInstallScript
|
| サービスがrun VDFを処理
| ホワイトリスト登録されたランチャーが選択される
v
Steamクライアントサービスが実行ファイルをSYSTEMとして起動
|
| BrokenPipeが対話型の
| NT AUTHORITY\SYSTEMコマンドプロンプトを受け取る
v
IClientInstallUtils::GetInstallScriptExitCode
|
| オプションのポーリングまたは結果収集
v
クリーンアップとレシート生成
このPoCは、最新バージョンのWindows 10およびWindows 11 x64上の現在のSteamバージョン10.96.30.42に対して検証されました。
要件:
プロジェクトディレクトリでPowerShellを開き、以下を実行します:
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\build.ps1
完成した実行ファイルは以下に出力されます:
x64\Release\BrokenPipe.exe
ビルドスクリプトはMSBuildを検出し、埋め込まれたペイロードのハッシュを検証し、x64 Release 構成を再ビルドし、最終的な実行ファイルのパスとSHA-256を出力します。
Visual StudioでBrokenPipe.slnを開き、Release | x64を選択して
ビルド > ソリューションのリビルドを選ぶこともできます。
BrokenPipe.exeを昇格せずに通常どおり実行します。whoamiまたはwhoami /user、あるいは実行したいその他のコマンドで新しいSYSTEMプロンプトを確認します。exitと入力するか、SYSTEMプロンプトを閉じます。コマンドライン引数や外部ランタイムファイルは不要です。ペイロードZIPは実行ファイルにコンパイルされています。このPoCは永続化を作成せず、正規の
C:\Windows\System32\cmd.exeのみを起動し、昇格されたプロセスツリーをkill-on-closeのWindowsジョブに配置します。
JSONレシートはC:\Users\Public\BrokenPipeに書き込まれます。
使用するペイロードに調整を加えたい場合、それはpayloadsフォルダにBrokenPipePayload.zipという名前で置かれています。
BrokenPipe\
assets\
brokenpipe-system-shell.png
payload\
BrokenPipePayload.zip
BrokenPipe-Bootstrap.ps1
BrokenPipe.cpp
BrokenPipe.rc
BrokenPipe.sln
BrokenPipe.vcxproj
build.ps1
resource.h
README.md
埋め込まれたペイロードは、そのリソースパスも
BrokenPipe.rcで更新されない限り、payload\BrokenPipePayload.zipに置かれている必要があります。
Q: これは何ですか
A: 標準ユーザー -> SYSTEMへのローカル権限昇格です
Q: どのように動作しますか?
A: Payload\BrokenPipePayload.zipを調べ、解凍してコードを読んでください。
Q: 役に立たないのでは?
A: あなたにとっては、おそらく。他の人にとっては、おそらくそうではないでしょう。
Q: 何がそんなに悪いのですか
A: SYSTEM権限を取得しているのです。これはAdministrator(右クリックして選択するもの)より1段階高く、TRUSTEDINSTALLERより1段階低いもので、実際には最初から管理者ではないのにです。これが理解できないなら、Googleで調べてください(あるいはGrok、ChatGPT、SiriなどおなじみのLLMに聞いてください、笑)
Q: なぜ?
A: VALVEは3月からすでにこれを認識していて、修正していないからです。そして、私がSteamやVALVEのゲーム、特にCS2がチーターやエクスプロイターで溢れかえっているのを気にしていないからにすぎません。彼らは修正して、その5か月前の報告を調査すべきです。
Q: 誰かがした、私の脳細胞を少し失わせた、とある愚かな標準管理者インストールの質問か何か...
A: あなたのアンチウイルスでさえ、インストールするときには管理者権限が必要です。Steamのインストールも当然、最初のインストール時には管理者権限が必要です。その後は、標準ユーザーであってもサービスをSYSTEMとして実行するだけです。私に聞かないで、VALVEに聞いてください。
このプロジェクトは、許可されたセキュリティ研究および防御的検証のために提供されています。所有しているシステム、または評価する明示的な許可を得ているシステムでのみテストしてください。