Apache Log4j2 安全漏洞修复及验证

问题链接

https://logging.apache.org/log4j/2.x/security.html

影响版本

受影响的版本:所有 log4j-core 版本 >=2.0-beta9 和 <=2.14.1

问题描述

Apache Log4j <=2.14.1 在配置、日志消息和参数中使用的 JNDI 功能不能防止攻击者控制的 LDAP 和其他 JNDI 相关端点。当启用消息查找替换时,可以控制日志消息或日志消息参数的攻击者可以执行从 LDAP 服务器加载的任意代码。从 log4j 2.15.0 开始,默认情况下已禁用此行为。

问题解决

可以将 log4j2 升级到 2.15.0 版本,修复解决该问题。

对于其他版本:

  • 对于 >= 2.10 的版本,这种行为可以通过设定任一减轻系统属性 log4j2.formatMsgNoLookups 或环境变量 LOG4J_FORMAT_MSG_NO_LOOKUPS=true
  • 对于 >=2.7 和 <=2.14.1 的版本,PatternLayout 可以修改所有模式以将消息转换器指定为 ,%m{nolookups} 而不仅仅是 %m
  • 对于 >= 2.0-beta9 和 <= 2.10.0 的版本,可以去除 JndiLookup 从类路径类:zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

初步验证

Java 文件

Log4jCoreTest.java 文件:

import org.apache.logging.log4j.core.util.Constants;

public class Log4jCoreTest {

    public static void main(String[] args) {
            boolean value = Constants.FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS;
            System.out.println("value is:"+value);
    }
}

依赖 Jar 放入 lib 文件夹下:

$ ls
lib  Log4jCoreTest.class  Log4jCoreTest.java

$ ls lib/
log4j-api-2.13.3.jar  log4j-core-2.13.3.jar

编译 Java 文件

javac -encoding UTF-8 -classpath lib/log4j-core-2.13.3.jar Log4jCoreTest.java

运行 Java 文件

java -classpath .:./lib/*   Log4jCoreTest

加参数解决

$ java -classpath .:./lib/*   Log4jCoreTest
value is:false

$ java -classpath .:./lib/*  -Dlog4j2.formatMsgNoLookups=true  Log4jCoreTest
value is:true

环境变量解决

$ LOG4J_FORMAT_MSG_NO_LOOKUPS=false
$ java -classpath .:./lib/*   Log4jCoreTest
value is:false

$ LOG4J_FORMAT_MSG_NO_LOOKUPS=true
$ java -classpath .:./lib/*   Log4jCoreTest
value is:true

$ LOG4J_FORMAT_MSG_NO_LOOKUPS=false
$ java -classpath .:./lib/*   Log4jCoreTest
value is:false

修改环境变量:

$ vi .bash_profile
export LOG4J_FORMAT_MSG_NO_LOOKUPS=true

$ source .bash_profile

环境变量参考:

  • 官网
  • GitHub 代码提交
  • GitDoc

升级 Jar 版本为 2.15.0+

$ ls lib/
log4j-api-2.15.0.jar  log4j-core-2.15.0.jar

$ java -classpath .:./lib/*   Log4jCoreTest
value is:true