
Preuve de concept exécutable Spring Boot et Quarkus reproduisant CVE-2026-85296, une confusion de clé de signature MDN entre partenaires dans camel-as2 (CWE-488), avec des builds affectés et corrigés.
Reproducteur de preuve de concept exécutable pour la vulnérabilité Apache Camel où le matériel de signature par requête était conservé dans un
état partagé entre les requêtes plutôt que confiné à la requête en cours de traitement. Un unique ResponseMDN est
enregistré sur le HttpProcessor partagé et sert chaque requête AS2 ; dans la configuration à clés dynamiques (un partenaire
commercial par chemin, chacun avec ses propres clés résolues par requête depuis le HttpContext), la version affectée écrivait la
clé de signature résolue par requête dans un champ d'instance. Lorsqu'un déploiement sert plus d'un partenaire,
des requêtes concurrentes ou successives pouvaient donc observer le matériel les unes des autres, et une Message Disposition
Notification pouvait être signée avec la clé d'un autre partenaire commercial. Les déploiements AS2 sont typiquement
multi-partenaires par conception, la condition est donc atteinte par un trafic concurrent ordinaire.
| Runtime | Répertoire | Pile |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-as2 4.22.0 (affecté ; corrigé en 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-as2 (Camel 4.22.0, affecté ; contrôle corrigé CQ 3.40.0 / Camel 4.22.1) |
Les deux modules démontrent le comportement affecté ainsi que le comportement corrigé.
Le pilote utilise le véritable ResponseMDN (l'intercepteur de réponse AS2) dans sa forme à clés dynamiques. Il résout tour à tour le matériel de signature de deux
partenaires — le partenaire A, puis le partenaire B — via ResponseMDN.process(...) (chacun avec la clé RSA de ce
partenaire dans le HttpContext), et lit le champ signingPrivateKey de l'instance après chacun.
final et n'est jamais écrit ; la clé par requête reste confinée à la requête, de sorte que le champ
signingPrivateKey de l'instance partagée reste null.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: per-request key on the shared instance; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85296-as2-signing-key-confusion-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: field stays null; >>> 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): per-request key on the shared instance
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: field stays null
| Propriété | Valeur |
|---|---|
| Composant | camel-as2 (gestion des clés dynamiques de ResponseMDN) |
| CWE | CWE-488 (Exposition d'un élément de données à une mauvaise session) |
| Gravité | MOYENNE |
| Vecteur d'attaque | Trafic AS2 concurrent ordinaire sur un déploiement multi-partenaires partageant une même instance ResponseMDN |
| Impact | Une Message Disposition Notification signée avec la clé privée d'un autre partenaire commercial ; réutilisation du matériel de signature entre partenaires |
| Versions affectées | À partir de 4.0.0 avant 4.18.5, à partir de 4.19.0 avant 4.22.1 |
| Versions corrigées | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24429 |
| Crédit | Claude Security Scan Tool |
Avis de sécurité : https://camel.apache.org/security/CVE-2026-85296.html
Le module Quarkus affecté est construit sur CQ 3.39.0 (Camel 4.22.0) : le mécanisme dynamique de clé de signature AS2 par requête exercé par ce PoC est postérieur à CQ 3.29.0 (Camel 4.15.0), donc CQ 3.39.0 embarque le même Camel 4.22.0 que le module Spring Boot.
ResponseMDN rend les champs de sécurité configurés final et résout
le matériel dynamique par requête dans des variables locales au sein de process(), sans jamais le réécrire dans
les champs d'instance. Une instance unique partagée ne peut donc plus faire fuiter la clé de signature d'une requête
vers une autre requête.
Exécutez un contexte Camel distinct par partenaire commercial afin qu'aucun matériel de signature ne soit partagé entre eux.
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 paires de clés RSA sont générées en cours d'exécution pour la démonstration et sont inertes. N'utilisez pas ce matériel contre des systèmes que vous ne possédez pas ou n'exploitez pas.