log4j-core 目前存在命令执行漏洞,具有非常高的风险。若您目前使用的是 log4j 日志框架,或您的项目内有 log4j-core 依赖,且版本在 2.0.0 ~ 2.14.1,建议您及时修复该漏洞。
查看方式
您可以通过以下方式确认您的环境是否需要修复 log4j 漏洞:
查看源码
因为 log4j 可能存在间接依赖的情况,无法从 pom 中确定使用版本,您可以在项目根目录执行如下命令查看 log4j 版本:
mvn compile dependency:tree -Dincludes=org.apache.logging.log4j
查看输出中 log4j 的版本。例如,如下版本就是 2.12.1:
[INFO] org.example:Demo1:jar:1.0-SNAPSHOT [INFO] \- org.apache.logging.log4j:log4j-core:jar:2.12.1:compile [INFO] \- org.apache.logging.log4j:log4j-api:jar:2.12.1:compile
查看服务器上的 Jar 包
您可以查看项目服务器的 Jar 包,确认是否依赖 log4j-core:
ls /home/admin/release/run/target/boot/*/BOOT-INF/lib/ | grep log4j-core
/home/admin/release/run/target/boot/*
为 Jar 包的路径,您需要根据自己项目修改。
修复方案
您可以通过以下任意方式修复 log4j 漏洞,时间充足的情况下,建议您通过升级 log4j-core 版本的方式进行修复。
升级 log4j-core 版本
您可以在最外层 pom 的
dependencyManagement
中增加以下内容:<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>${version}</version> </dependency>
已修复漏洞的版本如下:
说明为解决不同版本的兼容性问题,蚂蚁集团提供如下 nonelookup2 版本,您可以按需就近使用。
2.6.2_nonelookup2
2.7_nonelookup2
2.8_nonelookup2
2.8.1_nonelookup2
2.8.2_nonelookup2
2.9.0_nonelookup2
2.9.1_nonelookup2
2.10.0_nonelookup2
2.11.0_nonelookup2
2.11.1_nonelookup2
2.11.2_nonelookup2
2.12.0_nonelookup2
2.12.1_nonelookup2
2.13.0_nonelookup2
2.13.1_nonelookup2
2.13.2_nonelookup2
2.13.3_nonelookup2
2.14.1_nonelookup2
示例如下:
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.6.2_nonelookup2</version> </dependency>
排除 log4j-core 依赖
如果您没有使用 log4j 日志框架,但依赖了 log4j-core。您可以在查出依赖路径后,在依赖 log4j-core 的
dependency
中增加以下内容:<exclusions> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> </exclusion> </exclusions>
屏蔽出问题的 lookup 功能
如果您使用了
log4j-core 2.10.0
及以上版本,您可以在 Java 启动参数增加-Dlog4j2.formatMsgNoLookups=true
配置,以屏蔽出问题的 lookup 功能。
问题修复确认
依赖确认
确认依赖是否正确,具体操作,请参见 查看方式。
修复效果确认
尝试使用命令打印日志,若打印出来的信息是则符合预期;若为真实日期,则配置未生效。
重要请注意检查日志中是否有使用
${}
,若使用,建议更换其他日志输出格式。