nacos
1.nacos
1.CVE-2021-29441
1.影响版本
Nacos <= 2.0.0-ALPHA.1
5.CNVD-2023-45001(hessian反序列化漏洞)
1.影响版本
1.4.0 <= Nacos < 1.4.6 使用cluster集群模式运行
2.0.0 <= Nacos < 2.2.3 任意模式启动均受到影响
2.漏洞原理
1.hessian简介
Hessian是一个轻量级的remoting onhttp工具,是一个轻量级的Java序列化/反序列化框架,使用简单的方法提供了RMI的功能。 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。
2.白盒漏洞分析
Hessian序列化/反序列化机制的基本概念图
- AbstractSerializerFactory:抽象序列化器工厂,是管理和维护对应序列化/反序列化机制的工厂,拥有getSerializer()和getDeserializer()方法。默认的几种实现如下:
- SerializerFactory:标准的实现。
- ExtSerializerFactory:可以设置自定义的序列化机制,通过该Factory可以进行扩展。
- BeanSerializerFactory:对SerializerFactory的默认Object的序列化机制进行强制指定,指定为BeanSerializer。
- Serializer:序列化的接口,拥有writeObject()方法。
- Deserializer:反序列化的接口,拥有readObject()、resdMap()、readList()方法。
- AbstractHessianInput:Hessian自定义的输入流,提供对应的read各种类型的方法。
- AbstractHessianOutput:Hessian自定义的输出流,提供对应的write各种类型的方法。
在Hessian的Deserializer中,有以下几种默认实现的反序列化器
1.寻找反序列化的触发点
全局搜索Hessian找到hessian工厂类
并没有调用deserializer接口,那么再别的地方需调用该接口应该会获取默认的Serializer实例或特定的Serializer实例。
例如
// 获取默认的Serializer实例
Serializer defaultSerializer = SerializeFactory.getDefault();
// 使用默认的Serializer实例进行反序列化
byte[] data = ...; // 假设这是你要反序列化的字节数据
Object obj = defaultSerializer.deserialize(data);
// 获取特定类型的Serializer实例
String type = "Hessian";
Serializer serializer = SerializeFactory.getSerializer(type);
// 使用特定类型的Serializer实例进行反序列化
Object obj = serializer.deserialize(data);
所有全局搜索SerializeFactory.getDefault()或SerializeFactory.getSerializer
再找到deserialize,发现主要就是在onApply、onRequest方法会触发serializer.deserialize反序列化
JRaft 用户指南
通过该用户指南可知,客户端的通讯层都依赖 Bolt 的 RpcClient,封装在 CliClientService 接口中,实现类就是 BoltCliClientService 。 可以通过 BoltCliClientService 的 getRpcClient 方法获取底层的 bolt RpcClient 实例,用于其他通讯用途,做到资源复用。
提交的任务最终将会复制应用到所有 raft 节点上的状态机,状态机通过 StateMachine 接口表示,它的主要方法包括:
void onApply(Iterator iter) 最核心的方法,应用任务列表到状态机,任务将按照提交顺序应用。
也就是说会到StateMachine
查看processor的实现类可以看到确实调用了Impl。
这里也有个明显的反序列化
RecoveryAshes Blog