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目录下即可