
stateの欠落)Apache Camelの脆弱性に対する実行可能な概念実証(PoC)再現ツールです。この脆弱性では、OAuth認可コードコールバックが、フローを開始した認可リクエストに紐付けるstateパラメータを保持しておらず、また検証もしていませんでした。そのため、任意のブラウザで取得した認可コードをコールバックで引き換えることができ、それを提示したセッションに紐付けられてしまいました — ログインクロスサイトリクエストフォージェリです。被害者は攻撃者が制御するIDとして知らないうちにサインインさせられ、その後の被害者の操作やデータが攻撃者のアカウントに流れ込みます。(同じ未検証のコールバックにより、認証後のリダイレクト先も影響を受ける可能性がありました — オープンリダイレクトです。)アドバイザリが指摘するように、stateチェックはコードが引き換えられる前に実行されるため、この差異はIDプロバイダとのやり取りなしに到達可能です。
| ランタイム | ディレクトリ | スタック |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-oauth 4.22.0(影響あり、修正版 4.22.1)、コールバックは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)、コールバックはcamel-quarkus-platform-http経由 |
両モジュールとも、影響を受ける動作および修正後の動作を実演します。
実際の未改変のOAuthCodeFlowCallbackプロセッサがコールバックエンドポイントを処理します。Camelレジストリに小さな**スタブOAuth**が登録されているため、コールバックは実際のIDプロバイダなしで動作します — これはIdPの代役にすぎず、認可コードが引き換えられた時点を記録します(実際のフローでは、これにより結果のIDが提示元のセッションに紐付けられます)。攻撃者は単にcodeを付けて、一致するstateなしでコールバックにアクセスするだけです:
stateを要求します) — コードは決して引き換えられません。cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
影響を受けたビルドで期待される出力:
Request: GET /callback?code=ATTACKER-SUPPLIED-AUTH-CODE (no 'state' parameter)
Callback HTTP status: 302
>>> PROVEN: the callback redeemed the authorization code ... WITHOUT verifying a state parameter ... login CSRF.
| 項目 | 値 |
|---|---|
| コンポーネント | camel-oauth(authorization-code コールバック、OAuthCodeFlowCallback) |
| CWE | CWE-352(クロスサイトリクエストフォージェリ) |
| 深刻度 | MEDIUM |
| 攻撃ベクトル | セッションの認可リクエストに紐づかない state を持たない認可コードを伴うコールバックリクエスト |
| 影響 | ログイン CSRF(被害者が攻撃者の制御する ID としてサインインさせられる)、信頼されたオリジンからのオープンリダイレクト |
| 影響を受けるバージョン | 4.11.0 から 4.18.5 より前、4.19.0 から 4.22.1 より前 |
| 修正済みバージョン | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24437 |
| クレジット | Claude Security Scan Tool |
アドバイザリ: https://camel.apache.org/security/CVE-2026-84178.html
コールバックは、セッションが開始した認可リクエストに紐づく単一使用の state パラメータを保持し、検証するようになりました: expectedState = session.removeValue(OAUTH_STATE) を state クエリパラメータと(定数時間で)比較します。フローが進行中でない場合、または state が一致しない場合、コールバックはコードを引き換える前にリクエストを拒否します。
アップグレードできるようになるまで、コールバックを CSRF の state バインディングを強制するコンポーネントの背後に配置するか、セッション確立のために OAuth コードフローのコールバックに依存しないようにしてください。
このリポジトリは教育および防御目的で公開されています: Apache Camel ユーザーが脆弱性を理解し、影響を受けているかどうかを確認し、アップグレードによって解決されることを確証できるようにするためです。スタブの ID プロバイダーと「攻撃者コード」は不活性なローカルフィクスチャです。この資料を、所有または運用していないシステムに対して使用しないでください。