CVE-2019-2729反序列化(unserialize)漏洞学习与分析
文章目录
- 序列化和反序列化
- CVE-2019-2729漏洞分析
- 漏洞背景
- 漏洞成因
- 影响范围
- 漏洞利用细节
- 补丁分析
- 防御措施与实践建议
- 通用防御策略
- 针对Java反序列化的专门防御
- WebLogic特定防护
- 总结与启示
- 参考文章
序列化和反序列化
- 序列化(Serialization)是指将数据结构或对象状态转换为可以存储或传输的格式的过程,通常是二进制字节流,也可以是JSON、XML等文本格式。反序列化(Deserialization)则是将序列化过程中生成的数据恢复为原始数据结构或对象的过程。
- 序列化的主要应用场景包括:对象持久化存储(如保存到文件或数据库)、网络传输对象(如RPC调用)、内存中对象状态保存。
- 在Java环境中,序列化是通过ObjectOutputStream类的writeObject()方法将对象转化为字节流,而反序列化则是通过ObjectInputStream类来实现的。
- 反序列化漏洞的核心问题是:当应用程序反序列化不受信任或恶意构造的数据时,可能导致任意代码执行、敏感信息泄露或拒绝服务攻击。
- 主要安全风险包括:
- 远程代码执行:攻击者可通过构造特殊的序列化数据,在反序列化过程中触发恶意代码
- 敏感数据泄露:序列化过程会暴露对象所有字段,包括私有字段中的敏感信息
- 拒绝服务攻击:精心构造的序列化数据可能导致资源耗尽
CVE-2019-2729漏洞分析
漏洞背景
- CVE-2019-2729是Oracle WebLogic Server中的一个高危反序列化漏洞,CVSS评分为9.8。该漏洞是对CVE-2019-2725补丁的绕过,属于XMLDecoder反序列化漏洞的变种(weblogic 反序列化(CVE-2019-2729)复现原创)。
漏洞成因
- 漏洞存在于WebLogic Server的wls9_async_response.war和wls-wsat.war组件中,攻击者可通过发送精心构造的恶意HTTP请求,在未授权情况下实现远程代码执行(Weblogic反序列化远程代码执行漏洞(CVE-2019-2729))。
漏洞利用链的关键点:
- WebLogic的异步通信服务(_async/AsyncResponseService)接收XML格式的SOAP请求
- XML数据通过WorkContextXmlInputAdapter处理,使用XMLDecoder进行反序列化
- 攻击者可以构造特殊的XML标签绕过补丁检查,执行任意Java代码
影响范围
受影响版本包括:
- Oracle WebLogic Server 10.3.6.0.0
- Oracle WebLogic Server 12.1.3.0.0
- Oracle WebLogic Server 12.2.1.3.0
漏洞利用细节
- CVE-2019-2729是对CVE-2019-2725补丁的绕过。在修复CVE-2019-2725时,Oracle通过黑名单过滤了
<class>
标签,但攻击者发现可以使用<array method="forName">
标签实现相同功能(CVE-2019-2729 Weblogic XMLDecoder反序列化漏洞分析)。
典型的攻击流程:
- 攻击者构造包含恶意XML的SOAP请求
- 请求发送到WebLogic的漏洞端点(如/_async/AsyncResponseService)
- WebLogic解析XML时,XMLDecoder执行恶意代码
- 攻击者获得服务器权限
补丁分析
Oracle最终通过引入白名单机制修复此漏洞:
- 新增validateFormat函数,严格限制可用的XML标签和属性
- 白名单仅允许特定标签和属性,如
<array>
标签只能包含"class"或"length"属性 - 彻底禁止了可能被利用的标签(CVE-2019-2729:使用白名单修复Oracle WebLogic中的RCE漏洞)
防御措施与实践建议
通用防御策略
- 输入验证:对所有反序列化操作进行严格的输入验证
- 使用安全序列化协议:考虑使用Protobuf、Kryo等更安全的序列化方案(常见的序列化协议以及高性能Kryo实战原创)
- 最小权限原则:反序列化操作应运行在最小权限环境中
- 日志监控:记录所有反序列化操作,监控异常行为
针对Java反序列化的专门防御
- 使用JEP290机制:JDK 6u141、7u131和8u121引入了JEP290,可设置反序列化过滤器(使用JEP290防御Java反序列化)
// 示例:设置反序列化过滤器 ObjectInputFilter filter = ObjectInputFilter.Config.createFilter("maxdepth=10;!com.example.*"); ObjectInputFilter.Config.setSerialFilter(filter);
- 更新JDK版本:使用最新JDK版本,包含更多安全增强
- 安全编码实践:
- 避免反序列化不可信数据
- 对必须序列化的敏感字段使用
transient
标记 - 自定义
readObject
方法时要特别小心
WebLogic特定防护
- 应用官方补丁:及时安装Oracle发布的安全补丁
- 删除危险组件:删除wls9_async_response.war和wls-wsat.war文件
- 访问控制:通过防火墙限制对WebLogic管理端口的访问
- 网络隔离:将WebLogic服务器放置在DMZ区域,限制外部访问
总结与启示
- CVE-2019-2729漏洞展示了反序列化漏洞的严重性和复杂性。从防御角度看,黑名单机制往往难以全面防御,而白名单机制更为可靠。开发者应当:
- 充分认识反序列化操作的安全风险
- 优先使用安全的替代方案(如REST API+JSON)
- 保持中间件和JDK的及时更新
- 实施深度防御策略,结合多种安全措施
- 反序列化安全问题在WebLogic中并非孤例,从CVE-2017-3506到CVE-2019-2729,这一系列漏洞提醒我们:安全设计应当从源头开始,而非依赖后期的补丁修复(Remediating an RCE (CVE-2019-2729) in Oracle WebLogic)。
参考文章
- [1] Java 序列化详解
- [2] 深入探讨Java序列化的安全性问题与解决方案
- [3] weblogic 反序列化(CVE-2019-2729)复现原创
- [4] Weblogic反序列化远程代码执行漏洞(CVE-2019-2729)
- [5] CVE-2019-2729 Weblogic XMLDecoder反序列化漏洞分析
- [6] CVE-2019-2729:使用白名单修复Oracle WebLogic中的RCE漏洞
- [7] 常见的序列化协议以及高性能Kryo实战原创
- [8] 使用JEP290防御Java反序列化
- [9] Remediating an RCE (CVE-2019-2729) in Oracle WebLogic