Apache OFBiz CVE-2021-29200 简要分析
字数 1184 2025-08-05 11:39:37
Apache OFBiz CVE-2021-29200 漏洞分析与利用
漏洞概述
CVE-2021-29200是Apache OFBiz中的一个反序列化漏洞,允许攻击者通过精心构造的序列化对象绕过安全限制,实现远程代码执行。该漏洞与之前修复的CVE-2021-26295相关,但通过不同的利用链实现了绕过。
漏洞背景
Apache OFBiz是一个开源的企业资源规划(ERP)系统,在其SOAP和HTTPEngine组件中存在反序列化入口点。之前修复的CVE-2021-26295通过黑名单机制阻止了java.rmi.server相关类的反序列化,但修复方式存在缺陷。
漏洞分析
原始修复机制的问题
OFBiz针对CVE-2021-26295的修复代码如下:
@Override
protected Class<?> resolveClass(ObjectStreamClass classDesc) throws IOException, ClassNotFoundException {
String className = classDesc.getName();
// BlackList exploits; eg: don't allow RMI here
if (className.contains("java.rmi.server")) {
Debug.logWarning("***Incompatible class***: "
+ classDesc.getName()
+ ". java.rmi.server classes are not allowed for security reason",
"SafeObjectInputStream");
return null;
}
if (!whitelistPattern.matcher(className).find()) {
// DiskFileItem, FileItemHeadersImpl are not serializable.
if (className.contains("org.apache.commons.fileupload")) {
return null;
}
Debug.logWarning("***Incompatible class***: "
关键问题点:
- 检测到敏感类时返回
null而非抛出异常 - 白名单模式(
DEFAULT_WHITELIST_PATTERN)过于宽松:private static final String[] DEFAULT_WHITELIST_PATTERN = { "byte\
\[\ \]
", "foo", "SerializationInjector",
"\[Z", "\[B", "\[S", "\[I", "\[J", "\[F", "\[D", "\[C",
"java..", "sun.util.calendar..", "org.apache.ofbiz..*",
"org.codehaus.groovy.runtime.GStringImpl", "groovy.lang.GString"};
特别是`java..*`模式允许所有`java`包下的类
### 绕过方式
1. **利用`javax.management.remote.rmi.RMIConnectionImpl_Stub`**:
- 该类符合白名单正则表达式(`java..*`)
- 虽然其父类`java.rmi.server.RemoteStub`和`java.rmi.server.RemoteObject`会被检测到并返回`null`
- 但由于反序列化的递归性质,父类反序列化为空不影响子类反序列化流程
2. **利用`sun.rmi.server.UnicastRef`**:
- 通过`LiveRef`打开通道
- `sun.rmi.server.UnicastRef`是连接的抽象/封装,可直接使用
3. **其他潜在利用点**:
- `java.rmi.activation.ActivationID`也是一个可能的利用入口
## 修复建议
1. 检测到敏感类时应抛出异常而非返回`null`:
```java
if (className.contains("java.rmi.server")) {
Debug.logWarning("***Incompatible class***: "
+ classDesc.getName()
+ ". java.rmi.server classes are not allowed for security reason",
"SafeObjectInputStream");
throw new InvalidObjectException("no safe!!" + className);
}
-
收紧白名单模式,避免使用过于宽松的正则表达式
-
考虑关闭SOAP和HTTPEngine的入口点(如果业务不需要)
漏洞利用链示例
- 构造包含
RMIConnectionImpl_Stub的恶意序列化对象 - 通过OFBiz的SOAP或HTTPEngine端点发送
- 目标服务器反序列化时:
- 检查到
RMIConnectionImpl_Stub符合白名单 - 虽然其父类被拦截返回
null,但不影响利用 - 最终触发RMI连接并执行恶意代码
- 检查到
总结
CVE-2021-29200展示了黑名单/白名单机制在反序列化防护中的局限性,特别是当:
- 检测到恶意类时处理不当(返回null而非抛出异常)
- 白名单模式过于宽松
- 反序列化流程具有递归性质,允许部分类加载失败
正确的修复方式应包括:
- 严格的异常处理
- 精确的白名单控制
- 关键入口点的禁用(如非必要)
- 全面的安全审计,考虑所有可能的利用链