ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Spring Cloud Function SpEL表达式命令注入(CVE-2022-22963)漏洞复现及分析

2022-04-13 01:00:38  阅读:234  来源: 互联网

标签:Function function Spring 22963 SpEL https spring com cloud


漏洞概述

SpringCloud 是一套分布式系统的解决方案,常见的还有阿里巴巴的Dubbo,Fass(Function As A Service )的底层实现就是函数式编程,在视频转码、音视频转换、数据仓库ETL等与状态相关度低的领域运用的比较多。开发者无需关注服务器环境运维等问题上,专注于自身业务逻辑实现即可。

SpringCloud Function 就是Spring提供的分布式函数式编程组件。

漏洞复现

使用了github上已有的环境https://github.com/cckuailong/spring-cloud-function-SpEL-RCE
clone到本地后需要修改版本到java17


修改后build项目,访问8080端口
spring.cloud.function.routing-expression头中包含的SpEL表达式将会被执行

漏洞分析

通过diff可以发现开发者使用了SimpleEvaluationContext进行SPEL解析,而在此前版本中使用StandardEvaluationContext。
https://github.com/spring-cloud/spring-cloud-function/commit/0e89ee27b2e76138c16bcba6f4bca906c4f3744f

SpEL表达式

http://itmyhome.com/spring/expressions.html
Spring表达式语言(简称SpEl)是一个支持查询和操作运行时对象导航图功能的强大的表达式语言. 它的语法类似于传统EL,但提供额外的功能,最出色的就是函数调用和简单字符串的模板函数。

SpEL可以字符串之间进行嵌套也可以单独使用,嵌套时使用#{}(实现ParserContext接口)。

functionRouter

如果设置为functionRouter则默认路由绑定的具体函数交由用户进行控制,在 Spring Cloud Function Web里面,可以通过设置http头的方式来控制,使用spring.cloud.function.definitionspring.cloud.function.routing-expression 都可以,区别是后者允许使用Spring表达式语言(SpEL)。

比如我用spring.cloud.function.definition或者用路由去访问响应具体函数效果是一样的

流程分析

SpringCloud Function之所以能自动将函数建立http端点,是因为在包mvc.FunctionController中使用/** 监听了get/post类型的所有端点。

当一个请求进入时,程序首先基于Springboot的自动配置,将配置文件注入到functionProperties,随后将以“WebRequestConstants.handler”为key,function为值添加到request数组里面。

然后进入FunctionController,Controller首先会将请求使用wrapper进行包装,wrapper就是将request转成FunctionInvocationWrapper 格式。

其中functionDefiniton=”functionRouter”,经过判断是否是RoutingFunction,然后执行function.apply

if (function.isRoutingFunction()) {
	function.setSkipOutputConversion(true);
}

然后在apply里会进入doapply,输入为input包含header里的所有信息

在route方法里获取spring.cloud.function.definitionspring.cloud.function.routing-expression的值判断是否为空,然后进入else if分支,将值传给functionFromExpression

然后这里会使用标准的StandardEvaluationContext对header的值进行SpEL表达式解析

补丁分析

commit:https://github.com/spring-cloud/spring-cloud-function/commit/0e89ee27b2e76138c16bcba6f4bca906c4f3744f
StandardEvaluationContext替换为了SimpleEvaluationContext

SpEL 提供的两个 EvaluationContext ,区别如下:

  • SimpleEvaluationContext - 针对不需要 SpEL 语言语法的全部范围并且应该受到有意限制的表达式类别,公开 SpEL 语言特性和配置选项的子集。
  • StandardEvaluationContext - 公开全套 SpEL 语言功能和配置选项。您可以使用它来指定默认的根对象并配置每个可用的评估相关策略。
    SimpleEvaluationContext 旨在仅支持 SpEL 语言语法的一个子集。它不包括 Java类型引用、构造函数 和 bean引用。所以说指定正确 EvaluationContext ,是防止SpEl表达式注入漏洞产生的首选。方法如下:
String expression = request.getParameter("message");
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression(expression);
StandardEvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().withRootObject().build();
String message = exp.getValue(context, String.class);
exp.setValue(context, "Hello");

利用工具

https://github.com/chaosec2021/Spring-cloud-function-SpEL-RCE

看了下代码用java.lang.Runtime).getRuntime().exec()执行bash反弹shell
也可以用processbuilder来执行命令,例如
new ProcessBuilder('/System/Applications/Calculator.app/Contents/MacOS/Calculator').start()

参考

https://www.jianshu.com/p/04bc9f482b43
https://mp.weixin.qq.com/s/AVvyKjRz_XooIB0s1S8njA
https://github.com/vulhub/vulhub/blob/master/spring/CVE-2022-22963/README.zh-cn.md
https://www.cnblogs.com/9eek/archive/2022/04/07/16113603.html
https://blog.51cto.com/u_9652359/5187423

标签:Function,function,Spring,22963,SpEL,https,spring,com,cloud
来源: https://www.cnblogs.com/twosmi1e/p/16138406.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有