Spring Cloud Function现SPEL 表达式漏洞,SPEL 表达式到底是个啥?

简介: 近日,Spring Cloud Function 官方测试用例曝光了 Spring Cloud Function SPEL 表达式注入漏洞,可利用该漏洞通过注入SPEL 表达式来触发远程命令执行。

哈喽,大家好,我是强哥。


Spring Cloud Function现SPEL漏洞


近日,Spring Cloud Function 官方测试用例曝光了 Spring Cloud Function SPEL 表达式注入漏洞,可利用该漏洞通过注入SPEL 表达式来触发远程命令执行。


“由于Spring Cloud Function中RoutingFunction类的apply方法将请求头中的“spring.cloud.function.routing-expression”参数作为Spel表达式进行处理,造成了Spel表达式注入漏洞,攻击者可利用该漏洞远程执行任意代码。”


漏洞影响范围


3.0.0.M3 <= Spring Cloud Function <=3.2.2


什么是SPEL


Spring表达式语言(简称SpEl)是一个支持查询和操作运行时对象导航图功能的强大的表达式语言. 它的语法类似于传统EL,但提供额外的功能,最出色的就是函数调用和简单字符串的模板函数。尽管有其他可选的 Java 表达式语言,如 OGNL, MVEL,JBoss EL 等等,但 Spel 创建的初衷是了给 Spring 社区提供一种简单而高效的表达式语言,一种可贯穿整个 Spring 产品组的语言。这种语言的特性应基于 Spring 产品的需求而设计。


SPEL 漏洞


该漏洞的漏洞形态类似于命令注入,因此之前该漏洞归为命令注入类。看一下最简单的漏洞样例。


简单地说,就是我们可以通过请求参数设置命令来实现让目标主机执行我们传入的命令。


我们写一个可执行Spel的Controller


@RestController
public class SpelController {
    @RequestMapping("/spel")
    @ResponseBody
    public String spel(String input){
        SpelExpressionParser parser = new SpelExpressionParser();
        Expression expression = parser.parseExpression(input);
        return Objects.requireNonNull(expression.getValue()).toString();
    }
}


上面的代码是直接获取到用户输入的参数,然后直接通过Spel表达式解析器解析执行。

然后,我们在浏览器中,输入如下地址:


http://127.0.0.1:8082/spel?input=new java.lang.ProcessBuilder("/System/Applications/Calculator.app/Contents/MacOS/Calculator").start()


我们可以看到,input参数的内容就是编写Java代码创建ProcessBuilder类来生成本地进程。当我们的Controller获取到输入直接解析这份代码后,相当于执行了如下代码:


public static void main(String[] args) throws IOException {
        new java.lang.ProcessBuilder("/System/Applications/Calculator.app/Contents/MacOS/Calculator").start();
    }


所以,我们在浏览器发起请求后,我们的机子就把计算器调用起来了


12.png


当然也可以采用T() 调用一个类的静态方法,它将返回一个 Class Object,然后再调用相应的方法或属性,也是可以实现相同的功能。


http://127.0.0.1:8082/spel?input=T(java.lang.Runtime).getRuntime().exec(%22open%20%2FSystem%2FApplications%2FCalculator.app%22)


本次漏洞原因


漏洞是出在SpringCloud Function的RoutingFunction功能上,其功能的目的本身就是为了微服务应运而生的,可以直接通过HTTP请求与单个的函数进行交互,同时为spring.cloud.function.definition参数提供你要调用的函数的名称。


就是在请求的headers头上添加一个spring.cloud.function.routing-expression参数,SpringCloud Function会直接将其参数内容直接带入到SPEL中查询,造成SPEL漏洞注入。


修复方式


目前Spring Cloud Function官方已发布此漏洞的补丁,但尚未正式发布修复版本,建议相关用户尽快应用补丁进行防护并关注官方的更新版本。


补丁下载链接:


https://github.com/spring-cloud/spring-cloud-function/commit/0e89ee27b2e76138c16bcba6f4bca906c4f3744f


下载链接:


https://github.com/spring-cloud/spring-cloud-function/tags


11.png


强哥有话说


Spel表达式注入漏洞有一定的特殊性,正常在编写项目的过程中很难会使用到该功能,但它存在于大的框架项目中,因此一旦被挖掘出来其危害是很大的,除了spel还有很多类似的框架级表达式注入漏洞,就如之前的Log4j就是由JNDI导致的。


就在今天,Spring框架也曝出RCE 0day漏洞。已经证实由于 SerializationUtils#deserialize 基于 Java 的序列化机制,可导致远程代码执行 (RCE),使用JDK9及以上版本皆有可能受到影响。相关监测发现该漏洞可能已被远程攻击者利用,广东省网络安全应急响应中心连夜发布预警通知,考虑到Spring框架的广泛应用,FreeBuf对漏洞评级为:危险。


安全无小事。我们在日常的开发过程中,也要多注意在使用表达式注入,sql注入等问题。同时,多学习相关的安全知识,提升自己。

相关文章
|
4月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
Spring Cloud Alibaba 发布了 Scheduling 任务调度模块 [#3732]提供了一套开源、轻量级、高可用的定时任务解决方案,帮助您快速开发微服务体系下的分布式定时任务。
14867 27
|
4月前
|
负载均衡 Java Spring
Spring cloud gateway 如何在路由时进行负载均衡
Spring cloud gateway 如何在路由时进行负载均衡
471 15
|
4月前
|
Java Spring
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
104 3
|
4月前
|
消息中间件 Java Nacos
通用快照方案问题之通过Spring Cloud实现配置的自动更新如何解决
通用快照方案问题之通过Spring Cloud实现配置的自动更新如何解决
74 0
|
4月前
|
缓存 监控 Java
通用快照方案问题之Spring Boot Admin的定义如何解决
通用快照方案问题之Spring Boot Admin的定义如何解决
61 0
|
4月前
|
监控 NoSQL Java
通用快照方案问题之Martin Flower提出的微服务之间的通信如何解决
通用快照方案问题之Martin Flower提出的微服务之间的通信如何解决
41 0
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
24天前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
125 2
|
3月前
|
缓存 Java Maven
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决

热门文章

最新文章