
Reproduzierbare Studie von CVE-2024-36401: nicht authentisierte RCE in GeoServer über JXPath-Eval-Injection. Enthält technischen Bericht, funktionierenden Exploit/Verifier und Docker-Umgebung, die den Fehler auf verwundbaren und gepatchten Instanzen demonstriert.
Eine vollständige, reproduzierbare Studie von CVE-2024-36401, einer nicht authentifizierten Schwachstelle zur Remote-Codeausführung in GeoServer – dem am weitesten verbreiteten Open-Source-Server für Geodaten. Der Fehler ist eine Eval-Injection: Über die Parameter der OGC-Standards übergibt GeoServer angreifergesteuerte Eigenschaftsnamen an GeoTools, wo Apache Commons JXPath sie als XPath-Ausdrücke auswertet und, wie vorgesehen, über Reflexion beliebige Java-Methoden aufrufen kann. Eine nicht authentifizierte Anfrage wie exec(java.lang.Runtime.getRuntime(),'id') führt daher Befehle auf dem Host aus.
Dieses Repository enthält den technischen Bericht, einen funktionierenden Exploit/Verifizierer und eine Ein-Befehl-Docker-Umgebung, die die RCE auf einer anfälligen Instanz demonstriert und zeigt, wie derselbe Exploit auf der gepatchten Instanz .
Bildungsprojekt. Entwickelt für einen Universitätskurs (Data Privacy and Security, LUISS DASMA). Alles läuft nur gegen lokale, isolierte Container – siehe Verantwortungsvolle Nutzung.
| Feld | Wert |
|---|---|
| CVE (GeoServer) | CVE-2024-36401 |
| Root Cause (GeoTools) | CVE-2024-36404 |
| Typ | Nicht authentifizierte Remote-Codeausführung |
| 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) |
| Betroffen | GeoServer < 2.25.2 / GeoTools < 31.2 (and earlier branches) |
| CISA KEV | Ja (15. Juli 2024) |
| Untersuchte Versionen | Anfällig 2.25.1, gepatcht 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
Voraussetzungen: Docker Desktop läuft, python3, curl.
# Build both containers, run the exploit against each, and collect the proofs
chmod +x run-reproduction.sh
./run-reproduction.sh
Oder Schritt für Schritt:
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
Zwei unabhängige Sonden machen das Ergebnis eindeutig:
java.lang.Thread.sleep(8000) blockiert den Thread, der den XPath auswertet, sodass die HTTP-Antwort um ~8 s verzögert wird – messbar vom Client, kein Containerzugriff nötig. Es ist derselbe Canary, der in den offiziellen Fix-Tests verwendet wird.exec(java.lang.Runtime.getRuntime(),'touch /tmp/<marker>') erstellt eine Datei im Container, überprüfbar mit docker exec.Auf der anfälligen Instanz gibt das manuelle Senden der Payload eine ClassCastException auf ProcessImpl zurück – die JVM führte Runtime.exec aus und konnte dann das resultierende Process-Objekt nicht als Attribut verwenden. Diese Ausnahme ist der Beweis der Ausführung:

GeoTools Commit e53e5170 (in GeoServer 2.25.2, 2.24.4, 2.23.6, 2.22.6) wendet Defence in Depth auf beide Hälften des Fehlers an:
JXPathUtils.newSafeContext(...)-Helper installiert eine leere FunctionLibrary, sodass JXPath exec/Thread.sleep nicht mehr als Funktionen auflösen kann – der String bleibt ein einfacher Eigenschaftsname.FeaturePropertyAccessorFactory prüft jetzt auch SimpleFeatureType, sodass einfache Features den anfälligen Accessor nicht mehr erreichen.Auf der gepatchten Instanz gibt dieselbe Payload No such attribute: ... zurück und nichts wird ausgeführt.
Vollständige Details – betroffener Code mit Datei/Zeilenreferenzen, Exploitation, Mitigation-Diff und die Side-by-Side-Reproduktion – finden Sie in report/report.pdf.
Dieses CVE ist öffentlich, wurde seit über 18 Monaten gepatcht, ist im CISA-Katalog der bekannten ausgenutzten Schwachstellen enthalten und hat öffentliche PoCs (Vulhub, Nuclei, Metasploit). Der Code hier zielt nur auf localhost und die isolierten Studiencontainer in diesem Repository ab. Verwenden Sie ihn nicht gegen Systeme, die Ihnen nicht gehören oder für die Sie nicht ausdrücklich berechtigt sind, Tests durchzuführen.
MIT © 2026 Daniele Giovanardi
Daniele Giovanardi — Data Science and Management (DASMA), LUISS Guido Carli. Kursarbeit für Data Privacy and Security.