CVE-2019-2729 Weblogic XMLDecoder反序列化漏洞分析
Jun 19, 2019
1 minute read

漏洞分析

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

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

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

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

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

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

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

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

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

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

1560635046339

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

补丁分析

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过滤,过滤方法如下

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

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

总结

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

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


Back to posts


comments powered by Disqus