
CVE-2026-8181 - Burst Statistics WordPressプラグインの認証バイパス用エクスプロイト
CVE-2026-8181 のエクスプロイトです。Chloe Chamberland と PRISM によって発見されました。
このリポジトリは研究および防御目的のセキュリティ用途にのみ提供されます。著者は、この情報の悪用について一切の責任を負いません。
WordPress 用プラグイン Burst Statistics – Privacy-Friendly WordPress Analytics は、バージョン 3.4.0 から 3.4.1.1 まで において、認証バイパスによる管理者権限昇格につながる脆弱性の影響を受けます。
この脆弱性は、プラグインの MainWP プロキシの is_mainwp_authenticated() メソッドに存在し、wp_authenticate_application_password() が返す WP_Error 以外の戻り値を、誤って認証成功として扱います。
これにより、有効な管理者ユーザー名を知っている未認証の攻撃者は、POST /wp-json/wp/v2/users などの WordPress コアのエンドポイントを含む任意の REST API リクエストの間、その管理者になりすますことができます。既存の管理者の認証情報が漏洩することはありませんが、攻撃者は新しい管理者アカウントを作成するのに十分な間、その権限を取得します。
脆弱性の連鎖は次のとおりです。
includes/class-burst.php:41 -> プラグインは plugins_loaded の優先度 9 で init() を登録し、すべてのリクエスト(REST を含む)に対して bootstrap() を実行して has_admin_access() を呼び出します。
includes/Traits/trait-admin-helper.php:202 -> リクエストがヘッダー X-BurstMainWP: 1 を保持している場合、has_admin_access() は MainWP_Proxy をインスタンス化し、認証を is_mainwp_authenticated() に委任します。
includes/Frontend/class-mainwp-proxy.php:314 -> このメソッドは Authorization ヘッダーを読み取り、Basic 認証情報をデコードして、攻撃者が指定した / を WordPress コアの に転送します。
したがって、偽のパスワードを使った単一の HTTP リクエストで、WordPress コア REST API レベルにおいて任意の管理者になりすますことができます。
有効なプラグイン — ホームページの HTML が、プラグインがキュー登録されている場合にのみそのアセットを参照します:
echo http://127.0.0.1:8000 | httpx -silent -mr '/wp-content/plugins/burst-statistics/'
バージョン — readme.txt は静的に提供され、インストールされているバージョンを公開します(脆弱: 3.4.0–3.4.1.1、修正済み: 3.4.2+):
echo http://127.0.0.1:8000 | httpx -silent -path /wp-content/plugins/burst-statistics/readme.txt -er 'Stable tag:\s*[0-9][0-9a-zA-Z.\-]*'
同梱の CVE-2026-8181.yaml nuclei テンプレートは、両方のチェックとバージョン比較を自動化します:
nuclei -t CVE-2026-8181.yaml -u http://127.0.0.1:8000
脆弱なバージョンのプラグインが検出されたら、悪用には有効な管理者ユーザー名を知っている必要があります。WordPress の REST API は、ほとんどのインストールで公開ユーザーエンドポイントを通じてユーザー名を漏洩させます:
echo http://127.0.0.1:8000 | httpx -silent -path '/wp-json/wp/v2/users' -er '"slug":"[^"]+"'
そのエンドポイントが(Disable REST API や Stop User Enumeration などによって)制限されている場合でも、通常は著者アーカイブの手法(/?author=N)によって /author/<username>/ へのリダイレクト経由でユーザー名が漏洩します。
有効なユーザー名を入手すると、エクスプロイトは単一のリクエストで新しい管理者アカウントを作成します:
Python の依存関係をインストールします:
python3 -m venv venv
venv/bin/pip install -r requirements.txt
既知の管理者ユーザー名を -u で指定して、標的に対してエクスプロイトを実行します:
venv/bin/python3 CVE-2026-8181.py -t http://127.0.0.1:8000 -u admin
出力例:
[2026-05-16] [12:20:20] [info] [config] Impersonating admin='admin', will create new admin 'pwn_322a4903' / 'kS8D^2A^P^%UtWyuUS3p8%64' ([email protected]).
[2026-05-16] [12:20:21] [success] [http://127.0.0.1:8000] Authentication bypass successful — new administrator created: username='pwn_322a4903' password='kS8D^2A^P^%UtWyuUS3p8%64'
新しく作成した管理者アカウントで /wp-admin/ にログインします。
バイパスが機能するのは、Authorization ヘッダーが $_SERVER['HTTP_AUTHORIZATION'] 経由で PHP に到達した場合のみです。プレーンなパーマリンクを使用した Apache + mod_php(WordPress の標準の初期設定)では、.htaccess が生成されず、ヘッダーは黙って取り除かれるため、エクスプロイトは成功しません。
設定 → パーマリンク でプレーン以外のパーマリンクに切り替えると、WordPress 5.6+ は RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] ディレクティブを .htaccess に書き込み、転送を復元します。Nginx + PHP-FPM と LiteSpeed は、パーマリンクに関係なくデフォルトで Authorization を転送します。パーマリンクが本番環境で SEO の標準であることから、この脆弱性が CVSS 9.8 未認証 と評価されています。
エクスプロイトは最初に /wp-json/wp/v2/users を試行し、次に /index.php?rest_route=/wp/v2/users にフォールバックするため、エンドポイントのルーティングが妨げになることは決してありません — 妨げになるのはヘッダー転送のみです。
usernamepasswordwp_authenticate_application_password()includes/Frontend/class-mainwp-proxy.php:328-329 -> 戻り値は is_wp_error() でのみチェックされます。WordPress コアは、アプリケーションパスワードが使用されていない場合、またはリクエストが API リクエストとしてフラグ設定されていない場合に、変更されていない $input_user(ここでは null)を返します。plugins_loaded の優先度 9 の時点では、REST API はまだ application_password_is_api_request フィルターを true に設定していないため、脆弱なコードが実行されると常に2番目の条件が満たされます — そして null は WP_Error ではないため、ガードチェックを通過します。
includes/Frontend/class-mainwp-proxy.php:336 -> wp_set_current_user( $user->ID ) は、攻撃者が指定したユーザー名のみから検索されたユーザーを指定して呼び出され、リクエスト全体でグローバルに認証されたユーザーを設定します。