
Apache Camel の脆弱性に対する実行可能な概念実証(PoC)再現プログラムです。この脆弱性では、camel-keycloak の
KeycloakSecurityProcessor が、イントロスペクトされたトークンの issuer を、イントロスペクション応答に実際に
iss クレームが含まれている場合にのみ検証していました。クレームが存在しない場合、チェックは失敗として扱われず
スキップされていたため、設定された issuer が発行していないトークンでも、イントロスペクションエンドポイントが
issuer を明示せずに active と応答しさえすれば受け入れられる可能性がありました。iss を省略するエンドポイントに
対してイントロスペクションを行い、かつ複数の issuer を扱うデプロイでは、本来拒否すべき呼び出し元を認証してしまう
という結果になります(CWE-287)。
| ランタイム | ディレクトリ | スタック |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-keycloak 4.22.0(影響あり、修正版 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-keycloak(Camel 4.22.0、影響あり、修正対照 CQ 3.40.0 / Camel 4.22.1) |
両モジュールとも、実際の KeycloakSecurityProcessor に対して影響を受ける動作と修正済みの動作の両方を
実演します。
ドライバは validateIssuer=true(期待する issuer は
http://localhost:8080/realms/test-realm)で KeycloakSecurityPolicy を設定し、トークンを active と報告しつつ
iss クレームを返さないトークンイントロスペクタを使用します。これはブローカー/ゲートウェイのイントロスペクション
エンドポイントが生成する内容とまさに同じです。RFC 7662 では iss は任意であるためです。続いて
Authorization: Bearer <attacker-token> ヘッダを付けて KeycloakSecurityProcessor を駆動し、保護されたルートに
到達するかどうかを報告します。
iss の欠落によりプロセッサが issuer チェックをスキップするため、トークンが受け入れられ、
ルートに到達します。つまり、意図しない issuer からのトークンが認証されてしまいます。iss の欠落は検証失敗となります。プロセッサは CamelAuthorizationException
("Token issuer missing…")をスローし、ルートには決して到達しません。# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: route reached, token accepted; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85301-keycloak-issuer-bypass-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: CamelAuthorizationException "Token issuer missing"; >>> 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): route reached, token accepted
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: CamelAuthorizationException "Token issuer missing"
| プロパティ | 値 |
|---|---|
| コンポーネント | camel-keycloak (KeycloakSecurityProcessor.validateIssuerFromIntrospection) |
| CWE | CWE-287 (不適切な認証) |
| 重大度 | MEDIUM |
| 攻撃ベクトル | 意図しない発行者からのトークンが、iss を省略し複数の発行者に対応するエンドポイントに対してイントロスペクトされ、かつ validateIssuer=true の場合 |
| 影響 | 設定された発行者が発行していないトークンを持つ呼び出し元を、デプロイメントが認証してしまう |
| 影響を受けるバージョン | 4.15.0 から 4.18.5 未満、4.19.0 から 4.22.1 未満 |
| 修正済みバージョン | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24448 |
| クレジット | Claude Security Scan Tool |
アドバイザリ: https://camel.apache.org/security/CVE-2026-85301.html
影響を受ける Quarkus モジュールは CQ 3.39.0 (Camel 4.22.0) 上に構築されており、
camel-quarkus-keycloakは 影響を受ける Camel バージョンに対応します。修正済みの制御は CQ 3.40.0 (Camel 4.22.1) です。
KeycloakSecurityProcessor は、iss クレームが存在しない場合を
検証失敗として扱うようになりました。発行者検証が有効で、イントロスペクション結果に発行者が含まれていない場合、
早期にリターンしてリクエストを通過させるのではなく、CamelAuthorizationException をスローします。以前のコードは
クレームが欠落している場合に比較をスキップしていたため、発行者を名指ししていないトークンに限って発行者が未検証の
ままになっていました。
イントロスペクションエンドポイントが iss クレームを返し、単一の発行者にのみ対応するようにしてください。そうすれば、
他の発行者からのトークンは名前が示される(そして拒否される)か、アクティブとしてイントロスペクトされることが
なくなります。
このリポジトリは教育および防御目的で公開されています。Apache Camel ユーザーが脆弱性を理解し、影響を受けているか どうかを確認し、アップグレードによって解決されることを確かめるためのものです。トークンイントロスペクターは インプロセスのスタブであり、実際の Keycloak サーバーやネットワーク呼び出しは関与しません。「攻撃者トークン」は 不透明なプレースホルダー文字列です。所有または運用していないシステムに対してこの資料を使用しないでください。