pom升级Spring至5.2.22后仍报CVE-2022-22965漏洞如何排查修复
CVE-2022-22965(SpringShell)排查步骤
你指定的Spring Framework 5.2.22已经修复了该漏洞,告警的核心原因是依赖版本冲突导致低版本spring-beans被实际加载,或者扫描工具识别到了未被清理的旧版本残留。按以下顺序排查:
- 执行带过滤参数的Maven依赖树命令,精准定位
spring-beans的引入路径:
普通无参数的mvn dependency:tree -Dincludes=org.springframework:spring-beansmvn dependency:tree输出内容过多,很容易漏掉冲突项,加includes参数后只会输出所有引入spring-beans的依赖链路,能直接看到是哪个依赖拉取了5.2.0版本。 - 检查实际打包产物中的jar版本,不要只依赖pom解析结果:
打war包的话,解压后进入WEB-INF/lib目录查看spring-beans-*.jar的版本号;打可执行jar包的话,解压后进入BOOT-INF/lib目录查看对应jar版本。本地IDE依赖解析、Maven仲裁结果和实际打包内容不一致是很常见的情况,很多时候你以为引用了5.2.22,实际包里被塞入了旧版本。 - 重点核查你pom中显式声明的低版本组件:
你当前pom里存在大量版本不兼容的显式依赖,是导致版本冲突的核心来源:- 显式指定的
spring-orm 4.3.2.RELEASE属于Spring Framework 4.x系列,会传递引入同版本的spring-beans、spring-core等核心包,和你指定的5.2.22直接冲突 - Spring Security组件版本混乱:5.7.2、5.1.6.RELEASE、5.0.0.RELEASE多个版本共存,5.1.x、5.0.x系列的Spring Security默认依赖的Spring Framework版本就是5.2.0左右的早期版本,会传递引入低版本spring-beans
- 引入的
okta-spring-security-parent 0.1.0是2018年发布的早期版本,其pom中固化的Spring依赖版本就是5.2.0,很容易因为Maven依赖仲裁的就近原则、最先声明原则覆盖你指定的5.2.22版本
- 显式指定的
- 如果依赖树和打包产物中
spring-beans版本确实是5.2.22,属于扫描工具误判:部分扫描工具仅识别pom中显式声明的版本,不会识别版本覆盖规则,或者把本地Maven缓存中的旧版本残留识别为项目依赖,执行mvn clean install -U清理更新依赖后重新扫描即可。
修复方案
- 第一步:在pom的
dependencyManagement节点中统一锁定所有Spring Framework核心组件(spring-beans、spring-core、spring-context、spring-web、spring-orm、spring-aop等所有org.springframeworkgroupId下的包)版本为5.2.22,删掉你单独给spring-orm指定的4.3.2.RELEASE版本。4.3.x和5.2.x版本API不兼容,混跑不仅有安全问题,还会触发运行时类不存在、方法签名不匹配的异常;且Spring 4.3.x早已停止维护,没有CVE-2022-22965的修复补丁,不建议降级使用。 - 第二步:统一所有Spring Security组件版本,将所有
spring-security-*开头的依赖版本统一为5.7.2,删掉单独给spring-security-web、spring-security-config、spring-security-oauth2-client、spring-security-oauth2-jose、spring-security-taglibs指定的老版本号。Spring Security 5.7.x系列原生兼容Spring Framework 5.2.x,不会传递引入不匹配的低版本Spring组件。 - 第三步:升级
okta-spring-security-parent到兼容Spring Security 5.7.x的版本,避免父pom中固化的旧版本依赖干扰仲裁结果。如果有其他第三方依赖必须保留且传递引入了低版本spring-beans,在对应依赖节点中添加exclusion排除org.springframework:spring-beans,强制使用你锁定的5.2.22版本。 - 第四步:修复后验证:重新执行带过滤参数的依赖树命令,确认所有链路引入的spring-beans版本都是5.2.22;解压打包产物确认lib目录下的spring-beans jar版本正确,再重新执行漏洞扫描即可消除告警。
注意:CVE-2022-22965的利用条件包含JDK9及以上版本,你当前使用的Java 11属于受影响范围,不要通过降级JDK的方式规避漏洞。
内容的提问来源于stack exchange,提问作者anonymous
相关产品推荐
相关产品推荐

