GeoServer CVE-2024-36401分析

Contents

复现

GeoServer:一个用java开发的地图服务器,将地图数据发布为地图服务,实现地图数据在用户之间的共享,并且提供了一些皆空允许用户对地理空间数据进行插入、更新、删除等操作

官方给了很多的触发位置

image-20240705140457300

漏洞组件对应版本如下

image-20240705140707084

这边复现分析一下

根据官方的描述,将属性解析为xpath,由于没有过滤导致任意代码执行,简单看一下commit,使用newSafeContext进行过滤

image-20240705160038885

从官方提供的几个接口类看一下,GetPropertyValue入手看一下(最短,偷懒 :P

源码搞下来结合官方文档看一下,他是通过给的参数来制定使用那个模块

image-20240716145039387

对应到run方法

首先检查参数中的valueReference是否存在或为空,则抛出错误,检查后向下,else中内容构造了一个getFeature,这边主要针对两个参数进行审计:valueReference、typeNames,后部分处理进去跟了一圈没有联系到commit的点

image-20240716145141729

继续向下,顾名思义是对valueReference参数的处理部分,前面两句取值没有涉及到xpath处理,跟进evaluate方法

image-20240716165624995

evaluate方法首先尝试调用类中lastAccessor,这边推断是上一次调用留存的可处理的accessor然后尝试进行判断,如果lastAccessor存在就对accessor调用get方法,这便联系到了commit中的FeaturePropertyAccessorFactory#get方法

image-20240716170024069

但第一次调用一版lastAccess都为空,所以往下看下面的处理逻辑,success为false进入if,首先创建了一个Hint(无关痛痒),继续向下,调用PropertyAccessorFactory#findPropertyAccessors方法,尝试去找到可以适配我们传入attPath(valueReference属性),跟进看一下

image-20240716170618805

遍历FACTORY_CACHE属性中的accessor factory,同样调用canHandle来检查,满足条件就插入到上面提到的accessors中

image-20240716170922330

这边调试了一下,输入valueReference为the_geom(官方例子),发现两个accessor满足条件,其中就包括commit中的FearturePropertyAccessorFactory,这样如果通过SimpleFearturePropertyAccessorFactory成功通过get获取到value,那么就会跳出循环进而不会触发执行(

image-20240716171317681

先来看一下如何通过FeaturePropertyAccessorFactory#get执行代码

进入FearturePropertyAccessorFactory#get方法,这边定义了JXPathContext,并调用iteratePointers来处理valueReference参数

image-20240716190451548

跟进iteratePointers,很熟悉,联系到了之前分析过的common-jxpath cve-2022-41852,这也是为什么说这个洞是xpath解析rce,这属于jxpath给的一个feature,所以构造valueReference通过调用链传到这个位置执行即可

image-20240717110001409

问题回到刚才的分析位置,如何确保只被FearturePropertyAccessorFactory处理,其实测试时多此一举了,问题出在SimpleFearturePropertyAccessorFactory#canHandle方法,这个indexOf会从本地属性中检索匹配我们传入的valueReference,根据官方给的the_geom匹配到了所以这个类被存到了list中

image-20240717111225492 image-20240717111450094

因此只要valueReference为表达式即可直接触发命令执行(纯没事给自己找事

image-20240717111631562

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

0%