项目使用的是 spring-boot-2.2.6.RELEASE,自带 snakeyaml 版本是1.25,存在反序列化漏洞,需要将 snakeyaml 升级至2.0及以上版本,如下:
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>2.2</version>
</dependency>
启动报错一:
java.lang.NoSuchMethodError: org.yaml.snakeyaml.constructor.Constructor: method <init>()V not found
解决方案:
点击查看snakeyaml-2.2-sources.jar中源码可知缺失无参构造方法,可拷贝源码后添加如下红框中代码即可!
其原理就是利用 Java 父子加载器原理覆盖 jar 中类!
启动报错二:
java.lang.NoSuchMethodError: org.yaml.snakeyaml.representer.Representer: method <init>()V not found
解决方案:(其原理同一)
点击查看snakeyaml-2.2-sources.jar源码可知也是缺失无参构造方法,同样可拷贝源码后添加如下红框中代码即可!
这种方案快速有效!另一种办法是升级 spring boot 到 2.7.10及以上版本 ,但升级 spring boot 版本跨度太大,影响范围广,需要额外调整项目框架依赖,谨慎选择!