转载

CVE-2019-2729 Weblogic XMLDecoder反序列化漏洞分析

漏洞分析

该漏洞是 CVE-2019-2725 的绕过,因此前面的流程都是一样的,经过21个 handler 处理,最终进入 WorkAreaHeader

CVE-2019-2729 Weblogic XMLDecoder反序列化漏洞分析

在4月份 oracle 对2725紧急补丁中,过滤了 class 元素,因此不能再通过 class 创建对象

CVE-2019-2729 Weblogic XMLDecoder反序列化漏洞分析

这次的绕过实际上就是找到另外的元素代替 class 进而绕过补丁。

在 jdk7 中解析 xml 时获取 element 元素的相关类为 com.sun.beans.decoder.DocumentHandler

当传入 array 标签,进入 ArrayElementHandler ,为 array 元素添加属性时,只能从 length , class , id 中选择,唯一能创建类的 class 已经加入了黑名单,所以在 jdk1.7 下不受此漏洞影响,这次的绕过出现在低于 jdk1.7 的 java 版本上。

weblogic 10.3.6.0 自带的 jdk 版本为1.6, jdk1.6 中解析xml时有很大的不同,相关处理方法在 com.sun.beans.ObjectHandler

解析时首先进入的是 startElement 方法

该方法首先获取元素的属性并创建一个 hashmap ,当元素含有属性时,会根据属性值进行类/属性/方法的相关操作,当元素没有属性时,调用的是 new 方法,例如解析 <java> 、 <void> 时。而此时如果传入了 method 值就会把方法名设置为该值。

CVE-2019-2729 Weblogic XMLDecoder反序列化漏洞分析

随后把方法名设置为我们传入的值,最终通过 forName 找到指定的类

CVE-2019-2729 Weblogic XMLDecoder反序列化漏洞分析

CVE-2019-2729 Weblogic XMLDecoder反序列化漏洞分析

之后的流程就和2725一样的了

CVE-2019-2729 Weblogic XMLDecoder反序列化漏洞分析

进入 WorkContextXmlInputAdapter:readUTF() 后的调用栈

CVE-2019-2729 Weblogic XMLDecoder反序列化漏洞分析

补丁分析

6月19日, Oralce 官方放出了该漏洞的补丁,详情见 这里

分析一下补丁

this.validate(new ByteArrayInputStream(baos.toByteArray()));
this.validateFormat(new ByteArrayInputStream(baos.toByteArray()));
this.xmlDecoder = new XMLDecoder(new ByteArrayInputStream(baos.toByteArray()));

在原来 validate 过滤的基础上又增加了一次 validateFormat 过滤,过滤方法如下

CVE-2019-2729 Weblogic XMLDecoder反序列化漏洞分析

这回终于是采用了白名单方式, allowedName 如下

CVE-2019-2729 Weblogic XMLDecoder反序列化漏洞分析

可以看到 allowedName 严格限制了可以使用的标签,并且也限制了标签可以拥有的属性,值得注意的是 allowedName 不再允许 field 标签了,emmm…

总结

这个漏洞是当时应急时简单分析的,后续有时间会详细整理一下。

从整个 XMLDecoder 反序列化漏洞的来看(CVE-2017-3506 -> CVE-2017-10271(10352) -> CVE-2019-2725 -> CVE-2019-2729),使用黑名单修补漏洞是不靠谱的,永远不知道下一次绕过是在什么时候,而这次的白名单修复方式会不会还存在缺陷呢?此处还得打一个问号。

Back to posts

原文  https://kylingit.com/blog/cve-2019-2729-weblogic-xmldecoder%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90/
正文到此结束
Loading...