
Reproductor de prueba de concepto para la omisión del filtro de cabeceras camel-undertow de Apache Camel (CVE-2026-78329), que demuestra la inyección de cabeceras websocket.* y proporciona detalles de las versiones afectadas y verificación de la corrección.
websocket.*)Reproductor ejecutable de prueba de concepto para la vulnerabilidad de Apache Camel en la que UndertowEndpoint usaba por defecto como headerFilterStrategy la base HttpHeaderFilterStrategy y empujaba esa instancia al UndertowHttpBinding que crea, sobrescribiendo el UndertowHeaderFilterStrategy que instala DefaultUndertowHttpBinding. Salvo que un despliegue proporcionara un binding personalizado o un headerFilterStrategy explícito, el filtrado específico de undertow nunca se ejecutaba: el objeto de estrategia se construía y se reemplazaba inmediatamente antes de que pudiera consultarse.
| Entorno de ejecución | Directorio | Stack |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-undertow 4.18.2 |
Camel Quarkus: no existe una extensión
camel-quarkus-undertow(Quarkus usa su propia pila HTTP Vert.x), por lo que este componente no se puede ejecutar en Camel Quarkus: el reproductor es solo para Spring Boot.
La consecuencia es que el prefijo heredado websocket. de las cabeceras del Exchange no se filtra en el límite del transporte undertow en ninguna de las dos direcciones. Por lo tanto, un consumidor HTTP undertow mapea las cabeceras entrantes de la línea con esa forma (websocket.connectionKey, websocket.connectionKey.list, websocket.sendToAll, …) hacia el Exchange, donde un productor WebSocket undertow las lee como directivas de despacho y puede ser inducido a entregar a un peer distinto del que la ruta pretendía: la misma clase de secuestro de despacho que el atmosphere-websocket CVE-2026-71300.
Este reproductor envía una solicitud HTTP con cabeceras de despacho websocket.* además de una cabecera de control Camel*, y muestra lo que realmente llegó al Exchange: las cabeceras websocket.* cruzan el límite (sin filtrar), mientras que Camel* se elimina, lo que demuestra que el filtro base (no el de undertow) estaba activo.
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:
What actually reached the Exchange, as echoed by the undertow route:
websocket.connectionKey.list on Exchange = [attacker-connection-key]
websocket.sendToAll on Exchange = [true]
CamelFoo on Exchange (control) = []
>>> PROVEN: the undertow endpoint applied the base HttpHeaderFilterStrategy (Camel* filtered) instead of the
>>> UndertowHeaderFilterStrategy, so the legacy websocket.* dispatch headers passed onto the Exchange ...
| Propiedad | Valor |
|---|---|
| Componente | camel-undertow (camel-undertow-starter) |
| CWE | CWE-20 (Validación de entrada incorrecta) → CWE-74 (Inyección) |
| Vector de ataque | Cabeceras websocket.* entrantes en un consumidor HTTP undertow, leídas como directivas de despacho por un productor WebSocket undertow |
| Impacto | Tomar el control de la decisión de despacho del productor WebSocket: entregar a / retener mensajes de peers WebSocket arbitrarios |
| Versiones afectadas | Desde 4.11.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-24360 |
| Créditos | Andrea Cosentino (Apache Software Foundation); Barak Srour (Apiiro) |
El endpoint undertow ya no sobrescribe el UndertowHeaderFilterStrategy del binding, que filtra el prefijo websocket. (añadido en CAMEL-23588) en ambas direcciones; por lo tanto, las cabeceras de despacho se eliminan en el límite del transporte y un emisor externo ya no puede inyectarlas.
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.