漏洞简介
向/functionRouter
路由发送headers带有spring.cloud.function.routing-expression
键的POST包时,会触发SPEL解析该键值
影响范围
3.0.0 <= Spring Cloud Function <= 3.2.2
漏洞复现
官方已提供参考PoC
新建Spring Cloud Function项目
修改pom为受影响版本
启动默认Application即可,然后向/functionRouter路由发送恶意包即可
代码审计
从POST请求传入开始,在org.springframework.cloud.function.web.mvc.FunctionController
Content-Type是x-www-form-urlencoded,因此在form方法设置断点
进入processRequest处理请求
processRequest方法获取了post请求的headers和正文,整合成Message对象传入doApply方法
判断请求如果是RoutingFunction则调用RoutingFunction.apply方法
最后来到RoutingFunction.route方法,默认function是null,获取headersspring.cloud.function.routing-expression
的值,传入functionFromExpression方法
首先获取了SPEL表达式,也就是headersspring.cloud.function.routing-expression
的值,然后传入getValue方法
然后抽象语法树ast解析SPEL表达式
最后在ReflectiveMethodExecutor.class调用反射完成RCE
POP链
补丁修复分析
漏洞在于未对headers的内容进行检测,完全信任headers
在V3.2.3中:functionFromExpress内部调用getValve方法解析SPEL时,使用的是headerEvalContext而不是evalContext
新增加的SimpleEvaluationContext
SimpleEvaluationContext类相比StandardEvaluationContext类,确保了仅提供安全的操作
自动检测脚本
https://github.com/chaosec2021/Spring-cloud-function-SpEL-RCE
参考
https://tanzu.vmware.com/security/cve-2022-22963
https://github.com/spring-cloud/spring-cloud-function/compare/v3.2.2…v3.2.3#diff-01d5affef57305a3034bfb48185f34ae3d21f15e7f389851ac67035f7bd0dc7a
https://github.com/spring-cloud/spring-cloud-function/commit/0e89ee27b2e76138c16bcba6f4bca906c4f3744f
完
欢迎关注我的CSDN博客 :@Ho1aAs
版权属于:Ho1aAs
本文链接:https://ho1aas.blog.csdn.net/article/details/126037840
版权声明:本文为原创,转载时须注明出处及本声明