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方法如下图所示:
此方法会将请求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专门处理此问题即可。
光大银行 信息科技部平台开发处 陈守清
声明:本文来自士冗科技,版权归作者所有。文章内容仅代表作者独立观点,不代表士冗科技立场,转载目的在于传递更多信息。如有侵权,请联系 service@expshell.com。