
# CVE-2024-36401 재현 연구: GeoServer의 JXPath eval 주입을 통한 인증 없는 RCE JXPath eval 주입을 통한 GeoServer의 인증 없는 RCE(CVE-2024-36401)에 대한 재현 가능한 연구입니다. 기술 보고서, 동작하는 익스플로잇/검증 도구, 그리고 취약한 인스턴스와 패치된 인스턴스에서 해당 결함을 시연하는 Docker 환경이 포함되어 있습니다.
CVE-2024-36401에 대한 완전하고 재현 가능한 연구 자료입니다. 이 취약점은 지리공간 데이터를 위한 가장 널리 배포된 오픈소스 서버인 GeoServer의 인증되지 않은 원격 코드 실행 결함입니다. 이 버그는 eval 인젝션입니다. OGC 표준의 파라미터를 통해 GeoServer는 공격자가 제어하는 *속성 이름(property name)*을 GeoTools에 전달하며, GeoTools에서는 Apache Commons JXPath가 이를 XPath 표현식으로 평가하여 설계상 리플렉션을 통해 임의의 Java 메서드를 호출할 수 있습니다. 따라서 exec(java.lang.Runtime.getRuntime(),'id')와 같은 인증되지 않은 요청이 호스트에서 명령을 실행하게 됩니다.
이 저장소는 기술 보고서, 동작하는 익스플로잇/검증기, 그리고 취약한 인스턴스에서 RCE를 시연하고 패치된 인스턴스에서는 동일한 익스플로잇이 실패하는 모습을 보여주는 원커맨드 Docker 환경을 포함합니다.
교육용 프로젝트. 대학 강의(Data Privacy and Security, LUISS DASMA)를 위해 제작되었습니다. 모든 것은 로컬의 격리된 컨테이너에서만 실행됩니다 — 책임 있는 사용을 참조하세요.
| 필드 | 값 |
|---|---|
| CVE (GeoServer) | CVE-2024-36401 |
| 근본 원인 (GeoTools) | CVE-2024-36404 |
| 유형 | 인증되지 않은 원격 코드 실행 |
| 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) |
| 영향받는 버전 | GeoServer < 2.25.2 / GeoTools < 31.2 (및 이전 브랜치) |
| CISA KEV | 예 (2024년 7월 15일) |
| 연구 대상 버전 | 취약한 2.25.1, 패치된 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
요구 사항: Docker Desktop이 실행 중이고, python3와 curl이 필요합니다.
# Build both containers, run the exploit against each, and collect the proofs
chmod +x run-reproduction.sh
./run-reproduction.sh
또는 단계별로:
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
두 개의 독립적인 탐지 방식을 통해 결과를 명확하게 확인할 수 있습니다:
java.lang.Thread.sleep(8000)이 XPath를 평가하는 스레드를 차단하여 HTTP 응답이 약 8초 지연됩니다 — 컨테이너 접근 없이 클라이언트에서 측정할 수 있습니다. 이는 공식 수정 테스트에서 사용하는 것과 동일한 카나리아입니다.exec(java.lang.Runtime.getRuntime(),'touch /tmp/<marker>')가 컨테이너 내부에 파일을 생성하며, docker exec로 확인할 수 있습니다.취약한 인스턴스에 페이로드를 직접 보내면 ProcessImpl에서 ClassCastException이 반환됩니다 — JVM이 Runtime.exec를 실행한 후 결과 Process 객체를 속성으로 사용하지 못한 것입니다. 이 예외가 바로 실행 증거입니다:

GeoTools 커밋 e53e5170 (GeoServer 2.25.2, 2.24.4, 2.23.6, 2.22.6에 포함)은 버그의 양쪽 측면에 *심층 방어(defence in depth)*를 적용합니다:
JXPathUtils.newSafeContext(...) 헬퍼가 빈 FunctionLibrary를 설치하므로 JXPath는 더 이상 exec/Thread.sleep을 함수로 해석할 수 없습니다 — 문자열은 단순한 속성 이름으로 유지됩니다.FeaturePropertyAccessorFactory가 이제 SimpleFeatureType도 확인하므로 단순 피처(simple feature)는 더 이상 취약한 접근자에 도달하지 않습니다.패치된 인스턴스에서는 동일한 페이로드가 No such attribute: ...를 반환하며 아무것도 실행되지 않습니다.
전체 세부 사항 — 파일/라인 참조가 포함된 영향받는 코드, 익스플로잇, 완화 패치 diff, 그리고 나란히 비교한 재현 결과 — 은 **report/report.pdf**에 있습니다.
이 CVE는 공개되어 있으며, 18개월 이상 전에 패치되었고, CISA KEV(공개적으로 악용된 취약점) 목록에 포함되어 있으며, 공개 PoC(Vulhub, Nuclei, Metasploit)가 존재합니다. 여기의 코드는 **오직 localhost**와 이 저장소의 격리된 연구용 컨테이너만을 대상으로 합니다. 소유하지 않았거나 명시적으로 테스트 권한을 받지 않은 시스템에는 사용하지 마십시오.
MIT © 2026 Daniele Giovanardi
Daniele Giovanardi — LUISS Guido Carli, Data Science and Management(DASMA) 전공. Data Privacy and Security 강의 과제.