更新内容
- [06-20]Spring Data MongoDB3.4.1和3.3.5已经发布。
漏洞概述
我们想宣布,我们已经发布了Spring Data MongoDB 3.4.1和3.3.5,以解决以下CVE报告。
该漏洞由NSFOCUS天极实验室的张泽伟于2022年6月13日星期一负责任地报告。完整的报告将在接下来的几天内发布到 MITRE,并作为安全公告在tanzu.vmware.com/security下发布。
漏洞
该漏洞影响到使用存储库查询方法的 Spring Data MongoDB 应用程序,这些方法被注释为@Query 或@Aggregation 并使用参数化 SpEL 语句。一个特定的漏洞需要使用非消毒的输入到存储库查询方法。
我是否受到影响?
这些是特定漏洞的必要条件。
- 声明存储库的查询方法,注释为
@Query或@Aggregation,使用 SpEL(Spring Expression Language),并在 SpEL 表达式中使用输入参数引用(?0,?1, ...) spring-data-mongodb依赖性- Spring Data MongoDB 3.4.0、3.3.0至3.3.4以及旧版本
补充说明
- 该问题与存储库查询方法的调用有关,以使用表达式组装MongoDB查询。漏洞发生在查询组装过程中,不需要执行查询就可以利用。
- 通过数组语法引用SpEL参数(
[0],[1],[…])不会产生漏洞,如果你不能升级到包含修复的版本,建议采取变通方法 - 该漏洞只有在应用程序用未经消毒的用户输入调用查询方法时才能被利用。另外,暴露存储库查询方法而不涉及额外的应用程序代码的安排(如Spring Data REST)也有漏洞。
状态
- Spring Data MongoDB 3.4.1和3.3.5已经发布,其中包含修复措施。
建议的解决方法
首选的对策是更新到Spring Data MongoDB3.4.1和3.3.5或更高版本。如果你已经这样做了,那么就没有必要采取变通措施。然而,有些人可能处于无法快速升级的境地。出于这个原因,我们在下面提供了一些变通方法。
请注意,变通方法不一定是相互排斥的,因为安全问题最好是 "深入 "进行。
使用数组语法
如果你的应用程序需要由用户输入控制的动态SpEL表达式,那么使用数组语法引用SpEL参数[0] ,是访问SpEL参数的一种安全方式。
实现一个自定义的存储库方法
用自定义资源库方法的实现代替SpEL表达式是一个可行的工作方法,可以在应用程序代码中组装你的动态查询。更多细节请参考关于存储库定制的参考文档。
CVE报告
CVE-2022-22980。Spring Data MongoDB SpEL表达式通过注释的存储库查询方法注入漏洞
严重程度
高
供应商
VMware的Spring
描述
Spring Data MongoDB 应用程序在使用带有 SpEL 表达式的@Query 或@Aggregation 注释的查询方法时,如果输入没有经过消毒处理,则容易受到 SpEL 注入的影响。
具体来说,当以下所有情况为真时,应用程序就会受到攻击。
- 存储库的查询方法被注释为
@Query或@Aggregation - 注解的查询或聚合值/管道包含表达式中使用参数占位符语法的SpEL部分
- 用户提供的输入没有经过应用程序的处理。
如果以下任何一项为真,应用程序就没有漏洞。
- 注释的资源库查询或聚合方法不包含表达式。
- 注释的资源库查询或聚合方法不在表达式中使用参数占位符语法。
- 用户提供的输入已被应用程序清除。
- 存储库被配置为使用一个限制 SpEL 使用的
QueryMethodEvaluationContextProvider。
受影响的 VMware 产品和版本
除非另有说明,否则严重程度为高。
- Spring Data MongoDB
- 3.4.0
- 3.3.0 至 3.3.4
- 较早的、不支持的版本也受到影响
缓解措施
受影响版本的用户应采用以下缓解措施。3.4.x用户应升级到3.4.1+。3.3.x用户应升级到3.3.5+。没有其他步骤是必要的。对于不能升级到上述版本的应用程序,还有其他缓解步骤。
其他缓解步骤。
- 重写查询或聚合声明,在表达式中使用参数引用("[0]"而不是"?0")。
- 在调用查询方法前对参数进行消毒
- 通过BeanPostProcessor与有限的QueryMethodEvaluationContextProvider重新配置存储库工厂Bean
修复了这个问题的版本包括。
- Spring Data MongoDB
- 3.4.1+
- 3.3.5+
信用
此问题由NSFOCUS天基实验室的张泽伟发现并负责任地报告。
参考文献
历史记录
2022-06-20:最初的漏洞报告发布。