漏洞描述
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的属性或构造器参数中。
通过 SpEL 可以实现:通过 bean 的 id 对 bean 进行引用;调用方式以及引用对象中的属性;计算表达式的值;正则表达式的匹配。
利用范围
Spring Data MongoDB == 3.4.0
3.3.0 <= Spring Data MongoDB <= 3.3.4
更早或不再受支持的Spring Data MongoDB版本也受到此漏洞影响。
漏洞分析
环境搭建
此次采用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 函数。
话不多说,先在org.springframework.data.mongodb.util.json.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