CVE-2019-2729:使用白名单修复Oracle WebLogic中的RCE漏洞
字数 1663 2025-08-27 12:33:30
Oracle WebLogic CVE-2019-2729漏洞分析与防护指南
漏洞概述
CVE-2019-2729是Oracle WebLogic服务器中的一个关键远程代码执行(RCE)漏洞,CVSS评分为9.8分。该漏洞是CVE-2019-2725的绕过变种,而这两个漏洞又都源于2017年首次发现的CVE-2017-3506漏洞。这一系列漏洞的根本原因在于WebLogic对XML反序列化的不安全处理。
漏洞技术细节
漏洞背景
WebLogic服务器中的上下文传播功能允许在支持的协议中携带应用程序上下文信息,这些信息通过XML序列化的Java对象传递。默认情况下,以下URL通过SOAP请求接受上下文信息:
/_async/*
/wls-wsat/*
根本原因
-
反序列化机制:
- 序列化的XML数据包含在SOAP请求的
<work:WorkContext>标签中 - 反序列化在
WorkContextXmlInputAdapter类中实现,使用XMLDecoder类处理
- 序列化的XML数据包含在SOAP请求的
-
安全缺陷:
XMLDecoder类不应与不受信任的输入一起使用,它允许对任意类型进行任意方法和构造函数调用- 作为CVE-2017-3506的修补措施,Oracle添加了
validate()函数来过滤恶意标签
CVE-2019-2725漏洞
-
漏洞利用:
validate()函数使用了黑名单机制,但遗漏了<class>标签- 攻击者可以使用
<class>标签启动任意类的构造函数 - 特别可以利用
UnitOfWorkChangeSet类,它接受字节数组作为构造函数参数并进行反序列化
-
补丁措施:
- Oracle将
<class>标签加入黑名单
- Oracle将
CVE-2019-2729绕过
-
绕过技术:
- 在JDK 1.6环境下,使用
<array method="forName">标签替代<class>标签 - 这种替换方式完全绕过了基于黑名单的防护机制
- 在JDK 1.6环境下,使用
-
最终修复方案:
- Oracle改用白名单机制,通过
validateFormat()函数实现 - 白名单规则定义在
WorkContextFormatInfo中:- 允许
<array>标签,但仅限包含:- 带有"byte"值的"class"属性
- 或带有任何值的"length"属性
- 允许
- Oracle改用白名单机制,通过
影响版本
- 默认情况下,WebLogic版本10.3.6随JDK 1.6一起发布,这些系统特别容易受到攻击
- 需要Java Development Kit (JDK) 1.6环境
防护措施
紧急缓解方案
-
官方补丁:
- 立即应用Oracle在2019年6月18日发布的带外安全补丁
-
临时防护:
- 删除
war和wls-wsat.war文件,阻止访问易受攻击的组件 - 删除后重启WebLogic服务
- 删除
-
网络控制:
- 限制受影响通信端口的访问,仅允许受信任的主机
长期防护策略
-
监控与检测:
- 部署入侵防御系统(IPS),主动监控、检测和阻止恶意流量
-
多层防御:
- 实施虚拟补丁技术,防护已知和未知漏洞
- 部署应用程序控制,防止未经授权或可疑的应用程序执行
-
安全开发实践:
- 使用白名单而非黑名单进行输入验证
- 避免使用
XMLDecoder处理不受信任的输入
技术启示
-
黑名单的局限性:
- 黑名单方式容易被绕过,如本例中通过功能等效的标签实现绕过
- 验证机制应考虑所有可能的变体和替代方案
-
白名单的优势:
- 白名单方式更安全,只允许已知安全的模式和结构
- 即使存在未发现的变体,也不会被允许执行
-
反序列化风险:
- 反序列化操作本质上是危险的,特别是当涉及任意类加载和方法调用时
- 应尽量避免或严格限制反序列化操作的范围
总结
CVE-2019-2729漏洞展示了黑名单防护机制的固有缺陷,以及通过功能等效方式绕过防护的可能性。Oracle最终采用的白名单解决方案提供了更可靠的防护。此案例强调了在安全设计中优先使用白名单原则的重要性,以及及时应用安全补丁的必要性。对于关键业务系统,还应部署深度防御策略,结合补丁管理、网络隔离和行为监控等多种防护手段。