
Riproduttore proof-of-concept per l'iniezione nell'header di dispatch di Apache Camel camel-atmosphere-websocket (CVE-2026-71300), che dimostra come un header iniettato possa reindirizzare i messaggi WebSocket a un destinatario scelto dall'attaccante.
Riproduttore proof-of-concept eseguibile per la vulnerabilità Apache Camel in cui il
producer camel-atmosphere-websocket seleziona i destinatari WebSocket dagli header Exchange websocket.* con nomi che ricadono al di fuori del
namespace Camel — quindi una HeaderFilterStrategy HTTP (che rimuove solo Camel* / camel*) li ammette, e un
mittente esterno può assumere il controllo della decisione di dispatch del producer.
| Runtime | Directory | Stack |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-atmosphere-websocket 4.18.2 |
Camel Quarkus: non esiste un'estensione
camel-quarkus-atmosphere-websocket, quindi questo componente non può essere eseguito su Camel Quarkus — il riproduttore è solo per Spring Boot.
Una route collega un consumatore HTTP a un producer atmosphere-websocket, consegnando ogni messaggio HTTP a un singolo
destinatario WebSocket fisso (la "vittima") impostando l'header websocket.connectionKey stesso. Ma
WebsocketProducer.process verifica l'header list websocket.connectionKey.list prima dell'header a chiave singola,
e quel nome puntato non è nel namespace Camel, quindi il filtro header HTTP non lo rimuove. Un
header websocket.connectionKey.list iniettato passa quindi dalla richiesta all'Exchange e sovrascrive
il destinatario fisso — il messaggio destinato alla vittima viene consegnato a una connessione scelta dall'attaccante.
POST /notify ──► setHeader(websocket.connectionKey = victim) ──► atmosphere-websocket producer ──► victim peer
│ ▲
└─ injected header websocket.connectionKey.list: <attacker key> ───────┘ (tested first → wins)
Sull'harness di test. Il runtime WebSocket di atmosphere richiede l'upgrade WebSocket del container servlet e l'inizializzazione propria del framework, che non possono essere pilotati da una semplice applicazione Spring Boot standalone. Questo riproduttore esercita quindi la reale logica di dispatch di
WebsocketProducerattraverso un vero ingresso HTTP — solo i due peer connessi sono sostituti registrati direttamente nelloWebSocketStoredell'endpoint (come il framework atmosphere registrerebbe reali connessioni browser). Il bypass del filtro header e la precedenza di dispatch del producer — la vera vulnerabilità — vengono esercitati realmente.
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Output atteso su una build affetta:
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
| Proprietà | Valore |
|---|---|
| Componente | camel-atmosphere-websocket (camel-atmosphere-websocket-starter) |
| CWE | CWE-20 (Improper Input Validation) → CWE-74 (Injection) |
| Vettore d'attacco | Un header iniettato websocket.connectionKey.list (o websocket.connectionKey / websocket.sendToAll) su una richiesta inoltrata a un producer atmosphere-websocket |
| Impatto | Assumere il controllo della decisione di dispatch del producer — consegnare a / trattenere da peer WebSocket arbitrari |
| Versioni interessate | Dalla 4.0.0 precedente alla 4.14.9, dalla 4.15.0 precedente alla 4.18.4, dalla 4.19.0 precedente alla 4.22.0 |
| Versioni corrette | 4.14.9, 4.18.4, 4.22.0 |
| JIRA | CAMEL-24359 |
| Credit | Barak Srour (Apiiro) |
Le costanti degli header di dispatch sono state rinominate nel namespace Camel — CamelAtmosphereWebsocketConnectionKey,
CamelAtmosphereWebsocketConnectionKeyList, CamelAtmosphereWebsocketSendToAll — così la HeaderFilterStrategy HTTP
le rimuove al confine del trasporto e un mittente esterno non può più iniettarle. Il percorso websocket correlato
di camel-undertow è coperto da
CVE-2026-78329.
Questo repository è pubblicato a scopi educativi e difensivi: per aiutare gli utenti di Apache Camel a comprendere la vulnerabilità, verificare se sono interessati e confermare che l'aggiornamento la risolve. Non utilizzare questo materiale contro sistemi che non possiedi o che non gestisci.