【技术分析】剖析Apache Dubbo 反序列化远程代码执行漏洞(CVE-2023-23638)
2023-3-24 16:49:22 Author: 赛博昆仑CERT(查看原文) 阅读量:67 收藏

-赛博昆仑漏洞技术分析-

Apache Dubbo 反序列化远程代码执行漏洞
(CVE-2023-23638)

前言

3月8日,Apache Dubbo 官方发布漏洞公告,Dubbo泛型调用存在反序列化漏洞,漏洞编号为 CVE-2023-23638。

3月9日,赛博昆仑CERT根据补丁确定了漏洞原理,复现了该漏洞,并发出风险通告,本篇文章记录下漏洞的应急过程。

漏洞分析
    使用官方的例子启动:
https://github.com/apache/dubbo-samples/tree/master/2-advanced/dubbo-samples-generic/dubbo-samples-generic-call/dubbo-samples-generic-call-provider
    看到补丁: 
https://github.com/apache/dubbo/commit/4f664f0a3d338673f4b554230345b89c580bccbb#diff-c9002571855ba4e5eb625b72c81307ed8bf189f5ab757652320cc843738040b7

最新版对传入参数类型是否继承Serializable进行了校验。

根据漏洞描述,dubbo泛型调用存在反序列化漏洞。当使用dubbo的泛型时,会用PojoUtils处理传入的参数。

传入的参数是map类型时,会从里面拿出class ,用SerializeClassChecker检验是否在黑名单内后实例化这个类。然后可以遍历这个传入的map里面的key和value,根据key和value来调用这个类中的任意setter方法,或者当setter方法不存在的时候就可以设置任意field。

这个field会在getField的过程中调用ReflectUtils.makeAccessible(result);设置为Accessible。

因为PojoUtils 中使用SerializeClassChecker来进行黑名单判断,并且通过OPEN_CHECK_CLASS 来判断是否进行黑名单校验

provider会获取静态字段中的 INSTANCE来进行黑名单判断。

可以传入一个自定义的SerializeClassChecker覆盖SerializeClassChecker类中的INSTANCE ,就可以关闭黑名单检验,然后反序列化任意类。

调用过程中会经过hessian的序列化和反序列化,SerializeClassChecker不继承序列化接口,在hessian序列化的过程中会报错,但是反序列化不会校验是否存在序列化接口。可以在exp的项目中重写一个继承Serializable的SerializeClassChecker,再运行发送给provider端。

关闭OPEN_CHECK_CLASS


然后可以不受黑名单限制调用任意setter方法,比如com.sun.rowset.JdbcRowSetImpl。

执行命令:

参考链接

  • https://lists.apache.org/thread/8h6zscfzj482z512d2v5ft63hdhzm0cb
  • https://github.com/apache/dubbo


文章来源: http://mp.weixin.qq.com/s?__biz=MzkxMDQyMTIzMA==&mid=2247484011&idx=1&sn=d6c1b42c567ace706b6eeca2cf04a7f1&chksm=c12affeaf65d76fc0e4a2fbcbabd89047198fade4227a6204346da084f4d1f9541e1296e3927#rd
如有侵权请联系:admin#unsafe.sh