近日,有部分安全厂商报告Dubbo应用默认使用的hessian2序列化方式存在一个CVE-2020-1948的Java反序列化安全漏洞,给用户带来了一定的困扰,这里对该安全漏洞进行说明并提供修复和安全加固方案。
漏洞描述
攻击者利用com.caucho.hessian.io.Hessian2Output序列化入口,改造已有rome、quercus、xbean、xbean2等gadgets,其他可利用的gadgets请参见marshalsec和ysoserial这两个项目。在Dubbo服务提供者应用中使用了rome、quercus、xbean-naming等依赖包的情况下,构造payload并通过JNDI注入ldap或者rmi的方式连接Dubbo服务提供者应用默认的服务端口20880, 让Dubbo服务提供者应用去连接并执行远程的恶意代码,从而构成远程执行代码攻击。
Dubbo官方有关此漏洞的说明请参见[CVE-2020-1948] Apache Dubbo Provider default deserialization cause RCE。
影响版本
- Dubbo 2.7.0 to 2.7.6
- Dubbo 2.6.0 to 2.6.7
- Dubbo all 2.5.x versions(已不再更新维护)
漏洞分析
通过对攻击者对Hessian2序列化方式的研究、Payload构造过程的分析,要想利用该漏洞需要满足以下条件:
- Dubbo服务端应用引入了com.rometools:rome:1.7.0或com.caucho:quercus:4.0.45等不安全的rome、quercus等第三方类库版本。
- JDK版本低于7u201或者低于8u191(存在RMI或者LDAP这种JNDI注入方式),JDK相关RCE漏洞利用方式及受影响的版本:
- 通过RMI协议加载远程RMI Registry上的恶意对象,受影响的JDK版本:低于6u45或者低于7u21。
- RMI + JNDI注入,受影响的JDK版本:低于6u132、低于7u122或低于8u113。
- LDAP + JNDI注入,受影响的JDK版本:低于6u211、低于7u201、低于8u191或11u1。
- Dubbo服务端应用部署的ECS或者Pod所在的Node的安全组向公网开放了20880的服务端口。
可以看出,需要满足多个条件才能完成攻击利用,另外对于部署到EDAS的Dubbo、Spring Cloud、HSF微服务应用,EDAS后端的注册中心、服务端应用默认都打开了鉴权,默认禁止了不安全的服务注册、订阅和调用。另外,应用默认都在VPC网络中(天然网络隔离,在未挂载公网IP且明确开放给公网连接的情况下,攻击者从公网环境不能轻易连接到VPC网络环境部署的Dubbo应用的服务端口)。
解决方案
- 检查Dubbo应用中是否使用到了rome、quercus等(查看上面两个Github项目中的gadgets )第三方包,如果用到,请升级到高于上面批露的或者最新版本(注意测试兼容性,务必先在测试环境测试业务功能正常后,再在生产环境升级);
- JDK要升级到7u201+ 或者8u191+ 版本(只要在近1年有过部署的应用,EDAS在每次应用部署时都会自动更新JDK的版本。
重要 使用Docker镜像部署的容器服务集群中的应用无法自动更新JDK版本。
- 检查Dubbo应用所使用到的ECS或者Pod对应的Node的安全组,不要添加向公网开放20880的服务端口的规则。该端口默认未开放,公网默认无法连接到此端口,如果业务实际有需要,请对20880服务端口的源IP、IP段和安全组进行严格的审查,以免出现不安全的连接,禁止使用0.0.0.0/0的授权对象。
- 升级Dubbo包到2.7.7+ 版本。
重要 请测试应用功能,务必保证在测试环境测试业务功能正常后,再在生产环境升级。