阿里云安全获Apache官方致谢 |Apache OFBiz 反序列化漏洞预警(CVE-2021-30128)
01
漏洞简述
02
时间轴
· 2021/04/02
阿里云安全@Litch1向Apache官方报告了Apache OFBiz反序列化漏洞
· 2020/04/02
阿里云WAF更新防护策略
· 2021/04/28
Apache OFBiz官方发布了漏洞补丁,分配CVE编号为CVE-2021-30128,并向阿里云安全公开致谢
· 2021/04/28
阿里云安全应急响应发布漏洞风险提示
03
风险等级
评定方式 | 等级 |
威胁等级 | 高危 |
影响范围 | 较广 |
利用难度 | 低 |
04
影响版本
05
漏洞分析
关于CVE-2021-26295的相关信息可以参考网上的公开资料,有两个关键:一个为反序列化的触发,一个是SafeObjectInputStream的绕过,CVE-2021-26295利用了在白名单中的JDK RMI相关的类构造"二次反序列化",由于"二次反序列化"时使用的是普通的ObjectInputStream,不受SafeObjectInputStream的限制,从而绕过反序列化保护。官方对于漏洞的修复:SafeObjectInputStream#resolveClass中在白名单的基础上增加了黑名单,禁用了RMI相关的类。仔细看一下org.apache.ofbiz.base.util.SafeObjectInputStream#resolveClass,这个方法使用了一个白名单匹配,只允许白名单样式的类
使用resolveClass方法进行反序列化类的过滤是一个比较常见的保护处理,但是可以发现这里和平常的处理不一样的地方在于:之前常见的resolveClass方法在过滤完类描述符之后都是调用`super.resolveClass(classDesc)`返回相应的类(比如Weblogic)。但是这里却调用了自定义的loadClass方法
跟进loadClass之后,发现这个loadClass对于类描述符做了很多自定义的操作,关注点在于其中关于`<`的处理,这里应该是为了处理泛型把<后的类描述符进行了截断
结合前面的白名单可以想到,如果我们序列化数据中的类描述符数据为
org.apache.commons.beanutils.BeanComparator<xxxx
那么经过这个自定义的loadClass处理之后返回得到的类便是我们要的
org.apache.commons.beanutils.BeanComparator
而为了匹配上resolveClass中的白名单,只需要构造类描述符为
org.apache.commons.beanutils.BeanComparator<java.xxx
便能匹配上`java..*` 当然在JDK中,对于传入的类描述符和最后加载的类的类名也是有限制的,为 java.io.ObjectStreamClass#initNonProxy
这里对于类名与类描述符的相等判断只截取了最后一个`.`之后的部分
所以我们构造序列化数据中的类描述符为`org.apache.commons.beanutils.BeanComparator<java.BeanComparator`,即可绕过所有限制
由于OFBiz存在CommonsBeanutils Gadget,所以生成payload后通过自定义修改一下序列化数据,就可以得到一个不需要出网的Apache OFBiz反序列化RCE
06
修复建议
升级Apache OFBiz 至最新版本