随州网站,wordpress 主题加密,建个网站能赚钱吗,软件开发项目管理制度继 Log4j 2 之后#xff0c;听闻 Java 再次遭到漏洞攻击#xff0c;这一次#xff0c;似乎情况也更为严重#xff0c;因为受到影响的是 Java 平台的开源全栈应用程序框架和控制反转容器实现——Spring 家族#xff0c;而且网传漏洞还不止一个。
一直以来#xff0c;Spri…继 Log4j 2 之后听闻 Java 再次遭到漏洞攻击这一次似乎情况也更为严重因为受到影响的是 Java 平台的开源全栈应用程序框架和控制反转容器实现——Spring 家族而且网传漏洞还不止一个。
一直以来Spring 是编程开发的必选技术之一此前一位名为 Bogdan N. 的全栈开发者甚至评价道“学习 Java、学习 Spring 框架你永远都不会失业。”可想而知如果 Spring 城门失火Java 必定遭殃。
据悉3 月 30 日国家信息安全漏洞共享平台CNVD接收到蚂蚁科技集团股份有限公司报送的 Spring 框架远程命令执行漏洞CNVD-2022-23942。攻击者利用该漏洞可在未授权的情况下远程执行命令。CNVD 对该漏洞的综合评级为“高危”。
3 月 31 日晚间Spring.io 官方也紧急发布了早期公告证实了 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 版本及以下。 不同的安全漏洞也让 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 {InitBinderpublic void setAllowedFields(WebDataBinder dataBinder) {String[] denylist new String[]{class.*, Class.*, *.class.*, *.Class.*};dataBinder.setDisallowedFields(denylist);}}这个解决方案通常会有效但也并不是 100% 可以阻止漏洞。因此为了更加保险一些Spring.io 还建议应用程序可以扩展 RequestMappingHandlerAdapter同时在所有其他初始化之后在最后更新WebDataBinder。为了实现这一点Spring Boot 应用程序可以声明一个 WebMvcRegistrationsSpring MVC或 WebFluxRegistrations beanSpring 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);}Beanpublic WebMvcRegistrations mvcRegistrations() {return new WebMvcRegistrations() {Overridepublic RequestMappingHandlerAdapter getRequestMappingHandlerAdapter() {return new ExtendedRequestMappingHandlerAdapter();}};}private static class ExtendedRequestMappingHandlerAdapter extends RequestMappingHandlerAdapter {Overrideprotected InitBinderDataBinderFactory createDataBinderFactory(ListInvocableHandlerMethod methods) {return new ServletRequestDataBinderFactory(methods, getWebBindingInitializer()) {Overrideprotected ServletRequestDataBinder createBinderInstance(Object target, String name, NativeWebRequest request) throws Exception {ServletRequestDataBinder binder super.createBinderInstance(target, name, request);String[] fields binder.getDisallowedFields();ListString 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 方法。
基于以上我们建议受漏洞影响的产品服务厂商和信息系统运营者第一时间进行自查并及时升级至最新版本。 参考资料 https://www.cyberkendra.com/2022/03/rce-0-day-exploit-found-in-spring-cloud.html https://its.pku.edu.cn/announce/tz20220330110501.jsp https://github.com/spring-projects/spring-framework/commit/7f7fb58dd0dae86d22268a4b59ac7c72a6c22529 https://www.bleepingcomputer.com/news/security/new-spring-java-framework-zero-day-allows-remote-code-execution/ https://www.rapid7.com/blog/post/2022/03/30/spring4shell-zero-day-vulnerability-in-spring-framework/