1

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

 1 year ago
source link: https://paper.seebug.org/2026/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

作者:墨云科技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/


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK