
Reproductor de prueba de concepto para la inyección de cabecera de despacho de camel-atmosphere-websocket de Apache Camel (CVE-2026-71300), que demuestra cómo una cabecera inyectada puede redirigir los mensajes WebSocket a un destinatario elegido por el atacante.
Reproductor de prueba de concepto ejecutable para la vulnerabilidad de Apache Camel en la que el productor camel-atmosphere-websocket selecciona sus destinatarios WebSocket a partir de los encabezados de Exchange websocket.* cuyos nombres quedan fuera del espacio de nombres Camel — por lo que un HeaderFilterStrategy HTTP (que solo elimina Camel* / camel*) los admite, y un remitente externo puede tomar el control de la decisión de despacho del productor.
| Entorno de ejecución | Directorio | Stack |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-atmosphere-websocket 4.18.2 |
Camel Quarkus: no existe una extensión
camel-quarkus-atmosphere-websocket, por lo que este componente no puede ejecutarse en Camel Quarkus — el reproductor es solo para Spring Boot.
Una ruta conecta un consumidor HTTP con un productor atmosphere-websocket, entregando cada mensaje HTTP a un único
destinatario WebSocket fijado (la «víctima») mediante el propio encabezado websocket.connectionKey. Pero
WebsocketProducer.process comprueba el encabezado de lista websocket.connectionKey.list antes que el
encabezado de clave única, y ese nombre con puntos no está en el espacio de nombres Camel, por lo que el filtro de
encabezados HTTP no lo elimina. Por tanto, un encabezado websocket.connectionKey.list inyectado pasa de la petición
al Exchange y anula el destinatario fijado: el mensaje destinado a la víctima se entrega en su lugar a una conexión
elegida por el atacante.
POST /notify ──► setHeader(websocket.connectionKey = victim) ──► atmosphere-websocket producer ──► victim peer
│ ▲
└─ injected header websocket.connectionKey.list: <attacker key> ───────┘ (tested first → wins)
Sobre el banco de pruebas. El runtime de atmosphere WebSocket necesita la actualización WebSocket del contenedor de servlets y la propia inicialización del framework, lo que no puede impulsarse desde una aplicación Spring Boot independiente. Este reproductor ejercita, por tanto, la lógica real de despacho de
WebsocketProducera través de una entrada HTTP real — solo los dos peers conectados son sustitutos registrados directamente en elWebSocketStoredel endpoint (como el framework atmosphere registraría conexiones reales de navegador). La omisión del filtro de encabezados y la precedencia de despacho del productor — la vulnerabilidad real — se ejercitan de verdad.
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Salida esperada en una compilación afectada:
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
| Propiedad | Valor |
|---|---|
| Componente | camel-atmosphere-websocket (camel-atmosphere-websocket-starter) |
| CWE | CWE-20 (Improper Input Validation) → CWE-74 (Injection) |
| Vector de ataque | Un encabezado websocket.connectionKey.list (o websocket.connectionKey / websocket.sendToAll) inyectado en una petición puenteada hacia un productor atmosphere-websocket |
| Impacto | Tomar el control de la decisión de despacho del productor — entregar a / retener de peers WebSocket arbitrarios |
| Versiones afectadas | Desde 4.0.0 hasta antes de 4.14.9, desde 4.15.0 hasta antes de 4.18.4, desde 4.19.0 hasta antes de 4.22.0 |
| Versiones corregidas | 4.14.9, 4.18.4, 4.22.0 |
| JIRA | CAMEL-24359 |
| Crédito | Barak Srour (Apiiro) |
Las constantes de encabezado de despacho se renombraron al espacio de nombres Camel — CamelAtmosphereWebsocketConnectionKey,
CamelAtmosphereWebsocketConnectionKeyList, CamelAtmosphereWebsocketSendToAll — de modo que el HeaderFilterStrategy HTTP
las elimina en el límite de transporte y un remitente externo ya no puede inyectarlas. La ruta websocket relacionada de
camel-undertow está cubierta por
CVE-2026-78329.
Este repositorio se publica con fines educativos y defensivos: para ayudar a los usuarios de Apache Camel a comprender la vulnerabilidad, verificar si están afectados y confirmar que la actualización la resuelve. No utilice este material contra sistemas que no posea u opere.