GeoServer CVE-2024-36401分析
复现
GeoServer:一个用java开发的地图服务器,将地图数据发布为地图服务,实现地图数据在用户之间的共享,并且提供了一些皆空允许用户对地理空间数据进行插入、更新、删除等操作
官方给了很多的触发位置
漏洞组件对应版本如下
这边复现分析一下
根据官方的描述,将属性解析为xpath,由于没有过滤导致任意代码执行,简单看一下commit,使用newSafeContext进行过滤
从官方提供的几个接口类看一下,GetPropertyValue入手看一下(最短,偷懒 :P
源码搞下来结合官方文档看一下,他是通过给的参数来制定使用那个模块
对应到run方法
首先检查参数中的valueReference是否存在或为空,则抛出错误,检查后向下,else中内容构造了一个getFeature,这边主要针对两个参数进行审计:valueReference、typeNames,后部分处理进去跟了一圈没有联系到commit的点
继续向下,顾名思义是对valueReference参数的处理部分,前面两句取值没有涉及到xpath处理,跟进evaluate方法
evaluate方法首先尝试调用类中lastAccessor,这边推断是上一次调用留存的可处理的accessor然后尝试进行判断,如果lastAccessor存在就对accessor调用get方法,这便联系到了commit中的FeaturePropertyAccessorFactory#get方法
但第一次调用一版lastAccess都为空,所以往下看下面的处理逻辑,success为false进入if,首先创建了一个Hint(无关痛痒),继续向下,调用PropertyAccessorFactory#findPropertyAccessors方法,尝试去找到可以适配我们传入attPath(valueReference属性),跟进看一下
遍历FACTORY_CACHE属性中的accessor factory,同样调用canHandle来检查,满足条件就插入到上面提到的accessors中
这边调试了一下,输入valueReference为the_geom(官方例子),发现两个accessor满足条件,其中就包括commit中的FearturePropertyAccessorFactory,这样如果通过SimpleFearturePropertyAccessorFactory成功通过get获取到value,那么就会跳出循环进而不会触发执行(
先来看一下如何通过FeaturePropertyAccessorFactory#get执行代码
进入FearturePropertyAccessorFactory#get方法,这边定义了JXPathContext,并调用iteratePointers来处理valueReference参数
跟进iteratePointers,很熟悉,联系到了之前分析过的common-jxpath cve-2022-41852,这也是为什么说这个洞是xpath解析rce,这属于jxpath给的一个feature,所以构造valueReference通过调用链传到这个位置执行即可
问题回到刚才的分析位置,如何确保只被FearturePropertyAccessorFactory处理,其实测试时多此一举了,问题出在SimpleFearturePropertyAccessorFactory#canHandle方法,这个indexOf会从本地属性中检索匹配我们传入的valueReference,根据官方给的the_geom匹配到了所以这个类被存到了list中
因此只要valueReference为表达式即可直接触发命令执行(纯没事给自己找事
Reference
https://github.com/geotools/geotools/pull/4797/commits/e53e5170ba71521728875a436c80616cfb03c1e8
WFS reference — GeoServer 2.26.x User Manual
https://github.com/geoserver/geoserver/security/advisories/GHSA-6jj6-gm7p-fcvv
https://github.com/geotools/geotools/security/advisories/GHSA-w3pj-wh35-fq8w