技术研究 | Dubbo反序列化漏洞分析 (CVE-2020-1948)
Apache Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,近日,华云安-安全实验室监测到网络上出现Apache Dubbo反序列化漏洞,并进行了复现和分析。
漏洞存在于Apache dubbo默认使用的反序列化工具hessian,服务消费者发送请求给服务的提供者,服务提供者会将消费者提供的参数反序列化,在反序列化的过程中,由于这些参数存在一些恶意请求,或者是恶意代码,导致了反序列化漏洞的发生。
服务消费者发送消息服务提供者接受消息,在org.apache.dubbo.remoting.
ChannelHandler接口提供接口方法received(),如下图所示:
org.apache.dubbo.remoting.transport.ChannelHandlerDelegate接口继承
ChannelHandler接口,如下图所示:
org.apache.dubbo.remoting.transport.AbstractChannelHandlerDelegate
抽象类实现ChannelHandlerDelegate接口并重写received方法,如下图所示的received方法:
org.apache.dubbo.remoting.transport.DecodeHandler
类继承了AbstractChannelHandlerDelegate类,并在received方法中对request请求参数进行了解码处理,如下图所示received方法:
进入decode方法,如下图所示:
接着进入
org.apache.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation类蓝色行所示的decode方法,有debug可以看到对参数的处理是用hessian2进行了反序列化,如下图所示:
接着跟踪到decode方法的第139行,如下图所示:
继续进入
com.alibaba.com.caucho.hessian.io.Hessian2Input.readObject方法内部,如下图所示:
继续跟踪到readObject方法的第2703行,如下图所示:
进入
com.alibaba.com.caucho.hessian.ioMapDeserializer.readMap方法中对参数进行了更详细的处理,如下图所示:
继续跟进到doReadMap方法,到第126行,如下图所示:
进入doReadMap方法,如下图所示:
map.put方法会触发
com.rometools.rome.feed.impl.EqualsBean中的hashCode方法,如下图所示:
进入beanHashCode方法,如下图所示:
进入com.rometools.rome.feed.impl.ToStringBean类的toString方法,如下图所示:
进入到toString方法,跟踪到第129行,如下图所示:
进入129行处的toString方法,如下图所示:
继续跟踪到第152行,第152行通过字节码获取到代码的字节码对象的所有属性和方法,下图所示是第152行代码:
通过debug可以看到的字节码对象,如下图所示:
获取到字节码对象的所有属性和方法后执行toString方法的第158行代码,getter.invoke方法会通过反射实例化对象属性和方法,如下图所示的第158行代码:
当实例化类的方式是getDatabaseMetaData时,进入com.sun.rowset.
JdbcRowSetImpl.getDatabaseMetaData方法,
如下图所示的getDatabaseMetaData方法:
继续跟踪进入connect方法,如下图所示:
继续跟踪,进入lookup方法,lookup方法通过加载ladp协议,加载远程的恶意代码,最终导致了反序列化漏洞的产生。
在服务提供者模块中加入jar包坐标,如下图所示:
在服务消费者模块的启动类DubboAutoConfigurationConsumerBootstrap
中加入漏洞利用函数getPayload,如下图所示:
在两个服务共同调用的接口中添加commonTest方法,如下图所示:
服务提供者接口实现commonTest接口,如下图所示:
服务消费者启动类中,调用commonTest函数,并且将getpayload函数的返回结果传入commonTest的方法入参中,如下图所示:
启动服务消费者向服务提供者发送消息,用wireshark抓取服务消费者向服务提供者发送的数据包,如下图所示:
服务消费者发送序列化参数中包含了指向恶意代码的参数,如下图所示:
exploit类中包含恶意代码,expolit类如下图所示:
构建poc脚本,触发服务端加载客户端的构造的脚本,poc脚本如下图所示:
运行命令如下图所示:
运行结果如下图所示:
如果系统开启了dubbo端口(如127.0.0.1:12345),攻击者使用python模拟dubbo通信协议发送rpc请求,数据包含带有无法识别的服务名称service_name或方法名称method_name,及恶意参数(JdbcRowSetImpl等),在反序列化这些恶意参数时便会触发JNDI注入,导致执行任意恶意代码。
修复建议:
漏洞被利用的类在rome-{version}.jar包中,公网服务可以考虑自查是否引用了rome-{version}.jar包,如果引用了可以考虑重写toString()方法,重新编译并加载到生产环境。
END
华云安介绍
公司在网络空间威胁治理、漏洞管理、攻防渗透方面具备深厚的技术积累,推出了华云安新一代自适应网络安全威胁与漏洞管理平台,面向网络空间安全领域,基于知识图谱的下一代人工智能引擎,形成自动化的漏洞挖掘、分析、利用、修复与感知能力,进行持续的风险检测和威胁防御,实现漏洞检测、分析、响应的自动化。
“以攻促防,攻防兼备”是公司的核心理念。公司具有一流的网络安全攻防团队,以及漏洞管理、自动化渗透等网络安全产品,提供集网络安全情报能力、防御能力、反制能力于一体的新一代自适应网络安全威胁检测与防御平台。主要服务于国家机构及金融、能源、教育、医疗等关键信息基础设施行业。