
defaultInstance)Apache Camel の脆弱性に対する実行可能な概念実証(PoC)再現プログラムです。この脆弱性では、Thrift データフォーマットが対象型の新規コピーではなく共有の defaultInstance にアンマーシャルし、その共有オブジェクトをエクスチェンジボディとして返していました。インスタンスはプロセス全体で共有されるため、あるメッセージのアンマーシャル中に書き込まれた状態がオブジェクト上に残り、同じ型を使用する後続のすべてのメッセージから見える状態になっていました。後続のペイロードに存在しないフィールドは前のメッセージの値を保持していたため、ある送信者のコンテンツが別の送信者のメッセージ処理中に読み取られる可能性があり、また並行するエクスチェンジ同士が互いの部分的に書き込まれた状態を観測する可能性がありました。同一ルートを通じて複数のテナントやユーザーにサービスを提供するデプロイメントでは、これは一方の当事者のデータが他方に開示されることを意味します。
Spring Boot のみ。
camel-quarkus-thrift拡張機能は存在しないため、この再現プログラムは単一の Camel Spring Boot モジュールを提供します。(この欠陥はコンポーネントのThriftDataFormatにあり、ランタイムに依存しません。)
| ランタイム | ディレクトリ | スタック |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-thrift 4.22.0(影響あり、修正版 4.22.1) |
ルートは 1 つの ThriftDataFormat(生成された Thrift 型 Work に基づく)を定義し、通常のルートと同様にすべてのメッセージで再利用します。2 つのテナントがこのルートを通じてメッセージを送信します:
Work{num1=1, op=ADD, comment="TENANT-A-SECRET-…"} — オプションの comment フィールドに機密データが含まれています;Work{num1=3, op=SUBTRACT} — comment フィールドはありません。ルートはテナント A のメッセージをアンマーシャルし、続いてテナント B のメッセージをアンマーシャルします。
comment を保持したまま返されます — Thrift は受信バイトに存在するフィールドのみを代入し、両方のメッセージが同じ共有インスタンスにデシリアライズされ(そしてそのまま返され)たため、B に存在しないフィールドは A の値を保持しました。2 つのボディは文字通り同一のオブジェクトです。comment は null です — 各エクスチェンジが独自のクリアされたコピーを取得します。cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: B sees A's secret; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85245-thrift-cross-exchange-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: B's comment is null; >>> Not exploited
| 項目 | 値 |
|---|---|
| コンポーネント | camel-thrift (ThriftDataFormat.unmarshal) |
| CWE | CWE-488 (データ要素の誤ったセッションへの露出) |
| 深刻度 | MEDIUM |
| 攻撃ベクトル | 同一ルートを通る同じ Thrift 型の2つのメッセージ。フィールドを省略した後続のメッセージが、先行メッセージの値を継承する |
| 影響 | 交換間 / テナント間のデータ開示。並行する交換が互いの部分的に書き込まれた状態を観測できる |
| 影響を受けるバージョン | 4.0.0 から 4.18.5 未満、4.19.0 から 4.22.1 未満 |
| 修正済みバージョン | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24442 |
| クレジット | Claude Security Scan Tool |
アドバイザリ: https://camel.apache.org/security/CVE-2026-85245.html
生成された Thrift 型 (Work、Operation) は、Apache Camel 自身の camel-thrift テストからの公開テストフィクスチャです。
ThriftDataFormat.unmarshal は、交換ごとのコピーにデシリアライズするようになりました:
TBase instance = defaultInstance.deepCopy(); instance.clear(); — その後、バイト列を instance にデシリアライズして
返します。各交換はそれぞれクリアされた独自のオブジェクトを取得するため、メッセージ間でフィールドが引き継がれることも、2つの交換がボディを共有することもありません。
データフォーマットの実行直後に、アンマーシャルされたボディを新しいインスタンスにコピーし、返されたオブジェクトへの参照を保持しないでください。
このリポジトリは教育および防御目的で公開されています: Apache Camel ユーザーが脆弱性を理解し、影響を受けているかどうかを確認し、アップグレードによって解決されることを確証できるようにするためです。「シークレット」は無害な、でっち上げのマーカー文字列です。所有または運用していないシステムに対してこの資料を使用しないでください。