
Windows 10 診断ハブ標準コレクターサービスにおける権限昇格のPoC
Windows 10 診断ハブ標準コレクターサービスにおける権限昇格のPoC
Diagnostics Hub パッケージングライブラリは、Windows 標準コレクターサービスで使用されており、DiagnosticsHub.StandardCollector.Runtime.dll にクライアントの偽装処理が欠如しているため、任意のファイルを任意の場所に強制的にコピーさせることが可能です。
この脆弱性の発見と悪用に関する詳細な解説はこちら: Windows 標準コレクターサービスにおける権限昇格の脆弱性
標準コレクターサービスは、診断セッションを構成する際に、スクラッチディレクトリやセッションIDなど、いくつかの値を定義することができます。セッションIDは任意のGUID、スクラッチディレクトリはユーザーが書き込み権限を持つ任意の場所を指定できます。コレクションセッションがID c13851b2-b1e1-438f-bf73-949df897f1bf、スクラッチパス C:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\ で構成されている場合、ICollectionSession オブジェクトの GetCurrentResult メソッドを呼び出すと、以下のイベントが発生します。
C:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etlC:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1C:\Users\Bob\AppData\Local\Temp\Microsoft\F12\perftools\visualprofiler\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1\EAD6A227-31D4-4EA2-94A9-5DF276F69E65これらのフォルダとETLファイルは、通常セッション終了時に作成される .diagsession パッケージのためにコレクターサービスによって作成されます。ICollectionSession オブジェクトの Stop メソッドを呼び出すと、コレクターサービスは Microsoft::DiagnosticsHub::Packaging::DhPackageDirectory::CommitPackage を呼び出して診断パッケージをコミットします。CommitPackage 関数は、元の {scratch path}\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl ファイルをランダムGUIDフォルダにコピーまたは移動します: {scratch path}\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1\EAD6A227-31D4-4EA2-94A9-5DF276F69E65\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl
DiagnosticsHub.StandardCollector.Runtime.dll 内の CommitPackagingResult 関数によってトリガーされるコピー/移動操作は、ユーザーを偽装せずに実行されるため(初期のファイル/フォルダ作成時とは異なり)、対象フォルダがコピー先を任意の場所にリダイレクトするマウントポイントに置き換えられた場合、TOCTOU 問題が発生する可能性があります。この問題を有効に悪用するには、攻撃者はコピー前にETLファイルの内容をすり替える必要があります。これは、サービスがファイルハンドルを解放した後に、OpLock を使用して競合状態に打ち勝つことで実現できます。
コピーされる .etl ファイルの名前を完全に制御できるわけではありませんが、オブジェクトディレクトリのシンボリックリンクのトリックを使用して制御できます。マウントポイント+シンボリックリンクの設定は次のようになります:
{scratch path}\Report.c13851b2-b1e1-438f-bf73-949df897f1bf.1\EAD6A227-31D4-4EA2-94A9-5DF276F69E65\ -> \RPC Control\\RPC Control\c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl -> C:\Windows\System32\anything.dllファイルの内容、コピー先、ファイル名を制御できるため、攻撃者には多数のDLL読み込みの可能性が生じます。ただし、含まれているPoCでは、コレクターサービスは C:\Windows\System32 または C:\Windows\System32\DiagSvcs ディレクトリ内にあれば、ファイル名に関係なくDLLを読み込むため、ファイル名の制御は不要であることを示しています。これは、コピーされたDLLの名前 c13851b2-b1e1-438f-bf73-949df897f1bf.1.m.etl と一致するアセンブリ名を持つエージェントを使用して、新しいコレクターセッションを開始することで行われます。
含まれているPoCは、notepad.exe をポップアップさせるペイロード用のC++ DLLプロジェクトと、サービスと対話し NtApiDotNet ライブラリを使用して脆弱性を悪用するC#プロジェクトからなるVSソリューションです。
再現手順:
期待される結果:
パッケージコミット操作がユーザーを偽装し、ファイルのコピーを試みた際に失敗する。
実際の結果:
ファイルがマウントポイントのターゲットフォルダ C:\Windows\System32 にコピーされ、その後コレクターエージェントとして読み込まれ、最後に notepad.exe が SYSTEM 権限で起動される。