
Reproducteur de preuve de concept pour l'injection d'en-tête de dispatch dans Apache Camel camel-atmosphere-websocket (CVE-2026-71300), démontrant comment un en-tête injecté peut rediriger les messages WebSocket vers un destinataire choisi par l'attaquant.
Reproducteur de preuve de concept exécutable pour la vulnérabilité Apache Camel où le producteur camel-atmosphere-websocket
sélectionne ses destinataires WebSocket à partir des en-têtes Exchange websocket.* dont les noms se situent en dehors de
l'espace de noms Camel — si bien qu'une HeaderFilterStrategy HTTP (qui ne supprime que Camel* / camel*) les laisse passer,
et qu'un émetteur externe peut prendre le contrôle de la décision de répartition du producteur.
| Runtime | Répertoire | Stack |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-atmosphere-websocket 4.18.2 |
Camel Quarkus : il n'existe pas d'extension
camel-quarkus-atmosphere-websocket, donc ce composant ne peut pas être exécuté sur Camel Quarkus — le reproducteur est exclusivement Spring Boot.
Une route fait le pont entre un consommateur HTTP et un producteur atmosphere-websocket, délivrant chaque message HTTP à un seul
destinataire WebSocket épinglé (la « victime ») en définissant elle-même l'en-tête websocket.connectionKey. Mais
WebsocketProducer.process teste l'en-tête liste websocket.connectionKey.list avant l'en-tête à clé unique,
et ce nom à points ne se trouve pas dans l'espace de noms Camel ; le filtre d'en-têtes HTTP ne le supprime donc pas. Un
en-tête websocket.connectionKey.list injecté passe ainsi de la requête dans l'Exchange et remplace le destinataire épinglé —
le message destiné à la victime est délivré, à la place, à une connexion choisie par l'attaquant.
POST /notify ──► setHeader(websocket.connectionKey = victim) ──► atmosphere-websocket producer ──► victim peer
│ ▲
└─ injected header websocket.connectionKey.list: <attacker key> ───────┘ (tested first → wins)
À propos du harnais de test. Le runtime WebSocket d'atmosphere nécessite l'upgrade WebSocket du conteneur de servlets et l'initialisation propre au framework, ce qui ne peut pas être piloté depuis une simple application Spring Boot autonome. Ce reproducteur exerce donc la logique de répartition réelle du
WebsocketProducervia un point d'entrée HTTP réel — seuls les deux pairs connectés sont des substituts enregistrés directement dans leWebSocketStorede l'endpoint (comme le framework atmosphere enregistrerait de vraies connexions navigateur). Le contournement du filtre d'en-têtes et la précédence de répartition du producteur — la vulnérabilité proprement dite — sont réellement exercés.
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Sortie attendue sur une build affectée :
1) Benign POST /notify (no injected header):
victim received: [hello for the victim]
attacker received: []
2) Injected POST /notify with header 'websocket.connectionKey.list: attacker-connection-key':
victim received: []
attacker received: [private data meant for the victim, ...]
>>> PROVEN: ... delivering a message meant for the victim to an attacker-chosen WebSocket connection instead: true
| Propriété | Valeur |
|---|---|
| Composant | camel-atmosphere-websocket (camel-atmosphere-websocket-starter) |
| CWE | CWE-20 (Validation incorrecte des entrées) → CWE-74 (Injection) |
| Vecteur d'attaque | Un en-tête websocket.connectionKey.list (ou websocket.connectionKey / websocket.sendToAll) injecté sur une requête relayée vers un producteur atmosphere-websocket |
| Impact | Prendre le contrôle de la décision de répartition du producteur — délivrer des messages à des pairs WebSocket arbitraires ou les leur retenir |
| Versions affectées | De 4.0.0 à avant 4.14.9, de 4.15.0 à avant 4.18.4, de 4.19.0 à avant 4.22.0 |
| Versions corrigées | 4.14.9, 4.18.4, 4.22.0 |
| JIRA | CAMEL-24359 |
| Crédit | Barak Srour (Apiiro) |
Avis de sécurité : https://camel.apache.org/security/CVE-2026-71300.html
Les constantes d'en-tête de répartition ont été renommées dans l'espace de noms Camel — CamelAtmosphereWebsocketConnectionKey,
CamelAtmosphereWebsocketConnectionKeyList, CamelAtmosphereWebsocketSendToAll — afin que la HeaderFilterStrategy HTTP
les supprime à la frontière de transport et qu'un émetteur externe ne puisse plus les injecter. Le chemin websocket apparenté
de camel-undertow est couvert par
CVE-2026-78329.
Ce dépôt est publié à des fins pédagogiques et défensives : aider les utilisateurs d'Apache Camel à comprendre la vulnérabilité, vérifier s'ils sont affectés et confirmer que la mise à niveau la résout. N'utilisez pas ce matériel contre des systèmes que vous ne possédez pas ou n'exploitez pas.