
Signature 競合(署名検証バイパス)Apache Camel の脆弱性に対する実行可能な概念実証(PoC)再現ツールです。この脆弱性では、PQC プロデューサーが単一の java.security.Signature インスタンスを保持し、同期化せずにすべての exchange で使用していました。Signature はステートフルであり、スレッドセーフではありません。update() は署名または検証対象のデータを蓄積し、verify()/sign() はその蓄積された状態を消費します。並行する exchange が 1 つのインスタンスを共有すると、異なるメッセージの update 呼び出しと verify 呼び出しがインターリーブするため、検証が別の exchange に属するデータに対して完了したり、部分的にしか蓄積されていないバッファに対して完了したりする可能性があります。結果は非決定的であり、署名が実際には一度も検証されていないメッセージに対して検証成功を報告するケースも含まれ、これはこのコンポーネントが提供するために存在する保証を無効化します。この問題に到達するには、同じエンドポイントを経由する並行トラフィックのみが必要です。これは負荷がかかった状態の Camel ルートにとって通常の条件です。
| ランタイム | ディレクトリ | スタック |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-pqc 4.22.0(影響あり、修正版 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-pqc(Camel 4.22.0、影響あり、修正対照 CQ 3.40.0 / Camel 4.22.1) |
両方のモジュールが、影響を受ける動作および修正済みの動作を実演します。
ルートは各メッセージをポスト量子 ML-DSA 鍵で署名し、その後すぐに生成したばかりの署名を検証するため、すべての正当に署名されたメッセージは true で検証されなければなりません。ドライバーは、共有された pqc: プロデューサーを経由して、この sign→verify ラウンドトリップを 1024 回、並行(16 スレッド)で実行します。
true を返しません。一部は false を返し、一部は署名エンジンのエラーを発生させます。これは、並行する exchange 間で共有された単一のステートフルな Signature がインターリーブによって破損するためです。判定結果は、それが計算された対象のメッセージにもはや対応しません。(同じ競合が危険な方向に働くと、verify() が実際には対象としていないデータに対して成功してしまいます。)Signature インスタンスを使用するため、1024 回のラウンドトリップすべてが検証に成功します。# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: many of 1024 broken; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85248-pqc-signature-race-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: 0 broken; >>> 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): many broken
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: 0 broken
この競合は本質的にタイミング依存です。再現ツールは十分な並行性(1024 回のラウンドトリップ)を発生させるため、 影響を受けるビルドでは確実に再現します。影響を受ける実行で 0 broken と表示された場合は、再実行してください。
| 項目 | 値 |
|---|---|
| コンポーネント | camel-pqc(PQCProducer の署名/検証) |
| CWE | CWE-362(不適切な同期による共有リソースの並行実行) |
| 深刻度 | MEDIUM |
| 攻撃ベクトル | 同一の pqc: エンドポイントを経由する並行トラフィックが、1 つのステートフルな java.security.Signature を共有する |
| 影響 | 非決定的な署名検証。署名が実際には検証されていないメッセージに対して、検証が成功と報告される可能性がある |
| 影響を受けるバージョン | 4.12.0 から 4.18.5 より前、4.19.0 から 4.22.1 より前 |
| 修正済みバージョン | 4.18.5、4.22.1、4.23.0 |
| JIRA | CAMEL-24445 |
| クレジット | Claude Security Scan Tool |
アドバイザリ: https://camel.apache.org/security/CVE-2026-85248.html
PQCProducer は、並行するエクスチェンジ間で Signature を共有しなくなりました。プロデューサー自身がインスタンスを生成した場合は、エクスチェンジごとに新しいインスタンスを生成します(signerForExchange())。ユーザーが(JVM 全体で共有される public static final の)インスタンスを設定した場合は、そのインスタンスへのアクセスが synchronized されます。いずれの場合も、2 つのエクスチェンジが 1 つのインスタンス上で init/update/verify のシーケンスを交互に実行することはありません。
影響を受けるルートを単一の並行コンシューマーに制限し、2 つのエクスチェンジが同時に Signature インスタンスを使用しないようにしてください。
このリポジトリは教育および防御目的で公開されています。Apache Camel ユーザーが脆弱性を理解し、影響を受けているかどうかを確認し、アップグレードによって解決されることを検証できるようにするためのものです。メッセージと鍵は、無害なローカルフィクスチャです。所有または運用していないシステムに対してこの資料を使用しないでください。