近日,apache log4j2爆出“核弹级”远程代码执行漏洞。公司相关系统也在升级log4j版本。

 

过程中遇到一个问题,本地代码通过maven clean install命令执行后的程序包里已经没有log4j旧版本的依赖了,可是呢,测试环境通过Jenkins构建后,利用log4shell工具扫描程序包,依然存在log4j旧版本。

[root@youfu-server ~]# cd /root/
[root@youfu-server ~]# ./log4shell scan /www/epaysch/tomcat-pctrans-provider-8580/webapps/*/WEB-INF/lib
1:38PM INF identified vulnerable path fileName=org/apache/log4j/net/SocketNode.class path=/www/epaysch/tomcat-pctrans-provider-8580/webapps/pctrans-provider/WEB-INF/lib/log4j-1.2.17.jar versionInfo="log4j 1.2.17"

 

看来,测试环境Jenkins服务器的maven库里某些包可能依赖了log4j旧版本。

于是乎,找运维伙伴将Jenkins任务的build配置由clean install暂时改为dependency:tree,来看看具体是由哪个包造成的。

可是,构建Jenkins任务时,发现报错,提示maven私服上特定版本的某个jar包已经缓存在了本地仓库中(xxx-version.jar was cached in the local repository)。就是说,Maven默认会使用本地缓存的库来编译工程,对于上次下载失败的库,maven会在​​~/.m3/repository/<group>/<artifact>/<version>/​​目录下创建xxx.lastUpdated文件,一旦这个文件存在,那么在直到下一次nexus更新之前都不会更新这个依赖库。

[ERROR] Failed to execute goal on project trans-rpcprovider: Could not resolve dependencies for project com.yft:trans-rpcprovider:war:1.0-SNAPSHOT: Failure to find com.yft:PCOperCommonUtil:jar:1.0-SNAPSHOT in http://192.168.40.196:8081/nexus/content/repositories/snapshots/ was cached in the local repository, resolution will not be reattempted until the update interval of public has elapsed or updates are forced -> [Help 1]
[ERROR]
[ERROR] T...

 

网上给出的解决办法有3个:

  • 删掉本地maven仓库里的缓存文件,m3repository/<group>/<artifact>/<version>/目录下的*.lastUpdated文件。然后重新执行maven命令。
  • 在maven settings.xml文件里,加<updatePolicy>always</updatePolicy>来强制每次都更新依赖库。
  • 加上-U指令来强制刷新本地仓库。

 

我和运维伙伴逐个尝试,前两个方法并没解决问题(也许是操作不当吧)。好事多磨,最终靠第三个方法得以解决,即使用dependency:tree -U命令,最终看到了测试环境程序包的依赖树。