阿里云安全获Apache官方致谢 |Apache OFBiz 反序列化漏洞预警(CVE-2021-30128)
2021-4-28 14:11:2 Author: mp.weixin.qq.com(查看原文) 阅读量:13 收藏

01

漏洞简述

2021年4月2日,阿里云安全向Apache官方报告了Apache OFBiz反序列化漏洞,漏洞编号为CVE-2021-30128,漏洞等级:高危。

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

影响版本

     Apache OFBiz < 17.12.07

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 至最新版本


文章来源: https://mp.weixin.qq.com/s?__biz=MzI5MzY2MzM0Mw==&mid=2247486084&idx=1&sn=ad61d8c155290344f50b025b4af9b3c8&chksm=ec6fed84db186492df3be45803cafdbbbae3ab044074009a069b1948de4d8d840c6eb27271eb&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh