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/

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

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

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

h_and_g

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

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

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

打赏作者

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

抵扣说明:

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

余额充值