CVE-2021-44228critical
Log4j2 JNDI 注入(Log4Shell)
Log4j2 在 2.14.1 及以前版本会解析日志内容中的 JNDI 查找语法,攻击者可通过任意被记录的外部输入触发远程对象加载。
# CVE-2021-44228 · Log4j2 JNDI 注入
## 基本信息
- 编号:CVE-2021-44228(别名 Log4Shell)
- 组件:Apache Log4j2
- 影响版本:2.0-beta9 至 2.14.1
- 修复版本:2.15.0 起,建议直接升到 2.17.1 或更高
- 严重度:critical
## 问题成因
Log4j2 支持在日志文本里写查找语法,形如 `${jndi:ldap://主机/对象}`。2.14.1 及以前版本会真正解析并加载 JNDI 指向的远程对象。只要日志里出现攻击者可控的字符串,就可能被触发。
## 触发面有多大
任何把外部输入写进日志的位置都是入口:请求头、用户名、搜索词、接口参数、消息内容。所以它不是"某一个接口"的问题,而是"所有记录了该字段的日志"都可能是入口——排查时要按字段维度过一遍,而不是只测几个接口。
## 修复与缓解
1. 升级 Log4j2 到 2.17.1 或更高,并确认依赖树里没有传递引入的旧版本
2. 无法立即升级时,按官方指引从 jar 中移除 JndiLookup 类
3. 出网限制:禁止应用服务器主动访问外网 LDAP / RMI,这是最有效的兜底
4. 全量梳理依赖:直接依赖升了,传递依赖里的旧版照样会被利用
## 常见坑
- 只升了直接依赖,漏掉传递依赖中的旧版 log4j-core
- 检测规则只匹配 jndi 字面量,被混淆写法绕过
- 修复后没有清理历史日志,重放旧日志仍可能触发
## 怎么验证修好了
在测试环境构造一条含查找语法的日志输入,确认不再产生外部连接(可用出网代理或抓包观察)。