Apache OFBiz CVE-2021-29200 反序列化漏洞分析

2022-11-24 16:9:0 Author: paper.seebug.org(查看原文) 阅读量:16 收藏

作者:墨云科技VLab Team
原文链接:https://mp.weixin.qq.com/s/cJ65VXdHzSelIptJ5TIW_A

图片

漏洞简述

2021年3月24日,墨云安全V-Lab实验室向Apache官方报告了OFBiz产品的反序列化漏洞,2021年4月28日Apache OFBiz发布了致谢信息。

时间线

  • 2021年3月24日向Apache OFBiz报告了此漏洞
  • 2021年3月26日Apache OFBiz给出修复方案
  • 2021年3月30日Apache OFBiz在github上提交了修复漏洞代码
  • 2021年4月2日Apache OFBiz分配CVE编号CVE-2021-29200
  • 2021年4月28日Apache OFBiz发布致谢信息

影响版本

Apache OFBiz < 17.12.07

漏洞分析

3月21日有一些安全厂商发了Apache OFBiz CVE-2021-26295反序列化漏洞的风险通知,接下来两天有一些公众号写了关于这个漏洞的分析文章,用的都是URLDNS POC,使用URLDNS显然是不能去验证是否存在漏洞的。

复现漏洞一般都是查看修复代码,根据修复代码去构造POC。CVE-2021-26295漏洞的修复代码链接是

https://github.com/apache/ofbiz-framework/commit/af9ed4e/

图片

对反序列化漏洞有了解的应该知道重写resolveClass方法是用来防御反序列化漏洞。新增的代码是想阻止class名称中包含"java.rmi.server"字符的。看下完整的SafeObjectInputStream类。

图片

SafeObjectInputStream类采用黑名单和白名单来防御反序列化漏洞。但是这里的黑名单判断有点问题,注意看72行和77行代码,这里判断在黑名单列表里面直接return null了并没有抛出异常。正确的修复方案应该是使用throw new InvalidClassException去抛出异常。使用return null反而让在黑名单列表的class提前返回,不会执行到下面的白名单列表检查。看到这里我不仅仅知道了之前的OFBiz反序列化漏洞的POC,而且知道能用之前的1day当0day玩。

根据SafeObjectInputStream类resolveClass方法的两次return null,可以得知两个POC都跟"java.rmi.server"和"org.apache.commons.fileupload"有关。分别对应ysoserial的JRMPClient和FileUpload1。

OFBiz把commons-fileupload升级到1.3.3了,默认配置下没有漏洞,如果配置了SERIALIZABLE_PROPERTY可序列化也会产生漏洞。

图片

JRMPClient POC是可以进行利用的。首先使用ysoserial的JRMPListener启动一个JRMP端口,在跟OFBiz发送JRMPClient POC让OFBiz服务端来请求恶意的JRMP端口来达到攻击目的。具体这方面文章网上挺多的,这里就不详解了。

我把我了解的这些情况总结成一份报告发给Apache OFBiz后,OFBiz在3月26日给我一份修复方案。

图片

在这里OFBiz做了三处改动。在之前的

"java.rmi.server"和"org.apache.commons.fileupload"的return null代码改成了抛出异常。把之前的"java.rmi.server"范围缩小到了"java.rmi"。这里黑名单范围缩小的改动当时还不清楚是为什么,过了段时间有人公布了weblogic低版本jdk中的一个0day其中使用到了java.rmi.MarshalledObject作为二次反序列化来绕过黑名单检查。漏洞作者也应该跟OFBiz提交了一份报告。关键代码如下:

图片

OFBiz让我跟他确认修复方案是否还有问题时,我又看了一次SafeObjectInputStream类

图片

这里使用whitelistPattern.matcher去匹配类名,但是并没有判断开始位置,可能会存在安全风险的。假如class名称是xxx.java.xxx也会通过白名单列表的检查。但是要证明有安全风险我得找出存在这样的风险。于是我花了一些时间去寻找class名称是xxx.java.xxx的类。很遗憾最后没有找到能利用的,最后回复OFBiz邮件确认没有问题。后来阿里的一位安全研究员在这里找到了漏洞CVE编号是CVE-2021-30128。不过OFBiz的修复方案是在黑名单列表新增了CVE-2021-30128绕过的关键字,并没有去判断class的开始位置,可能后面还是会被绕过的。

修复建议

下载并更新到最新版本的Apache OFBiz:

https://downloads.apache.org/ofbiz/apache-ofbiz-17.12.07.zip


Paper 本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/2026/



文章来源: https://paper.seebug.org/2026/
如有侵权请联系:admin#unsafe.sh