我们的 AI 引擎 Neutron 在加州大学伯克利分校的 CyberGym 基准测试中取得了 97.1% 的成绩。 了解更多

深度解析

深度解析

Apache OFBiz 认证前 RCE,24.09.08 已修复(CVE-2026-68524)

24.09.08 之前的 Apache OFBiz 会从登录页上由攻击者选择的文件描述符加载屏幕定义并执行代码;本次修复了 46 个 CVE。

TL;DR

  • Apache OFBiz 会从某个位置加载屏幕定义,而未认证的 JSON 请求可以设置该位置。攻击者将登录页指向自己的 XML,并在服务器进程中执行代码。
  • 24.09.08 之前的所有版本均受影响。项目在 24.09.08 中发布修复,并于 2026 年 11 月 4 日在同一版本中公布 46 个 CVE。
  • Apache 称这批问题包含严重问题,并列出了七个代码执行漏洞,其中多个无需认证。截至 2026 年 11 月 5 日,CVE-2026-68524 未列入 CISA 的 KEV 目录,也没有已知利用。
  • 请将每个 OFBiz 实例升级到 24.09.08。项目未发布针对这批问题的变通方案;在安排升级期间,请参阅“如何修复?”以降低暴露。

我受影响吗?

实例必须同时满足以下条件才会受影响:

  • 实例运行 24.09.08 之前的 OFBiz 版本。
  • 攻击者能够访问其 Web 应用。登录页和应用端点就足够,不需要账号。
  • 实例尚未使用 24.09.08 修复。集成了 OFBiz 框架代码的自定义组件也需要同样的修复。

项目表示 24.09.08 之前的所有版本均受影响。这包括 18.12 分支以及不再维护的更早版本。

分支 受影响版本 修复版本
24.09 24.09.01 至 24.09.07 24.09.08
18.12 18.12.19 及更早 24.09.08
17.12 及更早 所有版本 24.09.08

检查已安装的版本:

basename "$(readlink -f "$OFBIZ_HOME")"
git -C "$OFBIZ_HOME" describe --tags 2>/dev/null

二进制安装会输出类似 apache-ofbiz-24.09.08 的目录名。源码安装会输出类似 release24.09.08 的标签。对于容器,请在容器内运行相同命令:

docker exec <container> sh -c 'basename "$(readlink -f "$OFBIZ_HOME")"'

源码树根目录的 VERSION 文件在该系列的每个补丁版本中都显示 24.09,因此无法区分 24.09.07 和 24.09.08。请使用目录名、git 标签或下载的归档文件名。

如何修复?

  1. 备份数据库和 runtime/ 目录,后者保存实例配置和密钥。
  2. 停止 OFBiz 进程。如果它通过 Gradle 运行,请停止 ./gradlew ofbiz 进程或包装它的服务。
  3. 从项目下载页下载 apache-ofbiz-24.09.08 并解压。
  4. 像部署任何补丁版本一样部署它,保留 runtime/ 配置和自定义组件。不要对现有数据库运行 loadAll:项目 README 警告该任务可能覆盖数据。
  5. 使用 ./gradlew ofbiz 启动新目录树,并确认登录页可以渲染。
  6. 用“我受影响吗?”中的检查命令确认版本,并在每个实例和容器镜像上重复。

项目未发布针对这批问题的变通方案。在安排升级之前,请降低暴露:

  1. 将 OFBiz Web 界面置于网络允许列表之后,只允许已知管理员访问。
  2. 不要将登录页或应用端点直接暴露到互联网。
  3. 如果 OFBiz 前面有反向代理,请拒绝携带 mainDecoratorLocation 键或任何与您的装饰器配置匹配的属性名的 JSON 请求体。

这些步骤减少能够到达易受攻击路径的人员。它们不会修复请求属性合并或控件位置解析。

根本原因是什么?

OFBiz 从 XML 屏幕定义渲染页面。一个屏幕可以用 location 属性包含另一个屏幕,而装饰器的位置通常是类似 ${parameters.mainDecoratorLocation} 的灵活字符串表达式。该值来自请求上下文,因此控件工厂将其视为攻击者可控。

漏洞的前半部分在 WebAppUtil.setAttributesFromRequestBody。它把匿名 JSON 请求体的每个键合并到请求属性中:

if (requestBodyMap != null) {
    Set<String> parameterNames = requestBodyMap.keySet();
    for (String parameterName: parameterNames) {
        request.setAttribute(parameterName, requestBodyMap.get(parameterName));
    }
}

因此请求体可以设置 mainDecoratorLocation,尽管 Web 应用已将该名称作为来自 web.xml 的可信 ServletContext 属性公开。修复中的注释描述了后果:请求体可以“遮蔽 Web 应用配置的装饰器位置”。

后半部分是控件位置解析器。ScreenFactory、FormFactory、GridFactory、MenuFactory 和 TreeFactory 将位置传给 FlexibleLocation.resolveLocation,并解析返回的 XML。

登录页在认证之前渲染,并使用装饰器位置。因此,更改该位置的请求无需会话即可到达控件解析器。解析器接受 FlexibleLocation 能解析的任何 URL,包括 file: 方案。修复新增了唯一的守门类 WidgetSecureLocation,其类注释指出了报告链条中使用的载体:

/**
 * Any {@code file:} scheme location - single-slash or otherwise, in any letter case - is rejected
 * outright at the protocol layer: it is never a legitimate widget location, and on Linux it is the
 * carrier used to reach live process-descriptor aliases such as {@code file:/dev/fd/N} or
 * {@code file:/proc/thread-self/fd/N}.
 */
public static String sanitize(String location) {
    if (UtilValidate.isEmpty(location)) {
        return null;
    }
    if (isFileScheme(location) || UtilValidate.isUrlInStringAndDoesNotStartByComponentProtocol(location)) {
        return null;
    }
    if (location.startsWith(COMPONENT_PROTOCOL)) {
        String componentRelativePath = location.substring(COMPONENT_PROTOCOL.length());
        if (componentRelativePath.contains("..")) {
            return null;
        }
        // ...
        return COMPONENT_PROTOCOL + normalizedPath;
    }
    if (UtilValidate.isAllowedPath(location)) {
        return location;
    }
    return null;
}

修复附带的测试使用 file:/dev/fd/292、file:/proc/self/fd/292、file:/proc/thread-self/fd/292 和 file:/proc/%73elf/fd/292。文件描述符在处理请求期间保持打开,因此请求控制的位置可以指向自己的请求体或上传的临时文件。屏幕解析器随后从该描述符读取攻击者的 XML。

如何被利用?

  1. 攻击者向 OFBiz 登录页或另一个认证前端点发送匿名 JSON 请求。
  2. JSON 请求体将 mainDecoratorLocation 设置为 file: 位置,指向攻击者可以影响的描述符,例如 file:/proc/self/fd/<n>。
  3. WebAppUtil 将该键复制到请求属性,遮蔽可信的装饰器位置。
  4. 登录页通过控件工厂解析装饰器,工厂从描述符而不是 component:// 路径读取 XML。
  5. 攻击者的屏幕定义包含渲染器会执行的动作或控件表达式。
  6. 代码在 OFBiz 的 Java 进程中以运行 OFBiz 的操作系统用户身份执行,发生在用户认证之前。

这批问题中的第二个认证前代码执行漏洞 CVE-2026-83542 被描述为登录页控件注入,并由同一个屏幕位置守门类修复。CVE-2026-73578 是无需认证的已保存视图授权绕过,具有 RCE 影响。这三个漏洞都没有公开的利用代码。

攻击如何展开?

登录页从请求上下文读取装饰器位置,修复同时关闭了属性遮蔽和文件描述符路径。

