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注入等问题。同时,多学习相关的安全知识,提升自己。

相关文章
|
22天前
|
负载均衡 Java Spring
Spring cloud gateway 如何在路由时进行负载均衡
Spring cloud gateway 如何在路由时进行负载均衡
140 15
|
28天前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
Spring Cloud Alibaba 发布了 Scheduling 任务调度模块 [#3732]提供了一套开源、轻量级、高可用的定时任务解决方案,帮助您快速开发微服务体系下的分布式定时任务。
14204 19
|
21天前
|
Java Spring
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
40 3
|
26天前
|
消息中间件 Java Nacos
通用快照方案问题之通过Spring Cloud实现配置的自动更新如何解决
通用快照方案问题之通过Spring Cloud实现配置的自动更新如何解决
48 0
|
26天前
|
缓存 监控 Java
通用快照方案问题之Spring Boot Admin的定义如何解决
通用快照方案问题之Spring Boot Admin的定义如何解决
34 0
|
26天前
|
监控 NoSQL Java
通用快照方案问题之Martin Flower提出的微服务之间的通信如何解决
通用快照方案问题之Martin Flower提出的微服务之间的通信如何解决
31 0
|
2月前
|
人工智能 Java Spring
使用 Spring Cloud Alibaba AI 构建 RAG 应用
本文介绍了RAG(Retrieval Augmented Generation)技术,它结合了检索和生成模型以提供更准确的AI响应。示例中,数据集(包含啤酒信息)被加载到Redis矢量数据库,Spring Cloud Alibaba AI Starter用于构建一个Spring项目,演示如何在接收到用户查询时检索相关文档并生成回答。代码示例展示了数据加载到Redis以及RAG应用的工作流程,用户可以通过Web API接口进行交互。
52438 66
|
2月前
|
消息中间件 Java 持续交付
Spring Cloud Alibaba 项目搭建步骤和注意事项
Spring Cloud Alibaba 项目搭建步骤和注意事项
412 0
Spring Cloud Alibaba 项目搭建步骤和注意事项
|
2月前
|
存储 SpringCloudAlibaba 关系型数据库
springcloud alibaba(5)
springcloud alibaba
111 0