
Apache Camel の脆弱性に対する実行可能な概念実証(PoC)再現ツールです。この脆弱性では、dynamic-router-control エンドポイントが、サブスクリプションの述語(predicate)と、そのコンパイルに使用する言語名を受信メッセージから取得していました(DynamicRouterControlMessage の predicate / expressionLanguage フィールド、または CamelDynamicRouterPredicate / CamelDynamicRouterExpressionLanguage ヘッダー)。その後サービスはその言語を CamelContext から解決し、式を Predicate にコンパイルしていましたが、許可リストもオプトインも存在しませんでした。コンパイルされた述語は、そのチャネルを経由してルーティングされるすべての exchange に対して評価されていました。そのため、ルートが制御エンドポイントへ転送するトランスポート上にメッセージを送信できるアクターであれば誰でも、任意の式を送り込み、Camel プロセスの権限で評価させることができました。クラスパス上にある任意の言語を選択でき、常に存在してデフォルトであった simple も含まれていました。
Camel Spring Boot のみ。
camel-quarkus-dynamic-router拡張機能は存在しないため、この再現ツールを Camel Quarkus 上で実行することはできません。
| ランタイム | ディレクトリ | スタック |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-dynamic-router 4.22.0(影響あり、修正版 4.22.1) |
このアプリは Dynamic Router チャネル test(direct:start → dynamic-router://test)をセットアップします。攻撃者は、攻撃者が選択した述語式と言語を含むsubscribe制御メッセージを送信します:
CamelDynamicRouterPredicate = ${bean:detonator?method=detonate}
CamelDynamicRouterExpressionLanguage = simple
次に、1つのメッセージがチャネルを経由してルーティングされ、チャネルがサブスクリプション述語を評価します。影響を受けるビルドでは、この式が実行され、detonator.detonate() が呼び出されます。これは、攻撃者が到達しうるあらゆる引数なしのレジストリメソッドの無害な代替物です(また、Groovy などのあらゆる言語が任意コード実行を可能にします)。修正済みビルドでは、制御エンドポイントがメッセージから述語や言語を受け取ることを拒否します。
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
影響を受けたビルドで期待される出力:
Subscription accepted.
>>> PROVEN: the attacker-supplied predicate expression was compiled and evaluated, invoking
>>> detonator.detonate() with the privileges of the Camel process ...
修正済みビルドでは、サブスクライブは IllegalArgumentException: The subscription predicate expression, and the language used to compile it, cannot be taken from a control message. ... set 'allowPredicateFromMessage=true' ... で拒否されます。
| プロパティ | 値 |
|---|---|
| コンポーネント | camel-dynamic-router(dynamic-router-control エンドポイント) |
| CWE | CWE-94(コードインジェクション)、CWE-917(式言語インジェクション) |
| 深刻度 | HIGH |
| 攻撃ベクトル | 述語式と言語を供給する制御メッセージ(subscribe/update)であり、そのルートが当該メッセージを dynamic-router-control エンドポイントへ転送するトランスポート上で送信されるもの |
| 影響 | 攻撃者が選択した式(クラスパス上の任意の言語)が Camel プロセスの権限で評価される — コード実行 |
| 影響を受けるバージョン | 4.4.0 から 4.18.5 未満、4.19.0 から 4.22.1 未満 |
| 修正済みバージョン | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24576 |
| クレジット | Leon Zlobecki |
アドバイザリ: https://camel.apache.org/security/CVE-2026-83531.html
述語式と言語は、デフォルトでは制御メッセージから取得されなくなりました。これらを供給する制御メッセージは、ルート作成者が dynamic-router-control エンドポイントで allowPredicateFromMessage=true を明示的に指定してオプトインしない限り拒否されます。想定される方法は、4.4.0 より前のリリースと同様に、エンドポイント URI 上で predicate と expressionLanguage を設定する(ルート作成者が制御する)ことです。
外部由来のメッセージを dynamic-router-control エンドポイントへ転送しないでください。サブスクリプションはルート作成者が制御するエンドポイントからのみ管理し、制御チャネルに到達できるトランスポートを制限してください。
このリポジトリは教育および防御目的で公開されています。Apache Camel ユーザーが脆弱性を理解し、影響を受けているかどうかを確認し、アップグレードによって解決されることを検証できるようにするためです。ペイロードは無害なマーカー Bean です。本資料を、所有または運用していないシステムに対して使用しないでください。