该漏洞是 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