漏洞描述
6月20号,VMware发布安全公告,修复了spring Data MongoDB 组件中的一个SpEL表达式注入漏洞,该漏洞的CVSSv3评分为8.2,漏洞编号:CVE-2022-22980,漏洞威胁等级:高危。
Spring Data MongoDB应用程序在对包含查询参数占位符的SpEL表达式使用@Query或@Aggregation注解的查询方法进行值绑定时,若输入未被过滤,则易遭受SpEL注入攻击。该漏洞允许未经身份验证的攻击者构造恶意数据执行远程代码,最终获取服务器权限。
相关介绍
Spring Data for MongoDB是 Spring Data 项目的一部分,该项目旨在为新的数据存储提供熟悉和一致的基于Spring的编程模型,同时保留存储的特定特征和功能。Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言,也是一种简洁的装配Bean的方式,它通过运行期执行的表达式将值装配到Bean的属性或构造器参数中。
利用范围
Spring Data MongoDB == 3.4.0
3.3.0 <= Spring Data MongoDB <= 3.3.4
漏洞分析
环境搭建
此次采用threedr3am师傅的漏洞demo(https://github.com/threedr3am/learnjavabug/tree/master/spring/spring-data-mongodb-spel-CVE-2022-22980)进行复现分析。
动态调式
在调试之前查看一下demo中的DemoController,其构造的请求路径为/demo,请求参数为keyword。
根据diff(https://github.com/spring-projects/spring-data-mongodb/commit/7c5ac764b343d45e5d0abbaba4e82395b471b4c4?diff=split)记录发现,此次漏洞修复的主要位置在ParameterBindingJsonReader 类的 bindableValueFor 函数。
将环境运行起来后开启debug模式。使用burp抓包并传入payload后,立即触发断点。
持续跟进,当第一次到达漏洞触发点时,发现并未成功触发payload。
继续跟进,发现在org.springframework.data.mongodb.util.json.ParameterBindingJsonReader#readBsonType函数中判断token的Type属性后,进入到UNQUOTED_STRING,在这里进行setCurrentName操作,value为id。
随后回到bindableValueFor函数,后续经过对value的处理,value由id变为了:#{?0}。
在value为:#{?0}后,会再次进入org.springframework.data.mongodb.util.json.ParameterBindingJsonReader#bindableValueFor函数。
在bindableValueFor函数中首先对tokenValue进行了赋值,随后对tokenValue进行PARAMETER_BINDING_PATTERN和EXPRESSION_BINDING_PATTERN规则匹配。
EXPRESSION_BINDING_PATTERN只能匹配 ?#{} 或者:#{}形式的字符串。
随后,将赋值交给binding,再通过substring取出占位符?0
接下来通过for循环将占位符和传入的payload进行替换。
同时通过PARAMETER_BINDING_PATTERN规则匹配成功后即认为是spel表达式格式,此时expression为传入payload。
执行this.evaluateExpression。
最终进入org.springframework.data.mongodb.repository.query.DefaultSpELExpressionEvaluator#evaluate函数,此时使用的是 StandardEvaluationContext 类型,包含了 SpEL 所有的功能。
此时的 SpEL表达式为之前构造的恶意攻击载荷,可成功命令执行。
漏洞复现
修复建议
目前此漏洞已经修复,受影响的用户建议尽快升级至官方修护版本:
Spring Data MongoDB 3.4.1或更高版本;
Spring Data MongoDB 3.3.5或更高版本。
下载链接:
https://github.com/spring-projects/spring-data-mongodb/tags
参考材料
1.https://tanzu.vmware.com/security/cve-2022-22980
2.https://xz.aliyun.com/t/11478
3.https://spring.io/blog/2022/06/20/spring-data-mongodb-spel-expression-injection-vulnerability-cve-2022-22980
关于Portal Lab
星阑科技 Portal Lab 致力于前沿安全技术研究及能力工具化。主要研究方向为API 安全、应用安全、攻防对抗等领域。实验室成员研究成果曾发表于BlackHat、HITB、BlueHat、KCon、XCon等国内外知名安全会议,并多次发布开源安全工具。未来,Portal Lab将继续以开放创新的态度积极投入各类安全技术研究,持续为安全社区及企业级客户提供高质量技术输出。
原文始发于微信公众号(星阑PortalLab):【技术干货】 CVE-2022-22980 Spring Data MongoDB SpEL表达式注入漏洞分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论