Apache Camel の脆弱性に対する実行可能な概念実証(PoC)再現ツールです。この脆弱性では、ルートを保護する camel-oauth プロセッサが、認証を完了できなかった場合にエクスチェンジを停止しませんでした。認証済みセッションの確立に失敗した場合、ルーティングを終了してエラーを返すべきところで、プロセッサはレスポンスコードを設定するものの制御をルートに戻してしまいました。そのため、リクエストは認証が成功したかのように保護されたエンドポイントへと続行されました。その結果がフェイルオープン認証ガードです。未認証の呼び出し元が、特別な設定なしに、通常のリクエスト経路で、ルートが次に行う処理に到達できてしまいます。
| ランタイム | ディレクトリ | スタック |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-oauth 4.22.0(影響あり、修正版 4.22.1)、HTTP は camel-undertow 経由 |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-oauth 3.39.0(Camel 4.22.0、影響あり、修正版コントロール 3.40.0 / Camel 4.22.1)、HTTP は camel-quarkus-platform-http 経由 |
両モジュールとも、影響を受ける動作および修正後の動作を実演します。(Spring Boot モジュールは HTTP トランスポートとして camel-undertow を使用しています。ガードはトランスポートに依存せず、camel-platform-http-starter 4.22.0 は 3.5.x とは異なる Spring Boot ライン向けにビルドされているためです。)
ルートは /protected を公開し、OAuthBearerTokenProcessor によって保護されています。認証済みのリクエストのみが、後続の保護されたステップに到達できるべきです。攻撃者は Authorization ヘッダーなしで GET /protected を送信します。
exchange.setRouteStop(true) なしで戻ったため、ルートは保護されたステップへとフォールスルーしました → HTTP 200 と保護されたボディ。rejectUnauthorized(...) を呼び出し、401 を返してルートを停止します → 保護されたステップは実行されません。cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
影響を受けたビルドで期待される出力:
Sent: GET /protected (NO Authorization header)
Response status: 200
Response body : PROTECTED-DATA: reached the protected endpoint WITHOUT authenticating
>>> PROVEN: the OAuth guard failed open ...
修正済みビルドでは、Response status: 401、ボディは Authorization header となり、保護されたステップは一切実行されませんでした。
| 項目 | 値 |
|---|---|
| コンポーネント | camel-oauth(ルートガードプロセッサ、例: OAuthBearerTokenProcessor) |
| CWE | CWE-287(不適切な認証) |
| 深刻度 | HIGH |
| 攻撃ベクトル | 認証を完了できない状態(ここでは Authorization ヘッダーなし)で、OAuth で保護されたルートへ通常のリクエストを送信する |
| 影響 | 保護されたエンドポイントへの未認証アクセス(認証バイパス) |
| 影響を受けるバージョン | 4.11.0 から 4.18.5 より前、4.19.0 から 4.22.1 より前 |
| 修正済みバージョン | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24411 |
| クレジット | Claude Security Scan Tool |
アドバイザリ: https://camel.apache.org/security/CVE-2026-80312.html
ガードプロセッサは、認証を完了できないすべての経路で rejectUnauthorized(...) / reject(...) を呼び出すようになりました。これにより HTTP ステータス(401)を設定すると同時に exchange.setRouteStop(true) を呼び出すため、プロセッサが認証しなかったリクエストに対して後続のステップは実行されません。「認証情報の欠如は、少なくとも無効な認証情報と同程度に強く拒否されなければならない。」
アップグレードできるようになるまで、ガードの後に明示的な認可チェックを配置するか、CamelOAuthUserProfile 交換プロパティが存在しない場合にルートが終了するようにしてください。
このリポジトリは教育および防御目的で公開されています。Apache Camel ユーザーが脆弱性を理解し、影響を受けているかどうかを確認し、アップグレードによって解決されることを検証できるようにするためのものです。所有または運用していないシステムに対してこの資料を使用しないでください。