Spring 官方证实!大漏洞,JDK 9 及以上均受影响!
推荐关注
扫码关注“后端架构师”,选择“星标”公众号
重磅干货,第一时间送达!
责编:架构君 | 来源:CSDN(ID:CSDNnews)
责编:架构君 | 来源:CSDN(ID:CSDNnews)
上一篇好文:Spring Boot + Redis 实现 API 接口防刷限流!
大家好,我是后端架构师。
继 Log4j 2 之后,听闻 Java 再次遭到漏洞攻击,这一次,似乎情况也更为严重,因为受到影响的是 Java 平台的开源全栈应用程序框架和控制反转容器实现——Spring 家族,而且网传漏洞还不止一个。往期漏洞扩展:突发!Log4j 爆“核弹级”漏洞,上万个项目受影响...
一直以来,Spring 是编程开发的必选技术之一,此前一位名为 Bogdan N. 的全栈开发者甚至评价道:“学习 Java、学习 Spring 框架,你永远都不会失业。”可想而知,如果 Spring 城门失火,Java 必定遭殃。
据悉,3 月 30 日,国家信息安全漏洞共享平台(CNVD)接收到蚂蚁科技集团股份有限公司报送的 Spring 框架远程命令执行漏洞(CNVD-2022-23942)。攻击者利用该漏洞,可在未授权的情况下远程执行命令。CNVD 对该漏洞的综合评级为“高危”。
3 月 31 日晚间,Spring.io 官方也紧急发布了早期公告(https://spring.io/blog/2022/03/31/spring-framework-rce-early-announcement),证实了 Spring 框架 RCE 漏洞的存在,而且受影响版本覆盖 JDK 9 及更高版本、Spring Framework 版本 5.3.0 到 5.3.17、5.2.0 到 5.2.19 以及更早的版本等。
前情
这个漏洞还要从 3 月 29 日晚间说起。
彼时有不少网友爆料,Spring 框架出现“史诗级” RCE 漏洞,平地一声雷,一时之间,快要入睡的开发者们纷纷坐起查看关于漏洞的情况,闹得技术圈中人心惶惶。
不过有些不同寻常的是,这个漏洞并没有像 Log4j2 事件那样引起圈内诸多企业大厂的紧急行动,甚至连国外披露漏洞的根源也是来自 QQ 和国内部分网络安全网站。
这也让不少网友猜测,该漏洞应该是国内某个安全机构、安全人员最先发现的。
果不其然,据 3 月 31 日国家信息安全漏洞共享平台(CNVD)发布的《关于Spring框架存在远程命令执行漏洞的安全公告》显示,这群神秘的白帽子们包括蚂蚁科技集团、奇安信科技、杭州安恒信息技术、安天科技、360、北京天融信,当然这些都是后话了。
此前,有网友将该漏洞发布到了 GitHub 上(目前已删除,但有网友将该页面保存了下来):
来源:https://archive.ph/DIbrv
根据网传的内容显示:
Spring 框架出现的 RCE 0day 漏洞影响的范围为 JDK 版本号在 9 及以上的、使用了 Spring 框架或衍生框架。
随着该网传漏洞的暗流涌动,国外不少网络安全研究人员和安全公司也发布 Twitter 表示这一漏洞的存在:
随着事情的发酵,在 Spring 官方尚未发布最新说明之前,开发者完全无法确定哪些应用程序使用了有漏洞的功能,这也导致但凡和 Spring 沾点关系的功能,开发者都要问上一句「是否涉及 Spring Core 的 RCE 0day 漏洞」。
同时,也有不少网友调侃道:
别慌,虽然现在 Java 已经到了 Java 18 版本,但是很多企业仍然停留在 Java 8 版本及以下。另外,搜索公众号Linux就该这样学后台回复“电子书”,获取一份惊喜礼包。
不同的安全漏洞,也让 Java 工程师产生了严重的心理阴影:
Spring 零日漏洞真的存在
就在开发者越来越焦灼时,Spring.io 官方于 3 月 31 日晚间出面证实了这一漏洞的存在,并带来了解决方案。
根据公告,我们发现这个漏洞的影响远比我们想象的更为严重,如果满足以下几种门槛,极有可能受漏洞影响:
JDK 9 或更高版本
Apache Tomcat 作为 Servlet 容器
打包为传统的 WAR(与 Spring Boot 可执行 jar 相比)
spring-webmvc 或 spring-webflux 依赖
Spring Framework 版本 5.3.0 到 5.3.17、5.2.0 到 5.2.19 以及更早的版本
初步解决方案
当前 Spring.io 已经发布了 Spring Framework 5.3.18 和 5.2.20 版本,同时还带来了最新的依赖于 Spring Framework 5.3.18 的 Spring Boot 2.6.6 和 2.5.12 。因为如果你能升级到 Spring Framework 5.3.18 和 5.2.20,就不用以下的修复方案了。
如果不可以,Spring 官方建议通过 @ControllerAdvice 来设置 WebDataBinder 的 disallowedFields。
@ControllerAdvice
@Order(Ordered.LOWEST_PRECEDENCE)
public class BinderControllerAdvice {
@InitBinder
public void setAllowedFields(WebDataBinder dataBinder) {
String[] denylist = new String[]{"class.*", "Class.*", "*.class.*", "*.Class.*"};
dataBinder.setDisallowedFields(denylist);
}
}
这个解决方案通常会有效,但也并不是 100% 可以阻止漏洞。因此为了更加保险一些,Spring.io 还建议应用程序可以扩展 RequestMappingHandlerAdapter,同时在所有其他初始化之后,在最后更新WebDataBinder。为了实现这一点,Spring Boot 应用程序可以声明一个 WebMvcRegistrations(Spring MVC)或 WebFluxRegistrations bean(Spring WebFlux)。
在Spring MVC中(在WebFlux中也类似)示例如下:
package car.app;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcRegistrations;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.annotation.InitBinderDataBinderFactory;
import org.springframework.web.method.support.InvocableHandlerMethod;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
import org.springframework.web.servlet.mvc.method.annotation.ServletRequestDataBinderFactory;
@SpringBootApplication
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(CarApp.class, args);
}
@Bean
public WebMvcRegistrations mvcRegistrations() {
return new WebMvcRegistrations() {
@Override
public RequestMappingHandlerAdapter getRequestMappingHandlerAdapter() {
return new ExtendedRequestMappingHandlerAdapter();
}
};
}
private static class ExtendedRequestMappingHandlerAdapter extends RequestMappingHandlerAdapter {
@Override
protected InitBinderDataBinderFactory createDataBinderFactory(List<InvocableHandlerMethod> methods) {
return new ServletRequestDataBinderFactory(methods, getWebBindingInitializer()) {
@Override
protected ServletRequestDataBinder createBinderInstance(
Object target, String name, NativeWebRequest request) throws Exception {
ServletRequestDataBinder binder = super.createBinderInstance(target, name, request);
String[] fields = binder.getDisallowedFields();
List<String> fieldList = new ArrayList<>(fields != null ? Arrays.asList(fields) : Collections.emptyList());
fieldList.addAll(Arrays.asList("class.*", "Class.*", "*.class.*", "*.Class.*"));
binder.setDisallowedFields(fieldList.toArray(new String[] {}));
return binder;
}
};
}
}
}
对于没有 Spring Boot 的 Spring MVC,应用程序可以从 @EnableWebMvc 切换到直接扩展 DelegatingWebMvcConfiguration,如这个文档中(https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-config-advanced-java)高级配置部分所述,然后重写 createRequestMappingHandlerAdapter 方法。基于以上,我们建议受漏洞影响的产品(服务)厂商和信息系统运营者第一时间进行自查,并及时升级至最新版本。
上一篇好文:Spring Boot + Redis 实现 API 接口防刷限流!
大家好,我是后端架构师。
继 Log4j 2 之后,听闻 Java 再次遭到漏洞攻击,这一次,似乎情况也更为严重,因为受到影响的是 Java 平台的开源全栈应用程序框架和控制反转容器实现——Spring 家族,而且网传漏洞还不止一个。往期漏洞扩展:突发!Log4j 爆“核弹级”漏洞,上万个项目受影响...
一直以来,Spring 是编程开发的必选技术之一,此前一位名为 Bogdan N. 的全栈开发者甚至评价道:“学习 Java、学习 Spring 框架,你永远都不会失业。”可想而知,如果 Spring 城门失火,Java 必定遭殃。
据悉,3 月 30 日,国家信息安全漏洞共享平台(CNVD)接收到蚂蚁科技集团股份有限公司报送的 Spring 框架远程命令执行漏洞(CNVD-2022-23942)。攻击者利用该漏洞,可在未授权的情况下远程执行命令。CNVD 对该漏洞的综合评级为“高危”。
3 月 31 日晚间,Spring.io 官方也紧急发布了早期公告(https://spring.io/blog/2022/03/31/spring-framework-rce-early-announcement),证实了 Spring 框架 RCE 漏洞的存在,而且受影响版本覆盖 JDK 9 及更高版本、Spring Framework 版本 5.3.0 到 5.3.17、5.2.0 到 5.2.19 以及更早的版本等。
前情
这个漏洞还要从 3 月 29 日晚间说起。
彼时有不少网友爆料,Spring 框架出现“史诗级” RCE 漏洞,平地一声雷,一时之间,快要入睡的开发者们纷纷坐起查看关于漏洞的情况,闹得技术圈中人心惶惶。
不过有些不同寻常的是,这个漏洞并没有像 Log4j2 事件那样引起圈内诸多企业大厂的紧急行动,甚至连国外披露漏洞的根源也是来自 QQ 和国内部分网络安全网站。
这也让不少网友猜测,该漏洞应该是国内某个安全机构、安全人员最先发现的。
果不其然,据 3 月 31 日国家信息安全漏洞共享平台(CNVD)发布的《关于Spring框架存在远程命令执行漏洞的安全公告》显示,这群神秘的白帽子们包括蚂蚁科技集团、奇安信科技、杭州安恒信息技术、安天科技、360、北京天融信,当然这些都是后话了。
此前,有网友将该漏洞发布到了 GitHub 上(目前已删除,但有网友将该页面保存了下来):
来源:https://archive.ph/DIbrv
根据网传的内容显示:
Spring 框架出现的 RCE 0day 漏洞影响的范围为 JDK 版本号在 9 及以上的、使用了 Spring 框架或衍生框架。
随着该网传漏洞的暗流涌动,国外不少网络安全研究人员和安全公司也发布 Twitter 表示这一漏洞的存在:
随着事情的发酵,在 Spring 官方尚未发布最新说明之前,开发者完全无法确定哪些应用程序使用了有漏洞的功能,这也导致但凡和 Spring 沾点关系的功能,开发者都要问上一句「是否涉及 Spring Core 的 RCE 0day 漏洞」。
同时,也有不少网友调侃道:
别慌,虽然现在 Java 已经到了 Java 18 版本,但是很多企业仍然停留在 Java 8 版本及以下。另外,搜索公众号Linux就该这样学后台回复“电子书”,获取一份惊喜礼包。
不同的安全漏洞,也让 Java 工程师产生了严重的心理阴影:
Spring 零日漏洞真的存在
就在开发者越来越焦灼时,Spring.io 官方于 3 月 31 日晚间出面证实了这一漏洞的存在,并带来了解决方案。
根据公告,我们发现这个漏洞的影响远比我们想象的更为严重,如果满足以下几种门槛,极有可能受漏洞影响:
JDK 9 或更高版本
Apache Tomcat 作为 Servlet 容器
打包为传统的 WAR(与 Spring Boot 可执行 jar 相比)
spring-webmvc 或 spring-webflux 依赖
Spring Framework 版本 5.3.0 到 5.3.17、5.2.0 到 5.2.19 以及更早的版本
初步解决方案
当前 Spring.io 已经发布了 Spring Framework 5.3.18 和 5.2.20 版本,同时还带来了最新的依赖于 Spring Framework 5.3.18 的 Spring Boot 2.6.6 和 2.5.12 。因为如果你能升级到 Spring Framework 5.3.18 和 5.2.20,就不用以下的修复方案了。
如果不可以,Spring 官方建议通过 @ControllerAdvice 来设置 WebDataBinder 的 disallowedFields。
@ControllerAdvice
@Order(Ordered.LOWEST_PRECEDENCE)
public class BinderControllerAdvice {
@InitBinder
public void setAllowedFields(WebDataBinder dataBinder) {
String[] denylist = new String[]{"class.*", "Class.*", "*.class.*", "*.Class.*"};
dataBinder.setDisallowedFields(denylist);
}
}
这个解决方案通常会有效,但也并不是 100% 可以阻止漏洞。因此为了更加保险一些,Spring.io 还建议应用程序可以扩展 RequestMappingHandlerAdapter,同时在所有其他初始化之后,在最后更新WebDataBinder。为了实现这一点,Spring Boot 应用程序可以声明一个 WebMvcRegistrations(Spring MVC)或 WebFluxRegistrations bean(Spring WebFlux)。
在Spring MVC中(在WebFlux中也类似)示例如下:
package car.app;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcRegistrations;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.annotation.InitBinderDataBinderFactory;
import org.springframework.web.method.support.InvocableHandlerMethod;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
import org.springframework.web.servlet.mvc.method.annotation.ServletRequestDataBinderFactory;
@SpringBootApplication
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(CarApp.class, args);
}
@Bean
public WebMvcRegistrations mvcRegistrations() {
return new WebMvcRegistrations() {
@Override
public RequestMappingHandlerAdapter getRequestMappingHandlerAdapter() {
return new ExtendedRequestMappingHandlerAdapter();
}
};
}
private static class ExtendedRequestMappingHandlerAdapter extends RequestMappingHandlerAdapter {
@Override
protected InitBinderDataBinderFactory createDataBinderFactory(List<InvocableHandlerMethod> methods) {
return new ServletRequestDataBinderFactory(methods, getWebBindingInitializer()) {
@Override
protected ServletRequestDataBinder createBinderInstance(
Object target, String name, NativeWebRequest request) throws Exception {
ServletRequestDataBinder binder = super.createBinderInstance(target, name, request);
String[] fields = binder.getDisallowedFields();
List<String> fieldList = new ArrayList<>(fields != null ? Arrays.asList(fields) : Collections.emptyList());
fieldList.addAll(Arrays.asList("class.*", "Class.*", "*.class.*", "*.Class.*"));
binder.setDisallowedFields(fieldList.toArray(new String[] {}));
return binder;
}
};
}
}
}
欢迎有需要的同学试试,如果本文对您有帮助,也请帮忙点个 赞 + 在看 啦!❤️
在 GitHub猿 还有更多优质项目系统学习资源,欢迎分享给其他同学吧!
PS:如果觉得我的分享不错,欢迎大家随手点赞、转发、在看。
最后给读者整理了一份BAT大厂面试真题,需要的可扫码加微信备注:“面试”获取。
欢迎有需要的同学试试,如果本文对您有帮助,也请帮忙点个 赞 + 在看 啦!❤️
在 GitHub猿 还有更多优质项目系统学习资源,欢迎分享给其他同学吧!
PS:如果觉得我的分享不错,欢迎大家随手点赞、转发、在看。
最后给读者整理了一份BAT大厂面试真题,需要的可扫码加微信备注:“面试”获取。
版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!
版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!
END
最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。在这里,我为大家准备了一份2021年最新最全BAT等大厂Java面试经验总结。
别找了,想获取史上最全的Java大厂面试题学习资料
扫下方二维码回复「面试」就好了
历史好文:
基于SpringBoot 的CMS系统,拿去开发企业官网真香
扫码关注“后端架构师”,选择“星标”公众号
别找了,想获取史上最全的Java大厂面试题学习资料
扫下方二维码回复「面试」就好了
历史好文:
基于SpringBoot 的CMS系统,拿去开发企业官网真香
扫码关注“后端架构师”,选择“星标”公众号