该漏洞是 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),使用黑名单修补漏洞是不靠谱的,永远不知道下一次绕过是在什么时候,而这次的白名单修复方式会不会还存在缺陷呢?此处还得打一个问号。
Back to posts