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***: "

关键问题点:

  1. 检测到敏感类时返回null而非抛出异常
  2. 白名单模式(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);
}
  1. 收紧白名单模式,避免使用过于宽松的正则表达式

  2. 考虑关闭SOAP和HTTPEngine的入口点(如果业务不需要)

漏洞利用链示例

  1. 构造包含RMIConnectionImpl_Stub的恶意序列化对象
  2. 通过OFBiz的SOAP或HTTPEngine端点发送
  3. 目标服务器反序列化时:
    • 检查到RMIConnectionImpl_Stub符合白名单
    • 虽然其父类被拦截返回null,但不影响利用
    • 最终触发RMI连接并执行恶意代码

总结

CVE-2021-29200展示了黑名单/白名单机制在反序列化防护中的局限性,特别是当:

  • 检测到恶意类时处理不当(返回null而非抛出异常)
  • 白名单模式过于宽松
  • 反序列化流程具有递归性质,允许部分类加载失败

正确的修复方式应包括:

  1. 严格的异常处理
  2. 精确的白名单控制
  3. 关键入口点的禁用(如非必要)
  4. 全面的安全审计,考虑所有可能的利用链
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的修复代码如下: 关键问题点: 检测到敏感类时返回 null 而非抛出异常 白名单模式( DEFAULT_WHITELIST_PATTERN )过于宽松: 特别是 java..* 模式允许所有 java 包下的类 绕过方式 利用 javax.management.remote.rmi.RMIConnectionImpl_Stub : 该类符合白名单正则表达式( java..* ) 虽然其父类 java.rmi.server.RemoteStub 和 java.rmi.server.RemoteObject 会被检测到并返回 null 但由于反序列化的递归性质,父类反序列化为空不影响子类反序列化流程 利用 sun.rmi.server.UnicastRef : 通过 LiveRef 打开通道 sun.rmi.server.UnicastRef 是连接的抽象/封装,可直接使用 其他潜在利用点 : java.rmi.activation.ActivationID 也是一个可能的利用入口 修复建议 检测到敏感类时应抛出异常而非返回 null : 收紧白名单模式,避免使用过于宽松的正则表达式 考虑关闭SOAP和HTTPEngine的入口点(如果业务不需要) 漏洞利用链示例 构造包含 RMIConnectionImpl_Stub 的恶意序列化对象 通过OFBiz的SOAP或HTTPEngine端点发送 目标服务器反序列化时: 检查到 RMIConnectionImpl_Stub 符合白名单 虽然其父类被拦截返回 null ,但不影响利用 最终触发RMI连接并执行恶意代码 总结 CVE-2021-29200展示了黑名单/白名单机制在反序列化防护中的局限性,特别是当: 检测到恶意类时处理不当(返回null而非抛出异常) 白名单模式过于宽松 反序列化流程具有递归性质,允许部分类加载失败 正确的修复方式应包括: 严格的异常处理 精确的白名单控制 关键入口点的禁用(如非必要) 全面的安全审计,考虑所有可能的利用链