SpringCloudFunction漏洞分析

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

在commit记录中找到

分析

在本次修复的时候,增加了SimpleEvaluationContext

这样就有了两个EvaluationContext,分别创建了两个对象

一个是StandardEvaluationContext,``evalContext 一个是SimpleEvaluationContext headerEvalContext`


接下来往下走,由isViaHeader变量作为flag,这时候,如果是从HTTP头取到了spring.cloud.function.routing-expression字段,就会设置一个true,这个true,就是接下来的isViaHeader属性

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

复现

测试版本:

1
2
# v3.2.0
https://github.com/spring-cloud/spring-cloud-function/releases/tag/v3.2.0

下载下来以后,将spring-cloud-function-samples/function-sample-pojo路径作为项目

方式一(修改配置+任意路由)

  1. 修改配置文件,添加 如下内容

    1
    spring.cloud.function.definition:functionRouter

  2. 添加任意路由,构造payload即可

    image-20220329093212235

    1
    spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("calc.exe")

方法二(默认配置+特殊路由)

  1. 默认配置

  2. 特定的路由:/functionRouter

  3. 此刻,任意路由失效,必须在特定路由下才能加载