snakeyaml从1.x升级2.x的方案

一、背景

因公司漏洞扫描,发现SnakeYAML 反序列化漏洞(CVE-2022-1471),所以要求对SnakYaml进行升级。

因项目中未直接引用snakyaml包,经分析是springboot引用的这个包。但是在这个项目中,springboot用的版本是2.3.12.RELEASE版本。这个版本引用的snakyaml的版本是1.26版本。

二、修复方案

基于上面的背景,对snakyaml升级有两种方案。

2.1 方案一:直接升级springboot

如果可以直接升级springboot,升级到里面snakyaml里面是2.*版本的一个版本即可。

因为对snakyaml只有2.*版本才没有漏洞。参加下图:

如果想详细查看,请参考如下路径:

 https://mvnrepository.com/artifact/org.yaml/snakeyaml

2.2 方案二:升级snakyaml到2.0

 

但是如果你将springboot低版本的snakyaml排查掉,直接引用新包的话,启动项目会报错。

如下方式:

 

<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>mybatis-plus-boot-starter</artifactId>
	<version>${mybatis-plus.version}</version>
	<exclusions>
		<exclusion>
    		<groupId>org.yaml</groupId>
	    	<artifactId>snakeyaml</artifactId>
		</exclusion>
	</exclusions>
</dependency>

<dependency>
	<groupId>org.yaml</groupId>
	<artifactId>snakeyaml</artifactId>
	<version>2.0</version>
</dependency>

启动项目会报错误,错误信息如下:

java.lang.NoSuchMethodError: org.yaml.snakeyaml.constructor.Constructor: method <init>()V not found
java.lang.NoSuchMethodError: org.yaml.snakeyaml.representer.Representer: method <init>()V not found

报错的原因是:

snakeyaml 2.x版本去掉了Constructor和Representer两个类中的无参构造,但springBootStarter2.7.10以下版本会加载这个无参构造,所以项目启动会失败。

解决方案:

重写这两个类,加上无参构造

原理:Java父子加载器,覆盖maven依赖jar包中的类。

将snakyaml源码下载到本地,修改源码,然后自己打包,项目中引用直接构建的jar即可。

源码下载地址:

https://bitbucket.org/snakeyaml/snakeyaml/src/snakeyaml-2.0/

再项目中修改这两个类,修改后的结果,分别见下图所示:

 增加标红框的两个方法,然后重新构建打包即可。

注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: 中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·本文档为双语同时展示,一行原文、一行译文,可逐行对照,避免了原文/译文来回切换的麻烦; ·有原文可参照,不再担心翻译偏差误导; ·边学技术、边学英语。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

h_and_g

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值