0%
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
Java 编译 class 并运行文件的 main 方法
验证 jvm 参数对 Jar 包中参数值的影响。