漏洞分析
该漏洞是CVE-2019-2725
的绕过,因此前面的流程都是一样的,经过21个handler
处理,最终进入WorkAreaHeader
在4月份oracle
对2725紧急补丁中,过滤了class
元素,因此不能再通过class
创建对象
这次的绕过实际上就是找到另外的元素代替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
值就会把方法名设置为该值。
随后把方法名设置为我们传入的值,最终通过forName
找到指定的类
之后的流程就和2725一样的了
进入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),使用黑名单修补漏洞是不靠谱的,永远不知道下一次绕过是在什么时候,而这次的白名单修复方式会不会还存在缺陷呢?此处还得打一个问号。