flowchart LR A["匿名 JSON 请求体
设置 mainDecoratorLocation"] --> B["请求体遮蔽可信的
ServletContext 属性"] B --> C["登录页解析
装饰器位置"] C --> D["file:/proc/self/fd/N
指向请求流"] D --> E["屏幕工厂解析
攻击者的 XML"] E --> F["屏幕动作执行
在认证前"] F --> G["代码在 OFBiz JVM 中
以 OFBiz 用户执行"]

攻击者能做什么?

未认证的攻击者以运行服务器的用户权限,在 OFBiz 的 Java 进程中执行任意代码。该用户可以读取实例配置、使用配置的凭据访问数据库,并修改应用。

影响需要同时满足以下条件:

  • 攻击者的网络可以访问 OFBiz Web 应用。
  • 实例运行 24.09.08 之前的版本。
  • 攻击者可以通过 JSON 请求体设置请求属性,并指定包含其 XML 的文件描述符。修复中的测试显示了该链条使用的描述符路径。
  • 攻击者提供的屏幕定义包含可执行动作。

这批问题还带来不需要描述符路径的其他影响。CVE-2026-105330 是 JWT 认证中的硬编码加密密钥,可实现未认证的管理访问。CVE-2026-109928 是密码重置算法错误,可实现完全账号接管。46 个 CVE 中有 15 个是缺少授权或授权绕过问题,包括跨租户和只读场景。

为什么修复有效?

修复在解析每个控件位置之前先将其传给 WidgetSecureLocation.sanitize。该函数无论大小写都拒绝任何 file: 方案。它拒绝 component:// 路径中的 ..。除非管理员配置了新的 security.allowFilePaths 正则表达式,否则它拒绝所有其他文件系统路径。该属性默认为空,因此默认拒绝非组件位置。

修复还从源头阻止遮蔽。当 ServletContext 已公开同名属性时,WebAppUtil 现在会跳过请求体中的该键:

ServletContext servletContext = request.getServletContext();
Set<String> parameterNames = requestBodyMap.keySet();
for (String parameterName: parameterNames) {
    // A request body is anonymous, attacker-controlled input. Never let it shadow a name
    // the webapp already exposes as a trusted, application-owned ServletContext attribute
    if (servletContext.getAttribute(parameterName) != null) {
        Debug.logWarning("Ignoring request body attribute [%s]: it shadows an existing"
                + " ServletContext attribute of the same name", MODULE, parameterName);
        continue;
    }
    request.setAttribute(parameterName, requestBodyMap.get(parameterName));
}

两项更改共同消除了链条的两半。攻击者无法再替换装饰器位置,指向描述符的位置也不再被接受。

该提交将检查应用于屏幕、表单、网格、菜单和树。它新增了针对允许列表和文件方案情况的单元测试。对这五个工厂而言是完整的。框架之外的任何自定义控件工厂都需要相同的调用。

如何检查是否已遭入侵?

目前没有公布 CVE-2026-68524 或这批问题中其他漏洞的入侵指标。成功的请求可能看起来像普通的登录页请求,而修复前的代码在请求体属性遮蔽 ServletContext 属性时不会记录任何内容。

对于曾暴露在互联网上的实例,值得执行以下两项检查:

  1. 在 Web 服务器访问日志中搜索发往登录页或控制端点的 JSON POST 请求,然后检查代理记录的请求体中是否有 mainDecoratorLocation、decorator、location 或 screen 键。设置装饰器位置的请求体是线索。不记录请求体的代理无法回答这个问题。
  2. 在 OFBiz 日志中搜索同一批请求前后的 XML 解析错误或控件警告。格式错误的攻击者屏幕会产生解析器异常。有效的屏幕可能不留下任何记录。

如果出现无法解释的认证前请求,并指定了装饰器或 file: 位置,请将其视为可能的入侵。从 24.09.08 目录树重建实例,轮换其持有的数据库和邮件凭据,并审查账号和计划任务。

时间线

  • 2026-07-30:屏幕位置加固通过 PR #1528 向后移植到 24.09 分支。
  • 2026-08-14:WidgetSecureLocation 守门类和请求体遮蔽修复在 PR #1650(提交 4afb9c9a)中合并,PR #1654 将其向后移植到 24.09 分支。
  • 2026-10-21:24.09.08 版本被打上标签。
  • 2026-11-04:项目在 oss-security 邮件列表中公布 24.09.08 中的 46 个 CVE。

修复在 7 月和 8 月合并,版本在 10 月打上标签,CVE 批次在 11 月 4 日公布
图 1:从第一个修复提交到 CVE 公布。来源:Apache OFBiz 的 pull request、发布标签和 oss-security 公告,2026 年 11 月 5 日检查

常见问题

哪个版本修复了该问题?

Apache OFBiz 24.09.08 修复了这批 46 个 CVE。项目表示 24.09.08 之前的所有版本均受影响,并且没有向 18.12 或更早分支发布向后移植,因此这些安装必须迁移到 24.09.08。

我必须一次修复全部 46 个 CVE 吗?

是的,因为全部 46 个都在同一个版本 24.09.08 中发布。类型从代码执行和硬编码凭据,到缺少授权、SQL 与 XML 注入、路径遍历、服务器端请求伪造、跨站脚本、数据泄露和拒绝服务。其中多个无需认证即可触达。

如果本周无法升级,有变通方案吗?

项目没有发布。将 Web 界面限制在已知管理员网络,并拒绝设置装饰器属性的请求体,可以降低暴露,但不会移除易受攻击的代码。请将升级视为修复。

CVE-2026-68524 是否在真实环境中被利用?

截至 2026 年 11 月 5 日没有已知利用,该 CVE 也未列入 CISA 的 KEV 目录。Apache 于 2026 年 11 月 4 日公布这批问题,公开材料中没有概念验证。

为什么 CVE 记录还没有进入公共数据库?

项目于 2026 年 11 月 4 日公布 CVE 编号。撰写本文时,MITRE 的 CVE Services API 对我们检查的编号没有返回记录。公开来源是公告列表和修复提交。编号和修复对应关系在项目的安全页面上。

参考文献

  • Apache OFBiz,“Apache OFBiz Security”页面,已知漏洞和修复 pull request 列表。https://ofbiz.apache.org/security.html (2026 年 11 月 5 日检查)
  • Apache OFBiz,“Apache OFBiz: CVE Announcements”,oss-security,2026 年 11 月 4 日。https://www.openwall.com/lists/oss-security/2026/11/04/9 (2026 年 11 月 5 日检查)
  • Apache OFBiz,“Download”页面,24.09.08 版本。https://ofbiz.apache.org/download.html (2026 年 11 月 5 日检查)
  • Apache OFBiz,pull request #1650,“Restrict widget resource locations to component:// or an explicit allowlist”。https://github.com/apache/ofbiz-framework/pull/1650 (2026 年 11 月 5 日检查)
  • Apache OFBiz,提交 4afb9c9a,即 WidgetSecureLocation 和请求体修复。https://github.com/apache/ofbiz-framework/commit/4afb9c9ab4d9fe7777c00f45eb07c961bcbc357a (2026 年 11 月 5 日检查)
  • Apache OFBiz,pull request #1654,控件位置修复的 24.09 向后移植。https://github.com/apache/ofbiz-framework/pull/1654 (2026 年 11 月 5 日检查)
  • Apache OFBiz,pull request #1528,屏幕位置加固的向后移植。https://github.com/apache/ofbiz-framework/pull/1528 (2026 年 11 月 5 日检查)
  • Apache OFBiz,发布标签 release24.09.08。https://github.com/apache/ofbiz-framework/releases/tag/release24.09.08 (2026 年 11 月 5 日检查)