
CVE-2026-43865 の再現コード — Apache Camel camel-hazelcast のデフォルト構成インスタンスにおける安全でない Java デシリアライゼーション(RCE)
このプロジェクトは、Apache Camel の camel-hazelcast コンポーネントにおけるJava 逆シリアライゼーションの脆弱性を実証するもので、CVE-2026-43865 として追跡されています。Camel が Hazelcast の Config を自ら構築する場合 — つまり、ユーザーが提供した HazelcastInstance、hazelcastConfigUri、参照された Config ビーンが一切指定されていない場合 — Java 逆シリアライゼーションフィルタは適用されません(Hazelcast の JavaSerializationFilterConfig も、Camel 側の ObjectInputFilter も適用されません)。そのため、Hazelcast クラスタプロトコルを介して到着したオブジェクトは、クラス制限なしに Hazelcast のシリアライゼーション層(ObjectInputStream.readObject)内で逆シリアライズされます。クラスタに参加または到達できる攻撃者は、細工されたシリアライズ済みオブジェクトを公開でき、それがすべての Camel ノードで逆シリアライズされます — リモートコード実行となり、デフォルトで存在し、オプトインのエンドポイント設定も不要です。
アドバイザリ: https://camel.apache.org/security/CVE-2026-43865.html
これは、Hazelcast ライブラリのアドバイザリ CVE-2016-10750 / CVE-2022-36418(Hazelcast 自身のコードに関するもの)とは異なります。ここでの欠陥は、Hazelcast が提供する逆シリアライゼーション保護を Camel が適用していないことです。
インスタンス/設定が提供されない場合、HazelcastDefaultComponent は標準設定からインスタンスを構築し、シリアライゼーションフィルタを一切設定しません:
// HazelcastDefaultComponent - affected 4.18.2
if (hazelcastInstance == null && config == null) {
config = new XmlConfigBuilder().build();
config.getProperties().setProperty("hazelcast.version.check.enabled", "false");
config.getProperties().setProperty("hazelcast.phone.home.enabled", "false");
hzInstance = Hazelcast.newHazelcastInstance(config); // no JavaSerializationFilterConfig
}
修正では、Camel 自身が作成するインスタンスに対してデフォルトフィルタ(ホワイトリスト java./javax./org.apache.camel.、ブラックリスト java.net.)を挿入し、ユーザーが指定した Config/HazelcastInstance には手を加えません:
// fixed 4.18.3 / 4.21.0
config.getProperties().setProperty("hazelcast.phone.home.enabled", "false");
HazelcastSerializationFilterHelper.applyDefault(config); // <-- added
hzInstance = Hazelcast.newHazelcastInstance(config);
逆シリアライズされたオブジェクトを Camel に引き渡す構造はどれでもこれをトリガーします。この PoC は Poll モードの queue コンシューマーを使用しており、IQueue.poll() が Camel がルーティングする前に先頭要素を逆シリアライズします:
// HazelcastQueueConsumer (Poll mode) - affected
final Object body = queue.poll(config.getPollingTimeout(), TimeUnit.MILLISECONDS); // readObject, no filter
exchange.getIn().setBody(body);
from("hazelcast-queue:cve?queueConsumerMode=Poll") // Camel builds the default (unfiltered) instance
.log("Consumed: ${body.class.name}");
被害者 は Camel ノード(Hazelcast メンバー)です。攻撃者 はクラスタに到達できる任意の主体です。この自己完結型 PoC は、同じシングルメンバークラスタ(127.0.0.1:5701 上の dev)に参加し、被害者が消費するキューにガジェットを提供する Hazelcast クライアント(攻撃者)を実行します。
CVE-2026-43865/
├── pom.xml # camel-hazelcast 4.18.2 + commons-collections 3.2.1 (gadget)
├── Dockerfile # runs the app (--add-opens for gadget build; loopback cluster address)
├── docker-compose.yml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── VictimRoute.java # victim: hazelcast-queue consumer (default instance)
│ ├── Gadget.java # CommonsCollections6 gadget, fires during Hazelcast deserialization
│ └── ExploitController.java # attacker: Hazelcast client offers the gadget to the queue
└── resources/
└── application.properties
実際の攻撃では、シリアライズされたバイト列は攻撃者自身の Hazelcast クライアント/メンバーによって生成されます。ガジェットチェーンがクラスパス上にある必要があるのは被害者のみです。この PoC はガジェットをプロセス内で構築するため、JVM は
--add-opens java.base/java.util=ALL-UNNAMEDで実行されます — これはガジェット構築の詳細であり、脆弱性とは無関係です。
mvn clean package -DskipTests
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
# -> Offered gadget to hazelcast queue 'cve' as a cluster client.
# The Camel node's queue.poll() deserialized it via Hazelcast (no filter).
#
# >>> RCE proof — /tmp/pwned exists: true
docker exec cve-2026-43865 ls -la /tmp/pwned
docker compose down
hazelcast コンシューマー(hazelcast-topic、hazelcast-queue、hazelcast-seda、hazelcast-map、hazelcast-multimap、hazelcast-replicatedmap、hazelcast-list、hazelcast-set)または HazelcastAggregationRepository / HazelcastIdempotentRepository を使用する任意の Camel ルートで、管理インスタンスが Camel のデフォルト設定から作成され、攻撃者がクラスタに到達できる場合。
HazelcastInstance / hazelcastConfigUri / Config ビーンなし)。commons-collections:3.2.1)。Camel が自身のデフォルト設定から作成するインスタンスにデフォルトの Hazelcast JavaSerializationFilterConfig を適用する 4.14.8 / 4.18.3 / 4.21.0(CAMEL-23414)にアップグレードします。
アップグレードまでの間:
JavaSerializationFilterConfig、または JVM 全体の -Djdk.serialFilter=!java.net.**;java.**;javax.**;org.apache.camel.**;!*)。この再現ツールは、公開され修正済みの脆弱性に関するセキュリティ研究および許可されたテストのみを目的として提供されています。明示的な許可なくシステムに対して使用しないでください。
| プロパティ | 値 |
|---|
| コンポーネント | camel-hazelcast (任意のコンシューマー + HazelcastAggregationRepository / HazelcastIdempotentRepository) |
| 影響を受けるクラス | org.apache.camel.component.hazelcast.HazelcastDefaultComponent (デフォルト設定インスタンスの生成) |
| CWE | CWE-502: 信頼できないデータの逆シリアライゼーション |
| 影響 | クラスタ内のすべての Camel ノードでのリモートコード実行 (RCE) |
| トリガー | Camel のデフォルト設定から作成された管理インスタンスを使用する hazelcast コンシューマー/リポジトリ |
| 影響を受けるバージョン | 4.0.0 から 4.14.8 未満、4.15.0 から 4.18.3 未満、4.19.0 から 4.21.0 未満 |
| 修正済みバージョン | 4.14.8、4.18.3、4.21.0 |
| JIRA | CAMEL-23414 |
| 報告者 | gaorenyusi |