
Studio riproducibile di CVE-2024-36401: RCE non autenticata in GeoServer tramite iniezione JXPath eval. Include rapporto tecnico, exploit/verificatore funzionante e ambiente Docker che dimostra il difetto su istanze vulnerabili e patchate.
Uno studio completo e riproducibile di CVE-2024-36401, una vulnerabilità di esecuzione remota di codice non autenticata in GeoServer — il server open-source più diffuso per dati geospaziali. Il bug è un'eval injection: tramite i parametri degli standard OGC, GeoServer passa dei nomi di proprietà controllati dall'attaccante a GeoTools, dove Apache Commons JXPath li valuta come espressioni XPath e, per progettazione, può chiamare metodi Java arbitrari tramite reflection. Una richiesta non autenticata come exec(java.lang.Runtime.getRuntime(),'id') esegue quindi comandi sull'host.
Questo repository contiene il report tecnico, un exploit/verificatore funzionante e un ambiente Docker avviabile con un comando che dimostra la RCE su un'istanza vulnerabile e mostra lo stesso exploit fallire su quella patchata.
Progetto educativo. Realizzato per un corso universitario (Data Privacy and Security, LUISS DASMA). Tutto viene eseguito solo contro container locali e isolati — vedi Uso responsabile.
| Campo | Valore |
|---|---|
| CVE (GeoServer) | CVE-2024-36401 |
| Causa principale (GeoTools) | CVE-2024-36404 |
| Tipo | Esecuzione remota di codice non autenticata |
| CWE | CWE-95, Eval Injection |
| CVSS v3.1 | 9.8 Critical (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| Versioni affette | GeoServer < 2.25.2 / GeoTools < 31.2 (e branch precedenti) |
| CISA KEV | Sì (15 luglio 2024) |
| Versioni studiate | Vulnerabile 2.25.1, patchata 2.25.2 |
.
├── 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
Requisiti: Docker Desktop in esecuzione, python3, curl.
# Build both containers, run the exploit against each, and collect the proofs
chmod +x run-reproduction.sh
./run-reproduction.sh
Oppure passo dopo passo:
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
Due sonde indipendenti rendono il risultato inequivocabile:
java.lang.Thread.sleep(8000) blocca il thread che valuta l'XPath, quindi la risposta HTTP viene ritardata di ~8 s — misurabile dal client, senza bisogno di accesso al container. È la stessa canary usata dai test ufficiali della correzione.exec(java.lang.Runtime.getRuntime(),'touch /tmp/<marker>') crea un file dentro il container, verificabile con docker exec.Sull'istanza vulnerabile, l'invio manuale del payload restituisce una ClassCastException su ProcessImpl — la JVM ha eseguito Runtime.exec e poi non è riuscita a usare l'oggetto Process risultante come attributo. Quell'eccezione è la prova dell'esecuzione:

Il commit e53e5170 di GeoTools (in GeoServer 2.25.2, 2.24.4, 2.23.6, 2.22.6) applica una difesa in profondità su entrambe le metà del bug:
JXPathUtils.newSafeContext(...) installa una FunctionLibrary vuota, così JXPath non può più risolvere exec/Thread.sleep come funzioni — la stringa resta un semplice nome di proprietà.FeaturePropertyAccessorFactory ora controlla anche SimpleFeatureType, così le feature semplici non raggiungono più l'accessor vulnerabile.Sull'istanza patchata lo stesso payload restituisce No such attribute: ... e non viene eseguito nulla.
I dettagli completi — codice interessato con riferimenti a file/righe, sfruttamento, diff della mitigazione e riproduzione affiancata — sono in report/report.pdf.
Questa CVE è pubblica, è stata corretta da oltre 18 mesi, è presente nel catalogo CISA Known Exploited Vulnerabilities e dispone di PoC pubblici (Vulhub, Nuclei, Metasploit). Il codice qui presente ha come target solo localhost e i container di studio isolati di questo repository. Non usarlo contro sistemi che non possiedi o per i quali non sei esplicitamente autorizzato a eseguire test.
MIT © 2026 Daniele Giovanardi
Daniele Giovanardi — Data Science and Management (DASMA), LUISS Guido Carli. Elaborato per il corso di Data Privacy and Security.