
Reproductores de prueba de concepto para la inyección de encabezados CloudEvent estructurados en Apache Camel camel-knative (CVE-2026-63621), que demuestran la inyección de encabezados mediante campos de extensión maliciosos en los runtimes de Spring Boot y Quarkus.
Reproductores de prueba de concepto ejecutables para la misma vulnerabilidad de Apache Camel, uno por runtime:
| Runtime | Directorio | Stack | Estilo |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-knative 4.18.2 | decodificación directa (ver nota) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.36.0 + Camel Quarkus 3.36.0 (incluye Camel 4.20.0) | fuente knative totalmente impulsada por HTTP |
Ambas son versiones afectadas (el problema se corrige en 4.14.9 / 4.18.4 / 4.22.0) y ambas demuestran el mismo
defecto: el consumidor camel-knative acepta CloudEvents en dos modos de contenido. En el modo binario, los atributos
llegan como cabeceras HTTP y se asignan a través de un HeaderFilterStrategy, por lo que las cabeceras Camel* se
descartan. En el modo estructurado (Content-Type: application/cloudevents+json), todo el evento es un cuerpo JSON,
y la compilación afectada asigna cada campo de extensión de ese JSON a las cabeceras del mensaje con
setHeader(key.toLowerCase(Locale.US), value) y sin HeaderFilterStrategy. Los nombres de extensión los elige el
remitente, por lo que un atacante puede establecer una cabecera de control interna de Camel. Aquí, la extensión inyectada
camelsqlquery se convierte en la cabecera CamelSqlQuery (las cabeceras de Camel no distinguen mayúsculas de
minúsculas), es decir, la sentencia que ejecutaría un productor camel-sql (inyección de cabecera → CWE-74).
Nota sobre la variante Spring Boot. El transporte HTTP de knative está basado en Vert.x y se utiliza en despliegues de camel-main / Camel Quarkus. Una aplicación servlet de Spring Boot no aloja ese transporte, por lo que el reproductor de Spring Boot ejecuta directamente la decodificación vulnerable exacta (
CloudEventProcessors.fromSpecVersion("1.0").consumer(...)) — el mismo camino de código que una solicitud entranteapplication/cloudevents+jsonrecorre dentro del consumidor knative. La variante Camel Quarkus es el reproductor completamente impulsado por HTTP (POST de un CloudEvent a la fuente en vivo).
cd camel-spring-boot # or: cd camel-quarkus
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 (ambas variantes):
1) Benign structured CloudEvent (no extension):
CamelSqlQuery ... = [null]
2) Malicious structured CloudEvent (injected extension 'camelsqlquery'):
CamelSqlQuery ... = [SELECT * FROM secrets WHERE 1=1 -- injected-by-attacker]
>>> PROVEN: ... a camel-sql producer downstream would execute this attacker-supplied statement: true
| Propiedad | Valor |
|---|---|
| Componente | camel-knative (Spring Boot: camel-knative; Quarkus: camel-quarkus-knative) |
| CWE | CWE-20 (Validación de entrada incorrecta) → CWE-74 (Inyección) |
| Vector de ataque | Un CloudEvent en modo estructurado (application/cloudevents+json) con un campo de extensión elegido por el atacante |
| Impacto | Inyección de cabeceras de control internas de Camel en el Exchange (aquí CamelSqlQuery) |
| Versiones afectadas | Desde 3.15.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-24084 |
| Crédito | Andrea Cosentino (Apache Software Foundation) |
El mapeo de extensiones en modo estructurado ahora pasa cada campo por un HeaderFilterStrategy (un
DefaultHeaderFilterStrategy) antes de establecerlo, de forma coherente con la ruta del modo de contenido binario — por
lo que los nombres de extensión Camel* del cuerpo no confiable se descartan:
// fixed (AbstractCloudEventProcessor.mapExtensionAsHeader)
final String headerName = key.toLowerCase(Locale.US);
if (!headerFilterStrategy.applyFilterToExternalHeaders(headerName, value, exchange)) {
message.setHeader(headerName, value);
}
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. El valor inyectado es un marcador benigno (una cadena SQL inerte que nunca se ejecuta aquí). No utilice este material contra sistemas que no posea u opere.