一份完整且可复现的 CVE-2024-36401 研究,这是 GeoServer(最广泛使用的开源地理空间数据服务器)中的一个未认证远程代码执行漏洞。该漏洞是一个 eval 注入:通过 OGC 标准的参数,GeoServer 将攻击者控制的 属性名 传递给 GeoTools,而 GeoTools 中的 Apache Commons JXPath 将这些属性名作为 XPath 表达式求值,并且设计上可以通过反射调用任意 Java 方法。因此,一个未认证的请求(例如 exec(java.lang.Runtime.getRuntime(),'id'))即可在主机上执行命令。
本仓库包含技术报告、可用的漏洞利用/验证器,以及一个一键式 Docker 环境,该环境在有漏洞的实例上演示 RCE,并展示相同的漏洞利用在已修补的实例上失败。
教育项目。 为大学课程(数据隐私与安全,LUISS DASMA)而建。所有操作仅针对本地隔离容器——请参阅负责任的用途。
| 字段 | 值 |
|---|---|
| CVE (GeoServer) | CVE-2024-36401 |
| 根本原因 (GeoTools) | CVE-2024-36404 |
| 类型 | 未认证远程代码执行 |
| CWE | CWE-95,Eval 注入 |
| CVSS v3.1 | 9.8 危急(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 # 完整技术报告(请先阅读此文件)
│ ├── report.md # 报告源码(Pandoc/XeLaTeX)
│ └── images/ # 图片与截图
├── docker/
│ ├── vulnerable/Dockerfile # GeoServer 2.25.1(有漏洞)
│ └── patched/Dockerfile # GeoServer 2.25.2(已修补)
├── docker-compose.yml # 有漏洞实例在 :8080,已修补实例在 :8081
├── exploit/
│ ├── exploit.py # 漏洞利用 + 有漏洞/已修补验证器(仅依赖标准库)
│ ├── exploit.sh # 基于 curl 的 PoC(GET 和 POST 变体)
│ ├── payloads.md # 按 OGC 端点分类的 payload 目录
│ └── output/ # 捕获的证明日志与记录
└── run-reproduction.sh # 一键命令:构建 + 对两个实例进行漏洞利用 + 收集证明
要求:运行中的 Docker Desktop,python3,curl。
# 构建两个容器,分别对其运行漏洞利用,并收集证明
chmod +x run-reproduction.sh
./run-reproduction.sh
或按步骤执行:
docker compose up -d --build # 有漏洞实例在 :8080,已修补实例在 :8081
# 有漏洞实例(预期:VULNERABLE,约8秒延迟)
python3 exploit/exploit.py -t http://localhost:8080/geoserver --label vuln -o exploit/output
# 已修补实例(预期:PATCHED,立即拒绝)
python3 exploit/exploit.py -t http://localhost:8081/geoserver --label patched -o exploit/output
docker compose down # 完成后关闭
两个独立的探测使结果明确无误:
java.lang.Thread.sleep(8000) 会阻塞正在求值 XPath 的线程,因此 HTTP 响应会延迟约 8 秒——客户端可测量,无需访问容器。这与官方修复测试中使用的金丝雀相同。exec(java.lang.Runtime.getRuntime(),'touch /tmp/<marker>') 在容器内创建一个文件,可通过 docker exec 验证。在有漏洞的实例上,手动发送 payload 会返回关于 ProcessImpl 的 ClassCastException——JVM 执行了 Runtime.exec,但随后未能将生成的 Process 对象用作属性。该异常就是执行证明:

GeoTools 提交 e53e5170(包含在 GeoServer 2.25.2、2.24.4、2.23.6、2.22.6 中)对漏洞的两个部分应用了纵深防御:
JXPathUtils.newSafeContext(...) 辅助函数安装了一个空的 FunctionLibrary,因此 JXPath 无法再将 exec/Thread.sleep 解析为函数——字符串仍然是普通的属性名。FeaturePropertyAccessorFactory 现在也检查 SimpleFeatureType,因此简单要素无法再到达有漏洞的访问器。在已修补的实例上,相同的 payload 返回 No such attribute: ...,并且不执行任何操作。
完整细节——受影响的代码(含文件/行引用)、漏洞利用、修复差异以及并排复现——请参见 report/report.pdf。
此 CVE 已公开,已修补超过 18 个月,列入 CISA 已知被利用漏洞目录,并且有公开的 PoC(Vulhub、Nuclei、Metasploit)。此处的代码仅针对 localhost 和本仓库中的隔离研究容器。请勿将其用于您不拥有或未经明确授权测试的系统。
MIT © 2026 Daniele Giovanardi
Daniele Giovanardi — 数据科学与管理学(DASMA),LUISS Guido Carli 大学。 课程作业:《数据隐私与安全》。