Spring 官方证实:框架爆大漏洞,JDK 9 及以上版本均受影响

继 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 应用程序可以声明一个 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);}@Beanpublic WebMvcRegistrations mvcRegistrations() {return new WebMvcRegistrations() {@Overridepublic RequestMappingHandlerAdapter getRequestMappingHandlerAdapter() {return new ExtendedRequestMappingHandlerAdapter();}};}private static class ExtendedRequestMappingHandlerAdapter extends RequestMappingHandlerAdapter {@Overrideprotected InitBinderDataBinderFactory createDataBinderFactory(List<InvocableHandlerMethod> 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();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 方法。

基于以上,我们建议受漏洞影响的产品(服务)厂商和信息系统运营者第一时间进行自查,并及时升级至最新版本。

参考资料:

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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有关家居产品设计的外国专著_为啥外国的二手家具被称为vintage,中国就叫破烂?差在哪儿了?...

如果你细细观察国外的家居市场&#xff0c;发现跳蚤市场特别流行于各个国家。无论是美国、英国、法国&#xff0c;一些普通民众需要购买家具会优先考虑去跳蚤市场看看。所谓的跳蚤市场就是我们国内俗称的二手家具市场&#xff0c;在国人眼中就如同破烂一般存在。而在国外人心中…

mysql挂载数据卷_记一次生产数据库数据文件进行分区转移

概述由于之前同事没有对磁盘分区做规划&#xff0c;可以看到数据和系统是在同个分区的&#xff0c;没有单独规划一个数据分区给数据库&#xff0c;还有个分区是640G没有用上。下面简单介绍一下mysql数据库数据文件的转移过程。1、新建数据分区篇幅需要&#xff0c;以下从简。。…

java计算一个多边形的重心_2D凸多边形碰撞检测算法(二) - GJK(上)

2D凸多边形碰撞检测算法&#xff08;二&#xff09; - GJK&#xff08;上&#xff09;原理在 Narrow Phase 精细碰撞检测中&#xff0c;除了 SAT &#xff0c;另外一个就是 GJK&#xff08;Gilbert–Johnson–Keerthi&#xff09;算法。它足够高效&#xff0c;且很容易了解它是…

高性能对象存储MinIO学习API使用使用api创建文件夹MinIO工具类

MinIO 是GlusterFS创始人之一Anand Babu Periasamy发布的开源项目&#xff0c;基于Apache V2 license 100% 开放源代码。MinIO采用Golang实现&#xff0c;客户端支持Java、Python、Javacript、Golang语言等。 其设计的主要目标是作为私有云对象存储的标准方案。非常适合于存储…

rmi远程反序列化rce漏洞_Apache Dubbo Provider默认反序列化远程代

背景近日&#xff0c;Apache Dubbo披露了Provider默认反序列化远程代码执行漏洞(CVE-2020-1948)&#xff0c;攻击者可构造恶意请求&#xff0c;从而执行任意代码。具体信息如上图所示。在官方邮件中&#xff0c;漏洞报告者还提供了官方的PoC脚本&#xff0c;感兴趣的读者可以自…

操作痕迹包括那些_高级消防设施操作员专题之:走近气体灭火系统

按照《消防设施操作员职业技能标准》的规定&#xff0c;安装有气体灭火系统的单位&#xff0c;应当配置高级消防设施操作员。由于这些单位通常情况下都是消防安全重点单位、火灾高危单位&#xff0c;可以预见&#xff0c;高级消防设施操作员作为消防行业的高技能人才&#xff0…

flutter不支持热更新_Flutter 在安卓上可以实现热更新了

本文由 句号君 授权投稿原文链接&#xff1a;https://blog.csdn.net/qizewei123/article/details/102963340Flutter 官方在 GitHub 上声明是暂时不支持热更新的&#xff0c;但是在 Flutter 的源码里&#xff0c;是有一部分预埋的热更新相关的代码&#xff0c;并且通过一些我们自…

jar包在windows后台运行,通过.bat文件

jar包在windows后台运行.bat 一、IDEA打成jar包 这里不再赘述 二、在windows后台运行jar包 在cmd中可以使用java -jar xxxxx.jar方式运行一个jar文件&#xff0c;这种方法运行一旦关闭该cmd界面就会停止运行。编辑.bat文件&#xff0c;使用javaw方式运行不用担心文件会在不小…

java 枚举(enum) 全面解读

枚举类型是单例模式的。你需要实例化一次&#xff0c;然后再整个程序之中就可以调用他的方法和成员变量了。 枚举类型使用单例模式是因为他的值是固定的&#xff0c;不需要发生改变。 简介 枚举是Java1.5引入的新特性&#xff0c;通过关键字enum来定义枚举类。枚举类是一种特殊…

修改表名_面试官:如何批量修改mysql表字段、表、数据库字符集和排序规则

概述目前数据库字符集统一用的utf8&#xff0c;由于项目需要&#xff0c;引进了表情&#xff0c;但是utf8mb5才支持表情字符&#xff0c;所以需统一修改数据库字符集&#xff0c;下面介绍批量修改数据库字符集的办法。修正顺序是字段级别>表级别>库级别。一、批量修改整个…

Maven命令 install 和 package的区别

Maven命令 install 和 package的区别 Maven是目前十分流行的项目构建工具以及依赖解决工具&#xff0c;其提供的常用指令中有两个很容易引起使用者的疑惑&#xff0c; 那就是 install 和 package &#xff0c; 那么这两个命令到底有啥区别呢&#xff1f; Maven install 安装…

如何重启_消费市场按下重启键,企业该如何提前布局

2020广发卡携手企业和消费者&#xff0c;共同按下重启键&#xff0c;让我们放下包袱&#xff0c;轻松前行。当疫情结束后&#xff0c;你想做什么&#xff1f;也许是去见想见的人&#xff0c;和他一起去吃想吃的美食&#xff1b;也许是约上三五好友&#xff0c;或带着最亲的家人…

Linux中使用netstat命令的基本操作,排查端口号的占用情况

Linux中netstat命令详解 Netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具&#xff0c;它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据&#xff0c;一般用于检验本机各端口的网络连接情…

与context的关系_Android-Context

一.简介Context 翻译为上下文环境&#xff0c;是一个应用程序环境信息的接口。如果以 Android 系统角度来看可以理解为某一与操作系统的交互的具体场景&#xff0c;比如 Activity 的具体功能&#xff0c;Service 的后台运行等。如果以程序的角度看&#xff0c;Context 是一个抽…

Linux中sudo、su和su -命令的区别

Linux中sudo、su和su -命令的区别小结 我们知道&#xff0c;在Linux下对很多文件进行修改都需要有root&#xff08;管理员&#xff09;权限&#xff0c;比如对/ect/profile等文件的修改。下面这篇文章主要给大家总结介绍了关于Linux中sudo、su和su -命令的区别的相关资料&…

如何根据进程号去查端口号?

1.查出进程号 eg: ps -ef |grep conet- 2.根据当前进程号获得端口号&#xff1a; eg: netstat -anp |grep 4118 得到当前的端口是8761

Linux中如何查看某个端口是否被占用的方法

LINUX中如何查看某个端口是否被占用的方法 之前查询端口是否被占用一直搞不明白&#xff0c;现在总结下&#xff1a; 1.netstat -anp |grep 端口号 如下&#xff0c;我以3306为例&#xff0c;netstat -anp |grep 3306&#xff08;此处备注下&#xff0c;我是以普通用户操作&…

深入理解synchronized底层原理

文章目录前言一、synchronized的特性1.1 原子性1.2 可见性1.3 有序性1.4 可重入性二、synchronized的用法三、synchronized锁的实现3.1 同步方法3.2 同步代码块四、synchronized锁的底层实现五、JVM对synchronized的优化5.1 锁膨胀5.1.1 偏向锁5.1.2 轻量级锁5.1.3 重量级锁5.2…

centos7重新加载服务的命令_CentOS7 从查看、启动、停止服务说起systemctl

执行命令“systemctl status 服务名.service”可查看服务的运行状态&#xff0c;其中服务名后的.service 可以省略&#xff0c;这是CenOS7以后采用systemd作为初始化进程后产生的变化。Systemctl是一个systemd工具&#xff0c;主要负责控制systemd系统和服务管理器。Systemd是一…

一体化住户调查_曲麻莱县2020年城乡一体化住户调查表彰会暨年报部署会

为全面推进我县城乡一体化住户调查工作&#xff0c;总结经验、鼓励优秀&#xff0c;提高统计员和辅助调查员的工作积极性&#xff0c;提高账本数据质量&#xff0c;11月25日下午&#xff0c;县统计局组织召开2020年全县城乡一体化住户调查工作表彰会暨年报部署会。全县6个镇的统…