Apache Camel の脆弱性に対する実行可能な概念実証(PoC)再現環境です。この脆弱性では、camel-spring-redis が
serializer オプション未設定時に、java.io.ObjectInputFilter を一切持たない素の JdkSerializationRedisSerializer
を構築し、すべての読み取りに使用していました。RedisConsumer.setBody は Exchange が構築される前に、購読チャネルに
パブリッシュされたすべてのメッセージの生バイト列に対してこれを適用していたため、購読チャネルに対して PUBLISH を
発行できる攻撃者はデシリアライズのシンクに直接到達し、任意のシリアライズ済みオブジェクトグラフの readObject を
実行できました(リモートコード実行、CWE-502)。同じデフォルトシリアライザがプロデューサの読み取りコマンド
(GET/HGET/HGETALL/HVALS)および SpringRedisIdempotentRepository でも使用されていました。
| ランタイム | ディレクトリ | スタック |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-spring-redis 4.22.0(影響あり、修正版 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-spring-redis 3.29.0(Camel 4.15.0、影響あり) |
この欠陥はコンポーネントが導入された 2.11.0 にまで遡るため、影響を受けるすべてのリリース、および最新の Camel Quarkus に含まれる Camel 4.15.0 が脆弱です。修正は Camel 4.18.5 / 4.22.1 / 4.23.0 で提供されます。Spring Boot モジュールは 影響を受けるビルド(4.22.0)と修正済みビルド(4.22.1)の両方を実行します。修正済み Camel を同梱した Camel Quarkus は まだリリースされていません。
このアプリは、serializer オプションなしで cve-channel を SUBSCRIBE する Camel ルートを実行します(つまりデフォルトの
JdkSerializationRedisSerializer が使用されます)。攻撃者は、そのチャネルに PUBLISH することしかできない素の Redis
クライアントであり、Camel プロセスへのアクセス権はありません。攻撃者は、意図的に無害な com.example.PwnMarker
の生のシリアライズ済みバイト列をパブリッシュします。このクラスの readObject は JVM グローバルフラグを反転させるだけです
(ガジェットなし、コマンドなし)。影響を受けるビルドではコンシューマがこれをデシリアライズして readObject が実行されます。
一方、修正済みビルドではデフォルトの許可リスト(標準の java./javax. および org.apache.camel. 型)が
com.example.PwnMarker を拒否し、InvalidClassException: filter status: REJECTED となります。
cd camel-spring-boot
mvn clean package
docker compose up -d --build # starts Redis + the reproducer
curl -s http://localhost:8080/exploit/attack
docker compose down
影響を受けたビルドで期待される出力:
Attacker connects to Redis redis:6379 and PUBLISHes a serialized com.example.PwnMarker to channel 'cve-channel'.
PUBLISH delivered to 1 subscriber(s).
Result:
>>> PROVEN: the Redis consumer deserialized the attacker-published, non-allow-listed class
>>> (com.example.PwnMarker) with no ObjectInputFilter — its readObject executed.
| プロパティ | 値 |
|---|---|
| コンポーネント | camel-spring-redis (camel-spring-redis-starter / camel-quarkus-spring-redis) |
| CWE | CWE-502 (信頼できないデータのデシリアライズ) |
| 重大度 | HIGH |
| 攻撃ベクター | Camel の spring-redis コンシューマーが購読しているチャネルへの PUBLISH (またはプロデューサーが読み取る Redis キーの制御)。デフォルトのシリアライザーがフィルターなしでペイロードをデシリアライズする |
| 影響 | ルートロジックが実行される前に、ガジェットクラスを介して Camel プロセス内でリモートコード実行が発生する |
| 影響を受けるバージョン | 2.11.0 から 4.18.5 より前、4.19.0 から 4.22.1 より前 |
| 修正済みバージョン | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24421 |
| クレジット | Leon Zlobecki |
アドバイザリ: https://camel.apache.org/security/CVE-2026-78165.html
新しい deserializationFilter エンドポイントオプションは、デフォルトのシリアライザーがペイロードを読み取る際に適用されるフィルターを制御します。未設定の場合、JVM 全体の jdk.serialFilter が存在すればそれが尊重され、そうでなければ保守的な許可リスト (標準 Java および Apache Camel の型。java.net は拒否) が適用され、さらに 4.23.0/4.22.1 では JEP-290 のグラフ形状制限も追加で適用されます。シリアライザーは、グラフが読み取られる前にストリームにフィルターを設定するデシリアライズ用コンバーターを伴う、Converter ベースのコンストラクターを通じて構築されます。serializer をカスタムの RedisSerializer に設定した場合、Camel がペイロードの読み取り方法を制御しなくなるため、フィルターは引き続きバイパスされます。
JVM 全体の -Djdk.serialFilter=... を設定する (影響を受けるパスはこれを尊重します)、または serializer エンドポイントオプションを StringRedisSerializer などの非 Java シリアライザーに設定する (カスタムの redisTemplate 上だけでなく、serializer オプションとして設定する) ようにしてください。Redis で認証を必須とし、購読チャネルにパブリッシュできるユーザーを制限してください。
このリポジトリは教育および防御目的で公開されています。Apache Camel ユーザーが脆弱性を理解し、影響を受けているかどうかを確認し、アップグレードによって解決されることを検証できるようにするためです。ペイロードはコードを実行しない無害なマーカーです。所有または運用していないシステムに対してこの資料を使用しないでください。