Apache Log4j2 远程代码执行漏洞(CNVD-2021-95914)修复

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 功能。

问题修复确认

  • 依赖确认

    确认依赖是否正确,具体操作,请参见 查看方式

  • 修复效果确认

    尝试使用命令命令打印日志,若打印出来的信息是1则符合预期;若为真实日期,则配置未生效。

    重要

    请注意检查日志中是否有使用 ${},若使用,建议更换其他日志输出格式。