FlawOpen

flawopen.com/Incidents/wordpress-stored-xss-admin-session-campaign-october-2026

● WordPress plugin installations (campaign observations attributed to Patchstack) · CVE-2026-93836 · 2026-10-04 · CVSS 7.2 · 高
セキュリティ研究 · FlawOpen

WordPressの保存型XSS攻撃:2つのプラグインと1つの永続化チェーン

Patchstackは、WordPressの2つの保存型XSSを介して同じ侵入後インプラントを使おうとする試みを観測しました。両プラグインを更新し、永続化を調査してください。更新だけでは侵害済みサイトを修復できません。[1], [2], [3], [4], [5]

💡 わかりやすい解説 (ELI5)

管理者が後から読む公開の意見箱を2つ想像してください。サイトが投稿を単なるテキストではなく実行可能なマークアップとして保存すると、管理者が開いたときに、そのブラウザー権限で動作するおそれがあります。報告によると、異なる2つのプラグインの欠陥が侵入口として使われ、その後、更新後もアクセスを保つ試みがありました。[1], [8], [9]

主要な概念と専門用語

保存型XSS
攻撃者が制御するテキストを保存し、後でブラウザー上の実行可能なマークアップとして表示する問題です。今回はWordPress管理画面の表示が重要です。[2], [3], [8], [9]
同一オリジンのセッション
ブラウザーは同一オリジンのリクエストにサイトのセッションを自動で付与します。そのサイト内ですでに動作しているスクリプトは、HttpOnly Cookieを読み取らずにページ経由で操作できます。[1], [17], [18]
永続化
初期の脆弱性を修正した後も残るアクセス手段です。未承認アカウントやファイルなどが該当し、プラグイン更新だけでは削除されません。[1]
CVSSスコアの出典
Wordfence CNAの各CVEレコードはCVSS 3.1を7.2としています。PatchstackのWPC Product Bundles向け告知は7.1を示します。本記事ではCVEレコードのスコアを使い、出典を明記します。[2], [3], [6]
ソースコードの参照先
Wordfence CNAの参照先は、検証、保存、管理画面での表示に関係するWPC Product BundlesとNinja Formsのバージョン固定ファイルを示しています。これは調査用の参照先であり、確認済みの修正diffではありません。上記PHPコードは出力エンコードの説明用モデルで、プラグインコードの再構成ではありません。[8], [9], [10], [11], [12], [13], [14], [15], [16]

フレームワーク対応

インシデントのタイムライン

2026-09-21 / 2026-09-22

Wordfence CNAの記録では公開日は9月21日ですが、Patchstackは脆弱性が9月22日に公表済みだったとしています。両者には1日の差があります。CVE記録では、それぞれ8.6.6および3.15.3までのプラグイン版が影響対象です。[2], [3], [8], [9], [1]

2026-10-04〜2026-10-05

Patchstackは同じ侵入後段階を使う試みを、まずWPC Product Bundles、翌日にNinja Forms経由で観測したと報告しました。分析は10月6日に公開されました。[1]

ステップ・バイ・ステップの攻撃フロー

ステップ 1

2つの別個の保存型XSS入口

Patchstackによると、攻撃活動ではWPC Product BundlesのCVE-2026-93836とNinja FormsのCVE-2026-94504が使われました。別々の脆弱性であり、共通の後続活動によって関連付けられています。[1], [2], [3], [8], [9]

ステップ 2

保存された内容を管理者が開く

送信データは保存され、注文やフォーム送信の管理画面に表示されます。出力処理が不適切だとマークアップとして実行され、管理者がページを開くことでブラウザー上の実行コンテキストが成立します。[1], [8], [9], [10], [11], [12], [13], [14]

ステップ 3

スクリプトはサイトのコンテキストを継承

WordPressのオリジンで実行されるコードは、管理者の既存セッションを使って同一オリジンのリクエストを送信できます。HttpOnlyはCookieの秘匿性を守りますが、同オリジンで動くコードによるセッション利用は防げません。[1], [17], [18]

ステップ 4

後続アクセスは脆弱性修正後も残り得る

Patchstackはプラグインの導入や追加の永続化を試みたと報告しています。これはキャンペーンでの観測であり、すべての標的で成功したことを示すものではありません。更新は脆弱な入口を閉じますが、すでに行われた変更は取り消しません。[1], [4], [5]

ソースコード比較:脆弱 vs 堅牢化

これは汎用モデルではなく、Ninja Forms の Textarea::admin_form_element() におけるソースコード上の変更です。3.15.3 は保存済みの送信内容を textarea の HTML 本文へ直接補間していましたが、3.15.4 は出力前に esc_textarea() を適用します。これにより、この文脈で内容がマークアップとして解釈される境界を閉じます。この例は CVE-2026-94504 の Ninja Forms 側だけを示し、CVE-2026-93836 に対する WPC Product Bundles の修正ではありません。他の HTML 文脈では用途に合ったエスケープを使ってください。[13], [15], [16]

脆弱な実装
public function admin_form_element( $id, $value )
{
    return "<textarea class='widefat' name='fields[$id]'>$value</textarea>";
}
堅牢化されたセキュアパッチ
public function admin_form_element( $id, $value )
{
    return "<textarea class='widefat' name='fields[$id]'>" . esc_textarea( $value ) . "</textarea>";
}

エンジニアリング&システム堅牢化チェックリスト

参考資料