CVE-2022-22963
漏洞成因
Spring Cloud Function 是Spring cloud中的serverless框架。SimpleEvaluationContext进行SPEL解析,当spring.cloud.function.definition=functionRouter配置开启
时,会触发RoutingFunction
逻辑,在Spring Cloud Function 中的RoutingFunction类的 apply方法
将请求头中的spring.cloud.function.routing-expression
参数作为SpELl 表达式
进行处理,造成SpEL表达式注入漏洞。攻击者可通过该漏洞执行任意代码。
functionRouter
:
如果设置为functionRouter
则默认路由绑定的具体函数交由用户进行控制,在 Spring Cloud Function Web里面,可以通过设置http头
的方式来控制,使用spring.cloud.function.definition 和spring.cloud.function.routing-expression
都可以,区别是后者允许使用SpEL。
影响版本
漏洞组件:
org.springframework.cloud:spring-cloud-function-context
漏洞版本:
3.0.0.RELEASE~3.2.2)
代码分析
SpringCloud Function之所以能自动将函数建立http端点,是因为在包mvc.FunctionController中使用/** 监听了get/post类型的所有端点:
/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/mvc/FunctionController.java
当一个请求进入时,程序首先基于Springboot的自动配置,将配置文件注入到functionProperties
,随后将以WebRequestConstants.handler
为key,function为值添加到request数组里面:
/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/mvc/FunctionHandlerMapping.java
请求正式进入Controller节点,Controller首先会将请求使用wrapper进行包装,wrapper就是将request转成
FunctionInvocationWrapper
格式:
/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/mvc/FunctionController.java
随后进入
processRequest
对request进行处理,执行function的apply方法,跳转到doApply()时会对function进行判断,判断是不是functionRouter方法,根据配置文件此时的function为RoutingFunction.FUNCTION_NAME
==functionRouter
所以会,一路跳转到RoutingFunction.route
:
/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/RoutingFunction.java
/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/RoutingFunction.java
随后进入else if 分支, http头spring.cloud.function.routing-expression
不为空,则传入其值到functionFromExpression方法。
/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/RoutingFunction.java
使用标准的
StandardEvaluationContext
对header的值进行SpEL表达式解析
漏洞复现
参考链接:
https://mp.weixin.qq.com/s/onYJWIESgLaWS64lCgsKdw
https://www.cnblogs.com/9eek/p/16113603.html