
Estudo reproduzível do CVE-2024-36401: RCE não autenticado no GeoServer via JXPath eval injection. Inclui relatório técnico, exploit/verificador funcional e ambiente Docker demonstrando a falha em instâncias vulneráveis vs. corrigidas.
Um estudo completo e reproduzível da CVE-2024-36401, uma falha de execução remota de código não autenticada no GeoServer — o servidor de código aberto mais amplamente utilizado para dados geoespaciais. O bug é uma injeção de eval: através dos parâmetros dos padrões OGC, o GeoServer entrega nomes de propriedade controlados pelo atacante ao GeoTools, onde o Apache Commons JXPath os avalia como expressões XPath e, por design, pode chamar métodos arbitrários do Java via reflexão. Uma requisição não autenticada como exec(java.lang.Runtime.getRuntime(),'id') portanto executa comandos no host.
Este repositório contém o relatório técnico, um exploit/verificador funcional e um ambiente Docker de um comando que demonstra a RCE em uma instância vulnerável e mostra o mesmo exploit falhando na instância corrigida.
Projeto educacional. Construído para um curso universitário (Data Privacy and Security, LUISS DASMA). Tudo é executado apenas contra contêineres locais e isolados — veja Uso responsável.
.
├── 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
Requisitos: Docker Desktop em execução, python3, curl.
# Build both containers, run the exploit against each, and collect the proofs
chmod +x run-reproduction.sh
./run-reproduction.sh
Ou passo a 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
Duas sondas independentes tornam o resultado inequívoco:
java.lang.Thread.sleep(8000) bloqueia a thread que avalia o XPath, então a resposta HTTP é atrasada em ~8 s — mensurável a partir do cliente, sem necessidade de acesso ao contêiner. É o mesmo canário usado pelos testes oficiais da correção.exec(java.lang.Runtime.getRuntime(),'touch /tmp/<marker>') cria um arquivo dentro do contêiner, verificável com docker exec.Na instância vulnerável, enviar o payload manualmente retorna uma ClassCastException em ProcessImpl — a JVM executou Runtime.exec e então falhou ao usar o objeto Process resultante como um atributo. Essa exceção é a prova de execução:

O commit e53e5170 do GeoTools (no GeoServer 2.25.2, 2.24.4, 2.23.6, 2.22.6) aplica defesa em profundidade em ambas as metades do bug:
JXPathUtils.newSafeContext(...) instala uma FunctionLibrary vazia, então o JXPath não pode mais resolver exec/Thread.sleep como funções — a string permanece um nome de propriedade simples.FeaturePropertyAccessorFactory agora também verifica SimpleFeatureType, então features simples não alcançam mais o accessor vulnerável.Na instância corrigida, o mesmo payload retorna No such attribute: ... e nada é executado.
Detalhes completos — código afetado com referências de arquivo/linha, exploração, diff de mitigação e a reprodução lado a lado — estão em report/report.pdf.
Esta CVE é pública, foi corrigida há mais de 18 meses, está no catálogo CISA Known Exploited Vulnerabilities e possui PoCs públicos (Vulhub, Nuclei, Metasploit). O código aqui tem como alvo apenas localhost e os contêineres de estudo isolados neste repositório. Não o use contra sistemas que você não possui ou para os quais não está explicitamente autorizado a testar.
MIT © 2026 Daniele Giovanardi
Daniele Giovanardi — Data Science and Management (DASMA), LUISS Guido Carli. Trabalho de curso para Data Privacy and Security.
| Campo | Valor |
|---|
| CVE (GeoServer) | CVE-2024-36401 |
| Causa raiz (GeoTools) | CVE-2024-36404 |
| Tipo | Execução Remota de Código Não Autenticada |
| CWE | CWE-95, Injeção de Eval |
| CVSS v3.1 | 9.8 Crítica (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| Afetado | GeoServer < 2.25.2 / GeoTools < 31.2 (e ramificações anteriores) |
| CISA KEV | Sim (15 de julho de 2024) |
| Versões estudadas | Vulnerável 2.25.1, corrigida 2.25.2 |