一、背景
因公司漏洞掃描,發現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/
再項目中修改這兩個類,修改后的結果,分別見下圖所示:
?增加標紅框的兩個方法,然后重新構建打包即可。