Spring是Java EE2002年在编程领域创建了一个流行的开源框架,旨在解决企业编程开发的复杂性、业务逻辑层和其他层的松耦合问题。因此,它将面向接口的编程理念贯穿于整个系统应用中,实现应用框架的快速开发。Spring 框架已广泛应用于大量企业,包括科技巨头和一些无服务器(serverless)服务提供商。
据外媒报道,Spring官方日前在github一个可能导致命令执行漏洞的修复代码已经在互联网上成功验证。研究机构将漏洞评为高风险水平。应用程序JDK建议版本号9及以上的企业尽快开展Spring检查和处理框架使用的漏洞。
漏洞排查
(1) 如果系统项目war按以下步骤判断包形式部署:
- 解压war包:将war文件的后缀修改成.zip ,解压zip文件。
- 搜索解压缩目录下是否存在 spring-beans-*.jar 格式的jar文件(例如spring-beans-5.3.16.jar),如果存在,说明业务系统使用了spring开发框架。
- 如果spring-beans-*.jar 文件不存在,在解压缩目录下搜索CachedIntrospectionResuLts.class 文件是否存在,说明业务系统使用了Spring框架开发。
(2) 如果系统项目jar包直接独立运行,按以下步骤判断:
- 解压jar包:将jar文件的后缀修改成.zip,解压zip文件。
- 在解压缩目录下搜索是否存在spring-beans-*.jar 格式的jar文件(例如spring-beans-5.3.16.jar),如果存在,说明业务系统使用了spring开发框架。
- 如果spring-beans-*.jar 文件不存在,在解压缩目录下搜索CachedIntrospectionResuLts.class 文件是否存在,说明业务系统使用了spring开发框架。
漏洞修复
目前,spring安全专家建议采用以下两种临时方案进行保护,并及时关注官方补丁的发布。
(1) WAF防护
在WAF在网络防护设备上,根据业务流量的实际部署,实现class.*”“Class.*”“*.class.*”“*.Class.*过滤等字符串的规则,部暑过滤规则后,测试业务运行,避免额外影响。
(2) 临时修复措施
漏涧的临时修复应按以下两个步骤进行:
- 全局搜索应用@InitBinder注意,看看该方法是否在体内调用dataBinder.setDisallowedFields如果发现此代码片段的引入,则添加到原始黑名单中{"class.*","Class. *","*. class.*","*.Class.*"}。
- 在应用系统的项目包下,新建以下全球类,并确保该类被覆盖Spring 加载到(推荐在Controller 添加到包中).类别添加完成后,需要对项目进行重新编译、包装和功能验证测试。并重新发布项目。
import org.springframework.core.annotation.Order;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;
@ControllerAdvice
@Order(10000)
public class GlobalControllerAdvice{
@InitBinder
public void setAllowedFields(webdataBinder dataBinder){
String[]abd=new string[]{"class.*","Class.*","*.class.*","*.Class.*"};
dataBinder.setDisallowedFields(abd);
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;
@ControllerAdvice
@Order(10000)
public class GlobalControllerAdvice{
@InitBinder
public void setAllowedFields(webdataBinder dataBinder){
String[]abd=new string[]{"class.*","Class.*","*.class.*","*.Class.*"};
dataBinder.setDisallowedFields(abd);