Apache mina CVE-2024-52046漏洞分析复现
字数 1335 2025-08-22 12:22:54
Apache MINA CVE-2024-52046漏洞分析与复现教学文档
1. 漏洞概述
CVE-2024-52046是Apache MINA框架中的一个反序列化漏洞,影响以下版本:
- Apache MINA 2.0.X < 2.0.27
- Apache MINA 2.1.X < 2.1.10
- Apache MINA 2.2.X < 2.2.4
触发条件:应用程序使用IoBuffer#getObject()方法,并通过ProtocolCodecFilter和ObjectSerializationCodecFactory进行数据处理时。
2. 漏洞原理
该漏洞源于MINA框架在反序列化过程中缺乏对反序列化类的有效限制。当使用ObjectSerializationCodecFactory作为编解码器时,攻击者可以发送恶意的序列化对象,服务器端会自动进行反序列化,可能导致远程代码执行。
3. 环境搭建
3.1 服务端代码 (MinaServer.java)
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.session.IdleStatus;
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 {
IoAcceptor acceptor = new NioSocketAcceptor();
// 设置处理器
acceptor.setHandler(new ServerHandler());
// 设置编解码器 - 漏洞关键点
acceptor.getFilterChain().addLast("codec",
new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
// 绑定端口
acceptor.bind(new InetSocketAddress(8080));
System.out.println("Server started at port 8080");
}
}
class ServerHandler extends org.apache.mina.core.service.IoHandlerAdapter {
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
System.out.println("Received message: " + message);
// 回复消息
session.write("Echo: " + message);
}
@Override
public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
cause.printStackTrace();
}
}
3.2 客户端代码 (MinaClient.java)
package org.apache.mina;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoConnector;
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) throws Exception {
IoConnector connector = new NioSocketConnector();
// 设置处理器
connector.setHandler(new ClientHandler());
// 设置编解码器 - 与服务器端匹配
connector.getFilterChain().addLast("codec",
new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
// 连接到服务器
ConnectFuture future = connector.connect(new InetSocketAddress("localhost", 8080));
future.awaitUninterruptibly();
IoSession session = future.getSession();
session.write(<恶意Object>); // 此处发送恶意序列化对象
// 等待关闭连接
session.getCloseFuture().awaitUninterruptibly();
connector.dispose();
}
}
class ClientHandler extends org.apache.mina.core.service.IoHandlerAdapter {
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
System.out.println("Client received message: " + message);
}
@Override
public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
cause.printStackTrace();
}
}
4. 漏洞分析
4.1 漏洞触发流程
- 客户端通过
ObjectSerializationCodecFactory将恶意对象序列化并发送 - 服务器端使用相同的编解码器接收数据
- 在
ObjectSerializationDecoder#doDecode方法中调用getObject AbstractIoBuffer#getObject执行反序列化操作- 恶意对象被反序列化,可能导致任意代码执行
4.2 关键代码点
ObjectSerializationCodecFactory: 创建用于序列化和反序列化的编解码器ProtocolCodecFilter: 将编解码器添加到过滤器链中IoBuffer#getObject(): 实际执行反序列化的方法
5. 漏洞复现步骤
- 编译并启动MinaServer
- 编译MinaClient,构造恶意序列化对象替换
<恶意Object>占位符 - 运行MinaClient向服务器发送恶意序列化数据
- 观察服务器端是否执行了恶意代码
6. 修复方案
Apache MINA在以下版本中修复了该漏洞:
- 2.0.27
- 2.1.10
- 2.2.4
修复方式:在ObjectSerializationDecoder中增加了类白名单机制,默认拒绝所有类的反序列化,需要手动设置允许的类。
6.1 安全配置示例
ObjectSerializationCodecFactory codecFactory = new ObjectSerializationCodecFactory();
codecFactory.setDecoderMaxObjectSize(Integer.MAX_VALUE); // 设置最大对象大小
// 设置允许的类
codecFactory.setAllowedClasses(new String[] {
"java.lang.String",
"java.util.ArrayList",
// 其他允许的类
});
acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(codecFactory));
7. 防御建议
- 升级到修复版本
- 如果无法立即升级,应限制反序列化的类:
- 使用
setAllowedClasses方法明确指定允许的类 - 避免使用
ObjectSerializationCodecFactory,改用其他安全的编解码方式
- 使用
- 在网络边界过滤包含Java序列化数据的流量
8. 总结
CVE-2024-52046是一个典型的Java反序列化漏洞,其根本原因是缺乏对反序列化类的有效限制。开发人员在使用MINA框架时应当:
- 始终使用最新版本
- 谨慎使用对象序列化功能
- 实施最小权限原则,只允许必要的类进行反序列化
- 考虑使用JSON等更安全的序列化格式替代Java原生序列化