Spring框架RFD漏洞 (CVE-2020-5421) 解决方案

反射型文件下载漏洞(RFD)是一种攻击技术,通过从受信任的域虚拟下载文件,攻击者可以获得对受害者计算机的完全访问权限。

01 前言

Spring Framework开源框架可以说是当今JAVA界最基础的框架,由于应用的广泛性,对于使用项目组而言,每一次升级都需要经过深思熟虑,防止引发连锁反应。此次针对CVE-2020-5421漏洞的公布,在紧迫的整改要求下,如果盲目进行升级会对项目本身的稳定性和功能性造成影响,存在风险。

本文从漏洞背景、影响版本、漏洞原理等方面进行简明描述,并且得出大部分情况下无需进行升级或者修复版本的结论,对于有需要修复的应用提供了两种解决方案,详情见下文。

02 漏洞背景

反射型文件下载漏洞(RFD)是一种攻击技术,通过从受信任的域虚拟下载文件,攻击者可以获得对受害者计算机的完全访问权限。

CVE-2020-5421 可通过jsessionid路径参数,绕过防御RFD攻击的保护。具体原理见下文。

03 影响版本

Spring Framework 5.2.0 - 5.2.8

Spring Framework 5.1.0 - 5.1.17

Spring Framework 5.0.0 - 5.0.18

Spring Framework 4.3.0 - 4.3.28

04 漏洞原理

CVE-2020-5421是针对CVE-2015-5211修复方式的绕过,如果要实现漏洞复现需要先开启以下两个参数:

spring.mvc.pathmatch.use-suffix-pattern=true ,

spring.mvc.contentnegotiation.favor-path-extension=true

这两个参数分别是开启后缀匹配模式和内容协商机制。默认情况下是不开启的。

org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.addContentDispositionHeader方法中先调用了UrlPathHelper .getOriginatingRequestUri最终调用了同类中的removeJsessionid方法如下图所示:

 Spring框架RFD漏洞 (CVE-2020-5421) 解决方案

Spring框架RFD漏洞 (CVE-2020-5421) 解决方案

此方法会将请求url中;jsessionid=字符串开始进行截断(或者下一个;前)。由于这段删除;jsessionid=的代码,造成删除;jsessionid=之后CVE-2015-5211的后续防御代码获取不到请求的真实后缀文件名,从而绕过RDF防御代码。比如类似http://localhost:8080/aaa/;jsessionid=/excute.sh?input=calc,就会下载名为execute.sh的可执行文件。

05 解决方案

无需进行升级或修复的情况

从上述分析描述中可知,对于没有主动开启以下两个spring参数的

spring.mvc.pathmatch.use-suffix-pattern=true和spring.mvc.contentnegotiation.favor-path-extension=true的应用是不存在漏洞利用条件的, 可以检查在application.properties或者bootstrap.properties等配置文件中是否有显示开启,如果没有搜索到说明没有显示打开,则应用不需要进行spring版本升级或者修复。

需要进行升级或修复的情况

对于打开了前面两个参数的应用,需要进行升级或者修复,有以下两个方案,可以根据应用的情况进行升级:

方案一:直接升级Spring版本

根据官网发布包,针对自己使用的受影响版本选择对应的版本。

适用场景:应用中没有对spring框架进行源码修改使用,使用的是原生的spring框架,升级后有较为充足时间进行测试验证功能。

SpringFramework 5.2.0 - 5.2.8 -->5.2.9

SpringFramework 5.1.0 - 5.1.17 -->5.1.18

SpringFramework 5.0.0 - 5.0.18 -->5.0.19

SpringFramework 4.3.0 - 4.3.28 -->4.3.29

 

方案二:添加安全过滤器

适用场景:应用中可能存在对spring框架进行源码修改使用,或者不确定升级后对系统的影响范围,或者没有充足时间进行测试验证功能的情况。

spring官方升级方案中是对含有;jsessionid=的URL的后缀进行校验是否为安全后缀,如果不在白名单内则设置Content-Disposition=inline;filename=f.txt,强制将响应的内容下载到名为f.txt的文件中。具体伪代码样例如下,将此代码放在已有的Filter过滤器或者新建一个Filter专门处理此问题即可。

Spring框架RFD漏洞 (CVE-2020-5421) 解决方案

光大银行 信息科技部平台开发处 陈守清

声明:本文来自安全内参,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。

版权归原作者所有,如若转载,请注明出处:https://www.ciocso.com/article/384.html

发表评论

登录后才能评论
跳至工具栏