SpringCloudFunction漏洞分析

前言

SpringCloudFunction是SpringBoot开发的一个Servless中间件(FAAS),支持基于SpEL的函数式动态路由。在特定配置下,3 <= 版本 <= 3.2.2( commit dc5128b 之前)存在SpEL表达式执行导致的RCE。

补丁分析

在 main 分支commit dc5128b(https://github.com/spring-cloud/spring-cloud-function/commit/dc5128b80c6c04232a081458f637c81a64fa9b52)中,新增了 SimpleEvaluationContext :

图片

由 isViaHeader 变量作为flag,在解析前判断 spring.cloud.function.routing-expression 的值是不是取自 HTTP头,如果是的话就用 SimpleEvaluationContext 解析SpEL语句,不是来自外部输入时(比如System.setProperty )才用StandardEvaluationContext 解析。

图片

同样的,官方测试用例已经清楚地写明了漏洞位置与Payload:

图片

提取出测试类后在apply方法下断并跟入,省略一些中间流程,最终可以看到从HTTP头spring.cloud.function.routing-expression 中取出SpEL表达式并由 StandardEvaluationContext 解析:

图片

至此source与sink已经清晰,虽然测试用例可以模拟触发漏洞,但还是要搭出一套能实际复现的环境。刚开始 时想不开,自己在那啃文档碎碎写了一两个小时demo硬是搭不起来,后来发现官方提供的sample(https://github.com/spring-cloud/spring-cloud-function/tree/main/spring-cloud-function-samples/function-sample-pojo)就很好用 Orz:

图片

后话

好消息是只有Spring Cloud Function部分版本特定配置的动态路由才会受影响(spring.cloud.function.definition=functionRouter),坏消息是SpEL表达式存在charset、replace等多种变形。

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值