
Apache Camel の脆弱性に対する実行可能な概念実証(PoC)再現プログラムです。この脆弱性では、gRPC コンシューマーの背後にあるルートが失敗した際に、ルートの例外メッセージが gRPC の Status の description にコピーされていました。ステータスの cause(withCause(...))はサーバー内に留まりますが、description は呼び出し元のクライアントに送信されるため、失敗を引き起こせる外部の呼び出し元が内部のエラーメッセージを読み取ることができました。実際には、例外メッセージに含まれるクラス名やパッケージ名、ファイルパス、ホスト名、接続の詳細などが該当します(CWE-209)。これは、同時期に公開された knative、mina、CXF のアドバイザリと同じ「ミュートされていないコンシューマー例外」ファミリーに属する gRPC 版です。
| ランタイム | ディレクトリ | スタック |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-grpc 4.22.0(影響あり、修正版 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-grpc(Camel 4.22.0、影響あり、修正版コントロール CQ 3.40.0 / Camel 4.22.1) |
両モジュールとも、実際の camel-grpc コンシューマーに対して影響を受ける動作と修正済みの動作の両方を実演します。
各モジュールは camel-grpc コンシューマー(camel-grpc 自身のテスト用 proto にある PingPong サービス)を実行し、そのルートは常に内部情報らしきメッセージで失敗します:
Internal failure contacting jdbc:postgresql://db.internal.local:5432 (user=svc_admin) [CVE-2026-85315]
検証エンドポイント /exploit/attack は外部 gRPC クライアントとして動作します。PingSyncSync を呼び出し、StatusRuntimeException を捕捉して、サーバーが返した Status コードと説明を報告します。
muteException コンシューマーオプションはデフォルトで true となるため、説明は汎用的な "Exchange processing failed" になり、実際のメッセージがサーバー外に出ることはありません(ローカル専用のステータス原因にのみ保持されます)。# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: description leaks the internal message; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85315-grpc-exception-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: description is "Exchange processing failed"; >>> Not exploited
# Camel Quarkus
cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected (Camel 4.22.0): description leaks the internal message
docker compose down
# Patched control: CQ 3.40.0 ships Camel 4.22.1
mvn clean package -Dcamel-quarkus.version=3.40.0 -Dquarkus.platform.version=3.40.0
java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: description is "Exchange processing failed"
各モジュールは同一プロセス内で 8080 上で検証サービスを提供し、50051 上で camel-grpc コンシューマーを実行します。公開されるのは 8080 のみです。
| 項目 | 値 |
|---|---|
| コンポーネント | camel-grpc (GrpcMethodHandler、コンシューマー) |
| CWE | CWE-209 (機密情報を含むエラーメッセージの生成) |
| 深刻度 | MEDIUM |
| 攻撃ベクトル | 外部の gRPC クライアントがルート障害を引き起こし、送信される Status の説明を読み取る |
| 影響 | 内部エラーの詳細 (クラス名/パッケージ名、パス、ホスト名、接続の詳細) が呼び出し元に開示される |
| 影響を受けるバージョン | 4.0.0 から 4.18.5 未満、4.19.0 から 4.22.1 未満 |
| 修正済みバージョン | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24478 |
| クレジット | Claude Security Scan Tool |
アドバイザリ: https://camel.apache.org/security/CVE-2026-85315.html
影響を受ける Quarkus モジュールは CQ 3.39.0 (Camel 4.22.0) 上でビルドされています。修正済みの制御は CQ 3.40.0 (Camel 4.22.1) です。
GrpcMethodHandler は muteException コンシューマーオプション (デフォルトは
true) を追加します。有効にすると、失敗したエクスチェンジは送信されるステータスにおいて汎用的な説明
"Exchange processing failed" を返します。ルートの例外は引き続きローカルで withCause(...) を介して付加されますが、
これは gRPC によってクライアントには送信されません。以前の動作に戻すには、エンドポイントで muteException=false を設定してください。
onException ハンドラー内で明示的なステータスに失敗をマッピングし、フレームワークが例外メッセージを
説明にコピーしないようにします。
このリポジトリは教育および防御目的で公開されています。Apache Camel ユーザーが脆弱性を理解し、影響を受けているかどうかを確認し、アップグレードによって解決されることを確証できるようにするためです。「内部」メッセージは無害なプレースホルダー (db.internal.local、svc_admin) であり、デモ全体は単一プロセス内で実行されます。所有または運用していないシステムに対してこの資料を使用しないでください。