WebLogic组件介绍
WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。
将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。WebLogic是商业市场上主要的Java(J2EE)应用服务器软件(application server)之一,是世界上第一个成功商业化的J2EE应用服务器,具有可扩展性,快速开发,灵活,可靠性等优势。
漏洞描述
CVE-2019-2729漏洞是对CVE-2019-2725漏洞补丁进行绕过,形成新的漏洞利用方式,属于CVE-2019-2725漏洞的变形绕过。与CVE-2019-2725漏洞相似,CVE-2019-2729漏洞是由于应用在处理反序列化输入信息时存在缺陷,攻击者可以通过发送精心构造的恶意HTTP请求,用于获得目标服务器的权限,并在未授权的情况下执行远程命令,最终获取服务器的权限。针对此漏洞,官方已经发布补丁,所以强烈建议受到影响的用户尽快下载官方最新补丁,以防服务器处于高风险之中。
CVE-2019-2725和CVE-2019-2729漏洞的根源分析
WebLogic服务器的上下文传播使其可能在支持的协议中携带应用环境信息。信息是通过XML序列化Java对象来实现的。默认情况下,下面的URL会通过SOAP请求来接收上下文环境信息:
/_async/* /wls-wsat/*
序列号XML数据包含在SOAP请求的<work:WorkContext>标签中。WorkContext信息的反序列化是在WorkContextXmlInputAdapter类中实现的,如图1所示。
图1. WorkContext信息实现反序列化的WorkContextXmlInputAdapter类
如上图所示,XMLDecoder 类用来反序列化上下文信息。XMLDecoder类是一个本不应该用于非可信输入的类。其他研究表明,该类允许任意方法和constructor对任意类型的调用。考虑到使用XMLDecoder的风险以及作为修复CVE-2017-3506漏洞的方法,在WorkContextXmlInputAdapter 中加入了一个validate() 函数来在反序列化之前过滤恶意标签。
在CVE-2019-2725漏洞中,漏洞之前的validate() 函数如图2所示。
图2. CVE-2019-2725漏洞之前的validate() 函数
从上面可以看出,许多需要RCE的标签都被加入黑名单了。
但没有考虑到标签,允许攻击者用任意constructor参数来初始化任意类。这样就可以有多种方法来完成任意代码执行。比如,初始化对象UnitOfWorkChangeSet,就可以接收字节数组作为constructor参数。
图3. UnitOfWorkChangeSet 反序列化字节数组的代码段
如图3所示, UnitOfWorkChangeSet 会在初始化后反序列号字节数组。含有伪造的恶意序列化对象的字节数组就可以用来完成任意代码执行。图4所示的python脚本就可以用来生成攻击流量。
图4. 可以生成攻击流量的Python poc代码
因为<class> 标签是漏洞利用所必须的,因此Oracle在CVE-2019-2725补丁中将该标签加入了黑名单。
图5. 将<class>标签加入黑名单来修复CVE-2019-2725漏洞
CVE-2019-2729: CVE-2019-2725绕过
从另一方面看,绕过CVE-2019-2725补丁其实并不复杂。对JDK 1.6来说,<class>标签的功能会被标签<array method=”forName”>所替代。因此,使用标签<array method=”forName”>替换<class>标签就可以绕过黑名单。
图6. 绕过<class>标签黑名单的<array method=”forName”> 标签
Oracle目前也发布了CVE-2019-2729漏洞的补丁,但Oracle使用的是白名单而不是黑名单方法。这是通过新引入的validateFormat() 函数和WorkContextFormatInfo中定义的白名单规则来实现的。
图7. 用来修复CVE-2019-2729漏洞的白名单代码段
如图7所示,白名单中仍然是允许<array> 标签的,但只允许含有byte值的class属性或含有任意值的length属性。
最佳实践
总的来说,使用白名单机制来拦截恶意内容要比使用黑名单更加有效,尤其是在可能引入安全问题的绕过上。研究人员建议系统管理员、开发人员和IT安全团队使用以下最佳安全实践:
·使用Oracle紧急补丁升级到没有漏洞的最新版本;
· 删除war 和wls-wsat.war,然后重启WebLogic服务来预防对有漏洞的组件的访问;
· 限制对受影响的通信端口的访问;
· 通过入侵检测系统来监控、检测和拦截恶意流量;
· 使用多种安全机制。