
Apache Camel の脆弱性を再現する実行可能な概念実証(PoC)です。この脆弱性では、現在のスレッドにすでにバインドされている Shiro の Subject が受信エクスチェンジと同じプリンシパルを持っている場合に、Shiro セキュリティプロセッサが資格情報の検証をスキップしていました。Camel エクスチェンジを処理するスレッドはプールから取得され、複数のエクスチェンジ間で再利用されるため、以前の認証済みエクスチェンジによってバインドされたままのサブジェクトが、自身の有効な資格情報を一切提示していない後続のエクスチェンジのチェックを満たしてしまう可能性がありました。つまり、その後続のエクスチェンジのパスワードは一度も検証されませんでした。攻撃者は、現在アクティブに使用されているプリンシパルを指定したリクエストを送信するだけで済みます。
| ランタイム | ディレクトリ | スタック |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-shiro 4.22.0(影響あり、修正版 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-shiro(Camel 4.15.0、影響あり、修正版コントロール CQ 3.40.0 / Camel 4.22.1) |
両方のモジュールが、影響を受ける動作および修正後の動作を示します。
ルートは alwaysReauthenticate=false で構築された ShiroSecurityPolicy によって保護されています。これは、認証済みサブジェクトをエクスチェンジ間で(プールされ再利用される)ワーカースレッドに意図的にバインドしたままにする、ドキュメント化されたモードです。エクスプロイトドライバは、1 つの HTTP ワーカースレッド内で、2 つのエクスチェンジを順番に実行します。
ringo による正しいパスワード starr を使った正当なリクエスト — 認証が成功し、Shiro サブジェクトがこのスレッドにバインドされたままになります(ビジーなサービスにおける以前の認証済みリクエストと同様です)。ringo を指定するが誤ったパスワード not-starr を使った攻撃者のリクエストを、同じスレッド上で実行します。AuthenticationException で拒否されます。# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: wrong password reaches protected logic; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-84181-shiro-auth-bypass-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: wrong password rejected; >>> 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): wrong password reaches protected logic
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: wrong password rejected
| プロパティ | 値 |
|---|---|
| コンポーネント | camel-shiro (ShiroSecurityProcessor.authenticateUser) |
| CWE | CWE-287 (不適切な認証) |
| 深刻度 | MEDIUM |
| 攻撃ベクトル | 再利用されたワーカースレッドに現在バインドされているプリンシパルを指定し、自身の有効な認証情報を持たないリクエスト |
| 影響 | 認証バイパス: 未認証のリクエストが既にバインド済みのプリンシパルとして受け入れられ、そのパスワードは検証されない |
| 影響を受けるバージョン | 4.0.0 から 4.18.5 未満、4.19.0 から 4.22.1 未満 |
| 修正済みバージョン | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24439 |
| クレジット | Claude Security Scan Tool |
アドバイザリ: https://camel.apache.org/security/CVE-2026-84181.html
ShiroSecurityProcessor.authenticateUser は、スレッドにバインドされたサブジェクトが既に同じプリンシパルを保持している場合にログインをスキップしなくなりました。以前のコードは currentUser.isAuthenticated() && username.equals(currentUser.getPrincipal()) でショートサーキットしていましたが、ユーザー名が一致することは、この エクスチェンジで提示されたパスワードについて何も示していません。プロセッサは現在、すべての エクスチェンジで currentUser.login(token) を呼び出すため、提示された認証情報は常に検証されます。alwaysReauthenticate は引き続きサブジェクトの rememberMe の有効期間を制御しますが、パスワードがチェックされるかどうかを左右することはなくなりました。
アップグレードできるようになるまで、すべてのエクスチェンジの終了時に Shiro サブジェクトがスレッドからクリアされるようにしてください (後続のエクスチェンジがサブジェクトを継承できないようにするため)。たとえば、Shiro の ThreadContext.unbindSubject() を呼び出す onCompletion/プロセッサを使用します。
このリポジトリは教育および防御目的で公開されています。Apache Camel ユーザーが脆弱性を理解し、影響を受けているかどうかを確認し、アップグレードによって解決されることを確証できるようにするためです。ここに含まれるユーザー、パスワード、鍵は無害なローカルフィクスチャです。この資料を、所有または運用していないシステムに対して使用しないでください。