Apache Camelの脆弱性に対する実行可能な概念実証(PoC)再現ツールです。この脆弱性では、Knative HTTPコンシューマがコンシューマ側でexchangeが失敗した際に、結果として生じた例外をHTTPレスポンスボディとしてリモート呼び出し元に書き戻していました。これには例外のクラス名、メッセージ、完全なスタックトレースが含まれます。したがって、外部の送信者は障害を引き起こし、デプロイメントに関する内部の詳細を読み取ることができました。具体的には、クラス名やパッケージ名、例外メッセージに含まれるファイルシステム名やホスト名、ルートの構造、そして例外メッセージに接続文字列や設定が埋め込まれている場合はそのデータそのものです。camel-knativeは、CAMEL-23651によって他のHTTPコンシューマに確立されたmuteExceptionの動作に合わせられていなかった、残りのHTTPファミリーのコンシューマでした。
| ランタイム | ディレクトリ | スタック |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-knative 4.22.0(影響あり、修正版 4.22.1)、CamelのVert.x platform-httpサーバー上のコンシューマ |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-knative(Camel 4.15.0、影響あり、修正版コントロール CQ 3.40.0 / Camel 4.22.1)、Quarkus HTTP上のコンシューマ |
両方のモジュールが、影響を受ける動作および修正後の動作を実演します。
Knative HTTP ソース(コンシューマ)ルートはCloudEventを受信し、その処理中に失敗します。これは、内部エラー(データソース検索の失敗、ダウンストリームのタイムアウト、バグなど)に遭遇するあらゆるルートを代表しています。このルートはIllegalStateExceptionをスローし、そのメッセージにはシミュレートされた内部の詳細が含まれます。具体的には、偽の内部ホスト名(internal-db.prod.svc.cluster.local)、偽のJDBC URL、マーカートークンINTERNAL-DETAIL-MARKER-7F3A2Bです。攻撃者は単なるリモート呼び出し元です。適切に整形されたCloudEventを1つコンシューマにPOSTし、コンシューマが返すレスポンスを読み取ります。
at com.example... / フレームワークのスタックフレームが含まれます。muteException(デフォルトtrue)に従うようになったため、エラーステータスは返されますが、例外の詳細が呼び出し元に届くことはありません。# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: stack trace leaks; prints >>> PROVEN
docker compose down
# Patched control: rebuild with the fixed version, then run on the host
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-84180-knative-info-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: empty body; prints >>> 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.15.0): stack trace leaks; >>> PROVEN
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: empty body; >>> Not exploited
| プロパティ | 値 |
|---|---|
| コンポーネント | camel-knative (Knative HTTPコンシューマー、KnativeHttpConsumer.computeResponseBody) |
| CWE | CWE-209 (機密情報を含むエラーメッセージの生成) |
| 重大度 | MEDIUM |
| 攻撃ベクトル | リモートの呼び出し元がコンシューマー側でルート障害を引き起こし、レスポンスボディから例外の詳細を読み取る |
| 影響 | 情報漏えい: 例外のクラス/メッセージ/スタックトレース (内部ホスト名、パッケージ名、ルートの形状、埋め込まれた接続文字列) が外部の送信者に到達する |
| 影響を受けるバージョン | 4.0.0以降4.18.5未満、4.19.0以降4.22.1未満 |
| 修正済みバージョン | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24428 |
| クレジット | Claude Security Scan Tool |
アドバイザリ: https://camel.apache.org/security/CVE-2026-84180.html
KnativeHttpConsumer.computeResponseBody は、新しい
muteException オプション (コンシューマー、デフォルト true) をチェックするようになりました。ミュートされている場合、失敗した
エクスチェンジはスタックトレースではなく空のレスポンスボディ (new byte[0]) を返します。空のボディは、エラーステータスを
保持するために意図的に選択されています (null ボディの場合、呼び出し元が 204 No Content を送信してしまうため)。
以前の出力に戻すには muteException=false を設定してください。
これにより camel-knative は他の HTTP ファミリーのコンシューマーと整合します (CAMEL-23651)。
コンシューマールートに onException ハンドラーを追加し、レスポンスボディを明示的に設定する (たとえば空の
ボディや汎用的なメッセージにする) ことで、フレームワークが例外を呼び出し元に書き戻さないようにします。
このリポジトリは教育および防御目的で公開されています。Apache Camel ユーザーが脆弱性を理解し、影響を受けているかどうかを 確認し、アップグレードによって解決されることを確証できるようにするためです。失敗するルート内の「内部」ホスト名、 JDBC URL、マーカートークンは、無害な架空のローカルフィクスチャであり、実際のシークレットは含まれていません。 所有または運用していないシステムに対してこの資料を使用しないでください。