一、背景
因公司漏洞扫描,发现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/
再项目中修改这两个类,修改后的结果,分别见下图所示:
增加标红框的两个方法,然后重新构建打包即可。