Spring Cloud GateWay 远程代码执行漏洞(CVE-2022-22947)

Artio 于 2022-03-31 发布

一:漏洞简介

Spring Cloud Gateway存在远程代码执行漏洞,该漏洞是发生在Spring Cloud Gateway应用程序的Actuator端点,其在启用、公开和不安全的情况下容易受到代码注入的攻击。攻击者可利用该漏洞通过恶意创建允许在远程主机上执行任意远程请求。

二:影响版本

Spring Cloud GateWay 3.1.0

Spring Cloud GateWay >=3.0.0,<=3.0.6

Spring Cloud GateWay <3.0.0

三:漏洞复现

使用P牛的vulhub环境进行复现(https://github.com/vulhub/vulhub/tree/master/spring/CVE-2022-22947)

先POST请求创建route和filter

CVE-2022-22947_10.png

然后POST请求/refresh,使新建的uri和filter生效

CVE-2022-22947_11.png

然后GET请求/actuator/gateway/routes/test,触发spel,并得到回显

CVE-2022-22947_12.png

四:漏洞分析

  1. 首先我们去找到spring-cloud-gateway的commit记录,看看修改了哪些地方:https://github.com/spring-cloud/spring-cloud-gateway/commit/337cef276bfd8c59fb421bfe7377a9e19c68fe1e

  2. 我们可以看到commit中改动了org.springframework.cloud.gateway.support.ShortcutConfigurable#getValue方法(我们知道spel表达式执行会经常使用该方法)中用GatewayEvaluationContext替换了StandardEvaluationContext来执行spel表达式。

  3. CVE-2022-22947_1.png

  4. 所以盲猜一波是spel表达式的rce

  5. 然后我们搜索getValue方法的调用位置如下:

  6. CVE-2022-22947_2.png

  7. 我们点进去发现三个调用都位于org.springframework.cloud.gateway.support.ShortcutConfigurable内的枚举类ShortcutType中,并且都重写了normalize方法

  8. CVE-2022-22947_3.png

  9. CVE-2022-22947_4.png

  10. CVE-2022-22947_5.png

  11. 然后我们继续向上查找normalize方法都被谁调用

  12. CVE-2022-22947_6.png

  13. 我们发现最终都来到org.springframework.cloud.gateway.support.ConfigurationService.ConfigurableBuilder#normalizeProperties方法中,我们看一下normalizeProperties方法:

  14. CVE-2022-22947_7.png

  15. 可以看到normalizeProperties方法中传入的是该类(ConfigurableBuilder)的properties变量,并且只有在该类的父类(AbstractBuilder)中的bind方法中才调用了normalizeProperties方法

  16. CVE-2022-22947_8.png

  17. 然后我们继续向上查看哪些调用了bind方法

  18. CVE-2022-22947_9.png

  19. 我们逐一排查后发现org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#loadGatewayFilters方法中既调用了bind方法,还调用了properties方法,跟进properties方法发现该方法就是我们上边说到的org.springframework.cloud.gateway.support.ConfigurationService.ConfigurableBuilder#normalizeProperties方法中刚好需要的properties成员变量,由此我们可以猜到该漏洞的触发条件可能来自于gatewayFilter的添加,并且从loadGatewayFilters方法继续向上的调用链如下:

  20. org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#loadGatewayFilters
    org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#getFilters
    org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#convertToRoute
    org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#getRoutes
    
  21. 所以最后就是在添加filter时输入了spel表达式,被当作properties进行解析,最终导致恶意表达式被执行,从而实现rce。

个人Github地址:https://github.com/Artio-Li/

五:参考链接

https://y4er.com/post/cve-2022-22947-springcloud-gateway-spel-rce-echo-response/

https://www.cnblogs.com/bitterz/p/15964852.html

https://github.com/spring-cloud/spring-cloud-gateway/commit/337cef276bfd8c59fb421bfe7377a9e19c68fe1e