snakeyaml1.x升级2.x,修复漏洞
1.背景
在工作中,经常会有漏洞扫描,有一次看到了snakeyaml的漏洞:
 
项目框架:springBoot
 版本:2.2.6.RELEASE
snakeyaml 中央仓库信息
snakeyaml中央仓库地址:https://mvnrepository.com/artifact/org.yaml/snakeyaml
目前中央仓库显示,1.x版本全有漏洞警告,可用版本只有2.x
 
3.修复漏洞:
修复方式如下: (此方法仅限springBoot 2.7.10及以上版本使用)
 
            <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>
 
如果你的SpringBootStarter版本在2.7.10以下,请继续看完下面内容
2.7.10版本以下的项目,仅做此排除和重新引入2.x依赖操作,那么项目会启动失败,你会得到以下两种启动报错:
报错一:
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
 
4.启动报错的原因:
snakeyaml 2.x版本去掉了Constructor和Representer两个类中的无参构造,但springBootStarter2.7.10以下版本会加载这个无参构造,所以项目启动会失败
 
5.解决办法:
1.升级springboot-starter至2.7.10及以上 (springBoot版本升级,考虑整个项目的影响,慎重)
2.重写这两个类,加上无参构造(本文解决方案)
原理:Java父子加载器,覆盖maven依赖jar包中的类。
若idea无法下载源码,参考以下github地址
snakeyaml源码gitHub参考地址:
https://github.com/snakeyaml/snakeyaml/blob/master/src/main/java/org/yaml/snakeyaml/representer/Representer.java
 
1.在src目录下按这两个类的路径建包,复制这两个类源代码,增加无参构造
 
 
做完此重写操作,即可修复升级2.x后不能启动的问题。
ps: 查看maven 依赖树结构命令
 在idea命令窗口,执行: mvn dependency:tree
 
本文绑定附件:org.zip 。直接将org.zip解压,放在src目录下即可



















![LeetCode 刷题 [C++] 第121题.买卖股票的最佳时机](https://img-blog.csdnimg.cn/direct/b9e8f88aa84e4542a8802a1c421fe21b.png)