
Reproducteur exécutable Spring Boot et Quarkus pour CVE-2026-85248, une condition de concurrence sur Signature dans camel-pqc provoquant un contournement de la vérification de signature ML-DSA, avec des builds affectés et corrigés.
Signature (contournement de la vérification de signature)Reproducteur de preuve de concept exécutable pour la vulnérabilité Apache Camel où le producteur PQC détenait une unique
instance java.security.Signature et l'utilisait pour chaque échange sans synchronisation. Signature est à état
et non thread-safe : update() accumule les données à signer ou à vérifier, et verify()/sign() consomment cet
état accumulé. Avec des échanges concurrents partageant une seule instance, les appels update et verify de messages différents
s'entrelacent, de sorte qu'une vérification peut s'achever sur des données appartenant à un autre échange, ou sur un tampon
partiellement accumulé. Le résultat est non déterministe et inclut une vérification rapportant un succès pour un message
dont la signature n'a jamais été réellement contrôlée, ce qui anéantit la garantie que le composant est censé fournir. L'atteindre
ne nécessite qu'un trafic concurrent à travers le même endpoint — la condition ordinaire d'une route Camel sous charge.
| Runtime | Répertoire | Pile |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-pqc 4.22.0 (affecté ; corrigé en 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-pqc (Camel 4.22.0, affecté ; contrôle corrigé CQ 3.40.0 / Camel 4.22.1) |
Les deux modules démontrent le comportement affecté et le comportement corrigé.
Une route signe chaque message avec une clé post-quantique ML-DSA puis vérifie immédiatement la signature qu'elle vient de
produire, de sorte que chaque message légitimement signé doit être vérifié true. Le pilote exécute 1024 de ces allers-retours
signature→vérification de manière concurrente (16 threads) à travers les producteurs pqc: partagés.
true — certaines retournent false, d'autres lèvent
des erreurs du moteur de signature — parce que l'unique Signature à état partagé entre des échanges concurrents est corrompu par
l'entrelacement. Un verdict ne correspond plus au message pour lequel il a été calculé. (La même course, dans la direction
dangereuse, permet à un verify() de réussir pour des données qu'il n'a jamais couvertes.)Signature.# 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
La course dépend, par nature, du timing ; le reproducteur génère suffisamment de concurrence (1024 allers-retours) pour qu'elle se manifeste de manière fiable sur la version affectée. Si une exécution sur une version affectée affiche un jour 0 cassé, relancez-la.
| Propriété | Valeur |
|---|---|
| Composant | camel-pqc (signature/vérification de PQCProducer) |
| CWE | CWE-362 (Exécution concurrente utilisant une ressource partagée avec une synchronisation inappropriée) |
| Gravité | MOYENNE |
| Vecteur d'attaque | Trafic concurrent via le même endpoint pqc: partageant une seule instance avec état de java.security.Signature |
| Impact | Vérification de signature non déterministe ; une vérification peut signaler un succès pour un message dont la signature n'a jamais été contrôlée |
| Versions affectées | De 4.12.0 avant 4.18.5, de 4.19.0 avant 4.22.1 |
| Versions corrigées | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24445 |
| Crédit | Claude Security Scan Tool |
Avis de sécurité : https://camel.apache.org/security/CVE-2026-85248.html
PQCProducer ne partage plus la Signature entre des
échanges concurrents. Lorsque le producer créait lui-même l'instance, il en crée désormais une nouvelle par échange
(signerForExchange()) ; lorsque l'utilisateur a configuré une instance (à l'échelle de la JVM, public static final), l'accès à celle-ci est
synchronized. Dans les deux cas, deux échanges n'entrelacent plus leurs séquences init/update/verify sur une même instance.
Restreignez la route affectée à un seul consommateur concurrent afin que deux échanges n'utilisent jamais l'instance Signature en
même temps.
Ce dépôt est publié à des fins éducatives et défensives : pour aider les utilisateurs d'Apache Camel à comprendre la vulnérabilité, à vérifier s'ils sont affectés et à confirmer que la mise à jour la résout. Les messages et les clés sont des fixtures locales inertes. N'utilisez pas ce contenu contre des systèmes que vous ne possédez pas ou n'exploitez pas.