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.1 | 2.15.0 → 2.16.0 → 最终推荐 2.17.1 |
| Log4j 2.12.x(Java 7) | 2.0-beta9 ~ 2.12.1 | 2.12.2 → 2.12.3 → 2.12.4 |
| Log4j 2.3.x(Java 6) | 2.0 ~ 2.3 | 2.3.2 |
该漏洞自 2013 年即已存在,潜伏近 8 年未被发现。
3. 关联 CVE 链
| CVE | 描述 | CVSS | 修复版本 |
|---|---|---|---|
| CVE-2021-45046 | 2.15.0 补丁绕过,在特定非默认配置下仍可实现 RCE | 9.0 | 2.16.0 |
| CVE-2021-45105 | 2.17.0 之前的 DoS(无限递归) | 7.5 | 2.17.0 |
| CVE-2021-44832 | 通过 JDBC Appender 的 RCE(可控数据源 URL) | 6.6 | 2.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,它可以:
- 连接外部 LDAP / RMI / DNS 等协议服务器
- 从远端加载并反序列化 Java 对象
- 执行加载对象中的代码
2. 利用链
3. 攻击入口点
- HTTP 请求头:
User-Agent、X-Forwarded-For、Referer、X-Api-Version等 - 表单参数:用户名、搜索关键字、请求体
- API 参数:REST API 路径/查询参数
- 文件元数据:文件名、邮件主题
- 任何被记录到日志的用户可控数据
4. 漏洞代码模式
5. 根本原因
- Log4j 的
StrSubstitutor对${jndi:...}模式未做任何来源验证或协议白名单 - Java 默认信任远程代码库(
trustURLCodebase) - JNDI 支持 LDAP/RMI/DNS 等多种协议,攻击面极大
- 该漏洞无需认证,通过合法日志记录路径绕过所有边界防护
0x03 利用路径与攻击链
1. 最简 PoC
2. 完整利用工具链
| 工具 | 用途 |
|---|---|
| marshalsec | 将恶意 Java 类转为 LDAP/RMI 引用对象 |
| JNDI-Injection-Exploit | 自动化 JNDI 注入利用框架 |
| log4j-shell-poc | 教育用途的完整 PoC 环境 |
| L4sh | Log4Shell 自动化 RCE 工具 |
| log4j-scan | 大规模扫描器 |
3. 混淆变体(绕过 WAF/IDS)
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
2. 网络层指标
| 指标类型 | 具体表现 |
|---|---|
| 出站连接 | 应用服务器向非常规 IP/端口发起 LDAP(1389/389)、RMI(1099)连接 |
| DNS 查询 | 异常的 DNS TXT 记录查询 |
| HTTP 请求 | User-Agent / X-Forwarded-For 等头中包含 ${jndi: 字符串 |
| 文件下载 | 服务器从外部下载 .class 文件 |
3. 主机层指标
- 可疑的子进程(
/bin/sh、bash、powershell)由 Java 进程派生 - 异常的
.class文件出现在临时目录(/tmp/、%TEMP%) - 反弹 shell 连接特征
4. 检测规则示例
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=true | 2.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 的核心危险在于:
- CVSS 满分 10.0,无需认证即可触发 RCE
- 潜伏 8 年未被发现,2013 年引入的 JNDI lookup 功能
- 影响范围极广:数千种产品受影响,包括 Apache 生态、VMware、Minecraft 等
- 利用极其简单:单行 payload 即可触发
- 武器化速度极快:公开后数小时内即出现大规模利用
- 多种混淆变体:可绕过 WAF/IDS 检测
Log4Shell 是互联网历史上影响范围最广的漏洞之一,彻底修复需要升级到 2.17.1+,并配合供应链安全审计与纵深防御策略。