显示 / 隐藏 文章目录 ]

nacos

上次更新: 2024-07-06 23:12:00

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序列化/反序列化机制的基本概念图
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工厂类
serializer工厂类
并没有调用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反序列化
onApply
onRequest

JRaft 用户指南
通过该用户指南可知,客户端的通讯层都依赖 Bolt 的 RpcClient,封装在 CliClientService 接口中,实现类就是 BoltCliClientService 。 可以通过 BoltCliClientService 的 getRpcClient 方法获取底层的 bolt RpcClient 实例,用于其他通讯用途,做到资源复用。

提交的任务最终将会复制应用到所有 raft 节点上的状态机,状态机通过 StateMachine 接口表示,它的主要方法包括:

void onApply(Iterator iter) 最核心的方法,应用任务列表到状态机,任务将按照提交顺序应用。

也就是说会到StateMachine
StateMachine

查看processor的实现类可以看到确实调用了Impl。
processor的实现类

这里也有个明显的反序列化

RecoveryAshes Blog