【墨菲安全实验室】Spring Cloud Gateway代码注入漏洞分析

简介: 【墨菲安全实验室】Spring Cloud Gateway代码注入漏洞分析

漏洞简述


VMware发布了针对Spring Cloud Gateway的漏洞通告,当actuator端点开启并对外暴露时,攻击者可以构造恶意请求实现远程任意代码执行。


Spring Cloud Gateway是Spring Cloud 生态中的API网关,包含限流、过滤等API治理功能。Actuator是Spring Boot生态中的应用监控组件,提供了通过http访问监控运行状态的能力。


当actuator端点开启时,可以通过http请求修改路由,路由中包含的filter参数会经过SPEL表达式解析,从而导致了漏洞发生。


漏洞评级为严重,受影响组件版本范围为:


3.1.0

3.0.0-3.0.6

以及其他更老的版本

用户需要尽快升级到3.1.1或3.0.7及以上版本,同时建议不要对公网开放actuator访问。


漏洞时间线


1、漏洞发现者在向VMware提交了漏洞报告

2、开发者多次提交代码进行漏洞修复

3、开发者发布新版本


缺陷分析


通过https://github.com/spring-cloud/spring-cloud-gateway项目中的commit信息可以发现漏洞和SPEL、ShortcutConfigurable有关,开发者同时提交了相关的测试用例。

image.png

通过对源码分析,可以看到ShortcutConfigurable.getValue()方法取值时使用了StandardEvaluationContext进行表达式解析。

1.png

下方的shortcutType().normalize()则在对value进行归一化的时候调用了getValue()

1.png

可以发现GatewayFilterFactory继承了ShortcutConfigurableRewritePathGatewayFilterFactory等过滤器类实现了GatewayFilterFactory


根据官方文档,开启acutator后可以通过访问/actuator/gateway/routes列出路由,路由中包含filter,如:

1.png

同时可以通过/gateway/routes/{id_route_to_create}创建路由。

然后通过/actuator/gateway/refresh刷新路由,重新加载配置使得路由生效。

因此攻击者可以添加带有filter的恶意路由,当重新加载路由时,会触发对参数的归一化逻辑,从而导致filter参数value中的SPEL表达式被解析。

image.png

漏洞发现者在博客中描述了自己的漏洞发现过程,还分析了为什么在CodeQL中存在SPEL注入的规则,却没能发现这个问题,以及其他的一些问题,值得学习,感兴趣的同学可以阅读,在此不过多展开。


漏洞检测及修复


关于该漏洞的检测策略已在墨菲安全的所有工具产品中上线,您可以安装使用墨菲安全的JetBrains IDE插件、CLI客户端等对你的项目进行检测,并一键修复。


JetBrains IDE 代码安全检测插件: 使用文档

通用漏洞检测客户端(已开源): https://github.com/murphysec/murphysec

使用我的邀请码注册获取token:https://www.murphysec.com/j?p=mycsdn

如果你觉得这个工具对你有用,可以star我们的开源项目或者提issues,谢谢啦!


参考链接

https://tanzu.vmware.com/security/cve-2022-22947

https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-how-it-works

https://wya.pl/2022/02/26/cve-2022-22947-spel-casting-and-evil-beans/

相关文章
|
6天前
|
XML Java 程序员
Spring6框架中依赖注入的多种方式(推荐构造器注入)
依赖注入(DI)是一种过程,对象通过构造函数参数、工厂方法的参数或在对象实例构建后设置的属性来定义它们的依赖关系(即与其一起工作的其他对象)。
18 3
|
5天前
|
负载均衡 容灾 UED
SpringCloud-Eureka原理分析
SpringCloud-Eureka原理分析
|
5天前
|
负载均衡 算法 Java
【SpringCloud】Eureka原理分析、搭建Eureka服务、服务注册、服务发现
【SpringCloud】Eureka原理分析、搭建Eureka服务、服务注册、服务发现
20 3
|
8天前
|
Java Spring 容器
Spring AOP 代码案例
Spring AOP 代码案例
20 1
|
9天前
|
缓存 Java Apache
Spring一行代码搞定图片url地址转换为Base64,超简单!!!!
这段内容讲述了如何将URL指向的图片转换为Base64字符串。首先通过`org.apache.commons.io.IOUtils`或Java标准库读取URL的字节流,然后用Java 8的`Base64`类编码。示例代码提供了两种实现方式:一种依赖Apache Commons IO,另一种仅使用Java内置类。在第二种方式中,自定义了`toByteArray()`方法处理输入流并转换为字节数组,最后关闭输入流释放资源。
|
15天前
|
前端开发 Java 编译器
详解Spring与JDK注入
依赖注入是Spring框架的核心概念之一,它通过将对象之间的依赖关系外部化,实现了松耦合和可测试性。面向切面编程则允许开发人员将横切关注点(如日志、事务管理)从应用程序的主要业务逻辑中分离出来,以提高代码的模块化和可维护性。
21 4
|
15天前
|
消息中间件 Java 数据安全/隐私保护
Spring Cloud 项目中实现推送消息到 RabbitMQ 消息中间件
Spring Cloud 项目中实现推送消息到 RabbitMQ 消息中间件
|
15天前
|
负载均衡 监控 Java
我把Spring Cloud的超详细资料介绍给你,面试官不会生气吧?geigei
我把Spring Cloud的超详细资料介绍给你,面试官不会生气吧?geigei
|
16天前
|
负载均衡 Java 应用服务中间件
Spring Cloud 负载平衡的意义什么?
负载平衡是指将网络流量在多个服务器之间分布,以达到提高系统性能、增强可靠性和提供更好用户体验的目的。在负载平衡的架构中,多个服务器被组织成一个集群,共同处理用户的请求。
49 4
|
17天前
|
监控 安全 Java
Spring cloud原理详解
Spring cloud原理详解
28 0