0x0 框架介绍
Apache Dubbo是一款微服务开发框架,它提供了RPC通信与微服务治理两大关键能力。使应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring 框架无缝集成。
0x1 漏洞概述
CVE-2023-23638。由于Apache Dubbo对反序列化安全检查存在缺陷,远程攻击者通过构造恶意数据包进行反序列化攻击,最终可实现在目标系统上执行任意代码,请受影响的用户尽快采取措施进行防护。
0x2 影响范围
受影响范围
- Apache Dubbo 7.x<= 2.7.21
- Apache Dubbo 3.0.x<= 0.13
- Apache Dubbo 3.1.x<= 1.5
0x3 利用思路
本文用到的官方参考链接:
https://github.com/apache/dubbo/commit/6e5c1f8665216ccda4b2eb8c0465882efe62dd61
https://github.com/apache/dubbo/commit/ce3b0e285a463b566a9d685049201bfaf526c8ac
https://github.com/apache/dubbo/commit/4f664f0a3d338673f4b554230345b89c580bccbb
对比下 commit 可以发现它增加了对 Seralizable 接口的检查, 在 >= 3.1.6 版本中这个选项默认是开启的, 也就是阻止了非 Serializable 接口实现类的序列化与反序列化
https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/security/class-check/
然后参考 Apache mailist 的内容可以发现漏洞点是 Generic Invoke
, 也就是泛化调用
https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/service/generic-reference/
简单来说, 泛化调用可以使我们不依赖具体的接口 API, 就可以调用对应 Service 的某个方法
官方 samples 如下
https://github.com/apache/dubbo-samples/tree/master/2-advanced/dubbo-samples-generic
以 3.1.5 版本为例
HelloService.java
HelloServiceImpl.java
DemoConsumer.java
DemoProvider.java
参考 commit 里面更改的内容, 关注 org.apache.dubbo.common.utils.PojoUtils#realize0
方法
如果 pojo 属于 Map 类型, 就会将其中 class
键对应的内容取出来作为 className, 先通过 SerializeClassChecker 的 validateClass 进行过滤, 然后传入 forName 方法加载类
getInstance 方法
然后注意对 INSTANCE 属性的定义
很经典的单例模式
validateClass 方法
篇幅原因我们下一篇继续跟大家来分享。
原文始发于微信公众号(小白嘿课):Apache Dubbo CVE-2023-23638反序列化漏洞利用分析(一)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论