
Étude reproductible de CVE-2024-36401 : RCE non authentifiée dans GeoServer via injection d'évaluation JXPath. Comprend un rapport technique, un exploit/vérificateur fonctionnel et un environnement Docker démontrant la vulnérabilité sur des instances vulnérables et corrigées.
Une étude complète et reproductible de CVE-2024-36401, une faille d'exécution de code à distance non authentifiée dans GeoServer — le serveur open-source le plus déployé pour les données géospatiales. Le bug est une injection d'évaluation : via les paramètres des normes OGC, GeoServer transmet des noms de propriété contrôlés par l'attaquant à GeoTools, où Apache Commons JXPath les évalue comme des expressions XPath et, par conception, peut appeler des méthodes Java arbitraires via la réflexion. Une requête non authentifiée telle que exec(java.lang.Runtime.getRuntime(),'id') exécute donc des commandes sur l'hôte.
Ce dépôt contient le rapport technique, un exploit/vérificateur fonctionnel et un environnement Docker en une commande qui démontre la RCE sur une instance vulnérable et montre le même exploit échouant sur l'instance patchée.
Projet éducatif. Construit pour un cours universitaire (Data Privacy and Security, LUISS DASMA). Tout s'exécute uniquement contre des conteneurs locaux et isolés — voir Utilisation responsable.
.
├── report/
│ ├── report.pdf # the full technical report (read this first)
│ ├── report.md # report source (Pandoc/XeLaTeX)
│ └── images/ # figures and screenshots
├── docker/
│ ├── vulnerable/Dockerfile # GeoServer 2.25.1 (vulnerable)
│ └── patched/Dockerfile # GeoServer 2.25.2 (fixed)
├── docker-compose.yml # vuln on :8080, patched on :8081
├── exploit/
│ ├── exploit.py # exploit + vuln/patched verifier (stdlib only)
│ ├── exploit.sh # curl-based PoC (GET + POST variants)
│ ├── payloads.md # payload catalogue per OGC endpoint
│ └── output/ # captured proof logs and transcripts
└── run-reproduction.sh # one command: build + exploit both + collect proofs
Prérequis : Docker Desktop en fonctionnement, python3, curl.
# Build both containers, run the exploit against each, and collect the proofs
chmod +x run-reproduction.sh
./run-reproduction.sh
Ou étape par étape :
docker compose up -d --build # vuln on :8080, patched on :8081
# Vulnerable (expected: VULNERABLE, ~8s delay)
python3 exploit/exploit.py -t http://localhost:8080/geoserver --label vuln -o exploit/output
# Patched (expected: PATCHED, immediate rejection)
python3 exploit/exploit.py -t http://localhost:8081/geoserver --label patched -o exploit/output
docker compose down # when finished
Deux sondes indépendantes rendent le résultat sans ambiguïté :
java.lang.Thread.sleep(8000) bloque le thread qui évalue le XPath, de sorte que la réponse HTTP est retardée d'environ 8 s — mesurable depuis le client, sans accès au conteneur. C'est le même canari utilisé par les tests officiels du correctif.exec(java.lang.Runtime.getRuntime(),'touch /tmp/<marker>') crée un fichier à l'intérieur du conteneur, vérifiable avec docker exec.Sur l'instance vulnérable, envoyer la charge utile à la main renvoie une ClassCastException sur ProcessImpl — la JVM a exécuté Runtime.exec puis n'a pas pu utiliser l'objet Process résultant comme attribut. Cette exception est la preuve de l'exécution :

Le commit e53e5170 de GeoTools (dans GeoServer 2.25.2, 2.24.4, 2.23.6, 2.22.6) applique une défense en profondeur sur les deux moitiés du bug :
JXPathUtils.newSafeContext(...) installe une FunctionLibrary vide, de sorte que JXPath ne peut plus résoudre exec/Thread.sleep comme des fonctions — la chaîne reste un simple nom de propriété.FeaturePropertyAccessorFactory vérifie maintenant aussi SimpleFeatureType, de sorte que les entités simples n'atteignent plus l'accesseur vulnérable.Sur l'instance patchée, la même charge utile renvoie No such attribute: ... et rien ne s'exécute.
Les détails complets — code affecté avec références de fichier/ligne, exploitation, diff de mitigation et la reproduction côte à côte — se trouvent dans report/report.pdf.
Ce CVE est public, a été patché depuis plus de 18 mois, figure dans le catalogue CISA Known Exploited Vulnerabilities et dispose de PoCs publics (Vulhub, Nuclei, Metasploit). Le code ici cible uniquement localhost et les conteneurs d'étude isolés de ce dépôt. Ne l'utilisez pas contre des systèmes que vous ne possédez pas ou pour lesquels vous n'êtes pas explicitement autorisé à tester.
MIT © 2026 Daniele Giovanardi
Daniele Giovanardi — Data Science and Management (DASMA), LUISS Guido Carli. Travail de cours pour Data Privacy and Security.
| Champ | Valeur |
|---|
| CVE (GeoServer) | CVE-2024-36401 |
| Cause racine (GeoTools) | CVE-2024-36404 |
| Type | Exécution de code à distance non authentifiée |
| CWE | CWE-95, Injection d'évaluation |
| CVSS v3.1 | 9.8 Critical (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| Affecté | GeoServer < 2.25.2 / GeoTools < 31.2 (et branches antérieures) |
| CISA KEV | Oui (15 juillet 2024) |
| Versions étudiées | Vulnérable 2.25.1, patchée 2.25.2 |