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 标签或下载的归档文件名。
如何修复?
- 备份数据库和
runtime/目录,后者保存实例配置和密钥。 - 停止 OFBiz 进程。如果它通过 Gradle 运行,请停止
./gradlew ofbiz进程或包装它的服务。 - 从项目下载页下载
apache-ofbiz-24.09.08并解压。 - 像部署任何补丁版本一样部署它,保留
runtime/配置和自定义组件。不要对现有数据库运行loadAll:项目 README 警告该任务可能覆盖数据。 - 使用
./gradlew ofbiz启动新目录树,并确认登录页可以渲染。 - 用“我受影响吗?”中的检查命令确认版本,并在每个实例和容器镜像上重复。
项目未发布针对这批问题的变通方案。在安排升级之前,请降低暴露:
- 将 OFBiz Web 界面置于网络允许列表之后,只允许已知管理员访问。
- 不要将登录页或应用端点直接暴露到互联网。
- 如果 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。
如何被利用?
- 攻击者向 OFBiz 登录页或另一个认证前端点发送匿名 JSON 请求。
- JSON 请求体将
mainDecoratorLocation设置为file:位置,指向攻击者可以影响的描述符,例如file:/proc/self/fd/<n>。 WebAppUtil将该键复制到请求属性,遮蔽可信的装饰器位置。- 登录页通过控件工厂解析装饰器,工厂从描述符而不是
component://路径读取 XML。 - 攻击者的屏幕定义包含渲染器会执行的动作或控件表达式。
- 代码在 OFBiz 的 Java 进程中以运行 OFBiz 的操作系统用户身份执行,发生在用户认证之前。
这批问题中的第二个认证前代码执行漏洞 CVE-2026-83542 被描述为登录页控件注入,并由同一个屏幕位置守门类修复。CVE-2026-73578 是无需认证的已保存视图授权绕过,具有 RCE 影响。这三个漏洞都没有公开的利用代码。
攻击如何展开?
登录页从请求上下文读取装饰器位置,修复同时关闭了属性遮蔽和文件描述符路径。
设置 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 属性时不会记录任何内容。
对于曾暴露在互联网上的实例,值得执行以下两项检查:
- 在 Web 服务器访问日志中搜索发往登录页或控制端点的 JSON
POST请求,然后检查代理记录的请求体中是否有mainDecoratorLocation、decorator、location或screen键。设置装饰器位置的请求体是线索。不记录请求体的代理无法回答这个问题。 - 在 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。
常见问题
哪个版本修复了该问题?
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 日检查)