仓库地址
- Spring Cloud Function是SpringBoot开发的一个Servless中间件(FAAS),支持基于SpEL的函数式动态路由。
- https://github.com/spring-cloud/spring-cloud-function
修复Patch地址
- 修复patch地址:https://github.com/spring-cloud/spring-cloud-function/commit/dc5128b80c6c04232a081458f637c81a64fa9b52
- 修复后漏洞代码地址:https://github.com/spring-cloud/spring-cloud-function/blob/dc5128b80c6c04232a081458f637c81a64fa9b52/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/RoutingFunction.java
漏洞代码分析
- 搜索import org.springframework.expression.Expression // 大致定位
- import org.springframework.expression.spel.support.StandardEvaluationContext // 大致定位
- 搜索expression.getValue,得到2个答案,其中一个是RoutingFunction,动态路由。
- 相关值来自functionProperties.getRoutingExpression,意味着
- spring.cloud.function.routing-expression这个header支持Spel语言语法。
官方修复方案
- 添加一个isViaHeader
- 为true时:headerEvalContext = SimpleEvaluationContext
- 为false时:evalContext = new StandardEvaluationContext
拓展思考
- 是不是所有StandardEvaluationContext,都是潜在受攻击面?如果能远程控制妥妥的RCE。保守起见应该换成安全的Spel,SimpleEvaluationContext。