Apache OFBiz の認証前 RCE、24.09.08 で修正(CVE-2026-68524)
Apache OFBiz は 24.09.08 より前のバージョンで、ログインページ上の攻撃者が選んだファイル記述子から画面定義を読み込み、コードを実行します。46 件の CVE が修正されました。
要点
- Apache OFBiz は、認証されていない JSON リクエストが設定できる場所から画面定義を読み込みます。攻撃者はログインページを自身の XML に向け、サーバープロセスでコードを実行します。
- 24.09.08 より前のすべてのリリースが影響を受けます。プロジェクトは 24.09.08 で修正を公開し、2026 年 11 月 4 日に同じリリースで 46 件の CVE を公表しました。
- Apache はこの一連の問題に重大なものが含まれると述べ、7 件のコード実行の脆弱性を挙げています。そのうち複数は認証を必要としません。CVE-2026-68524 は 2026 年 11 月 5 日時点で 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 を実行するオペレーティングシステムのユーザーとして、ユーザーが認証する前に実行されます。
この一連の問題のもう 1 つの認証前コード実行、CVE-2026-83542 は、ログインページのウィジェットインジェクションとして説明され、同じ画面の場所のゲートキーパーで修正されます。CVE-2026-73578 は、RCE 影響を伴う認証不要の保存ビュー認可バイパスです。3 件のいずれにも公開されたエクスプロイトコードはありません。
攻撃の流れは?
ログインページはリクエストコンテキストからデコレーターの場所を読み取り、修正は属性の上書きとファイル記述子の経路の両方を閉じます。
mainDecoratorLocation を設定"] --> B["ボディが信頼済みの
ServletContext 属性を上書き"] B --> C["ログインページが
デコレーターの場所を解決"] C --> D["file:/proc/self/fd/N が
リクエストストリームを指す"] D --> E["画面ファクトリーが
攻撃者の XML を解析"] E --> F["画面アクションが
認証前に実行"] F --> G["OFBiz の JVM で
OFBiz ユーザーとしてコード実行"]
攻撃者に何ができますか?
認証されていない攻撃者が、OFBiz を実行するユーザーの権限で、OFBiz の Java プロセス内で任意のコードを実行します。そのユーザーはインスタンスの設定を読み取り、設定された資格情報でデータベースに到達し、アプリケーションを変更できます。
影響には次の条件がすべて必要です。
- OFBiz の Web アプリケーションに攻撃者のネットワークから到達できる。
- インスタンスが 24.09.08 より前のリリースを実行している。
- 攻撃者が JSON ボディでリクエスト属性を設定し、自身の XML を含むファイル記述子を指定できる。修正のテストは、連鎖が使用した記述子のパスを示しています。
- 攻撃者が提供する画面定義に実行可能なアクションが含まれている。
この一連の問題には、記述子の経路を必要としない影響もあります。CVE-2026-105330 は JWT 認証のハードコードされた暗号鍵で、認証なしの管理者アクセスを可能にします。CVE-2026-109928 はパスワードリセットの不正なアルゴリズムで、アカウントの完全な乗っ取りを可能にします。46 件のうち 15 件は認可の欠如または認可バイパスの脆弱性で、テナント間や読み取り専用のケースを含みます。
修正が機能する理由
修正は、解決前にすべてのウィジェットの場所を WidgetSecureLocation.sanitize に通します。この関数は、大文字小文字に関係なく file: スキームを拒否します。component:// パス内の .. を拒否します。管理者が新しい security.allowFilePaths 正規表現を設定していない限り、他のファイルシステムパスをすべて拒否します。プロパティは既定で空なので、コンポーネント以外の場所は既定で拒否されます。
修正は上書きも根本から止めます。WebAppUtil は、ServletContext が同じ名前の属性をすでに公開している場合、ボディのキーをスキップします。
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));
}
2 つの変更を合わせて、連鎖の両方の半分を除去します。攻撃者はデコレーターの場所を置き換えられなくなり、記述子を指す場所も受け入れられなくなります。
このコミットは、画面、フォーム、グリッド、メニュー、ツリーにチェックを適用します。許可リストとファイルスキームのケースに対する単体テストを追加します。これら 5 つのファクトリーに対して完全です。フレームワーク外のカスタムウィジェットファクトリーには、同じ呼び出しが必要です。
侵害されたかどうかを確認するには?
CVE-2026-68524 およびこの一連の他の問題について、侵害の指標は公開されていません。成功したリクエストは通常のログインページのリクエストに見えることがあり、修正前のコードはボディの属性が ServletContext 属性を上書きしても何も記録しませんでした。
インターネットに公開されていたインスタンスでは、次の 2 つの確認を行う価値があります。
- 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 件すべてが 1 つのリリース 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 日確認)