
Reproductor de prueba de concepto ejecutable para CVE-2026-85312, que demuestra el secuestro de saga de Apache Camel mediante el encabezado Long-Running-Action en Spring Boot y Quarkus.
Long-Running-ActionReproductor de prueba de concepto ejecutable para la vulnerabilidad de Apache Camel en la que el SagaProcessor de camel-core seleccionaba el
coordinador de saga a partir de la cabecera de mensaje Long-Running-Action en cada exchange. Ese nombre de cabecera no lleva el prefijo
Camel, por lo que queda fuera del espacio de nombres que los filtros de cabeceras de consumidor eliminan — un remitente externo podría proporcionarla
en un mensaje entrante y, de ese modo, nombrar la saga a la que se une su exchange, vinculando su petición a una acción de larga duración
iniciada por otra persona (o asociando la compensación con una acción que no iniciaron). La exposición está
acotada a despliegues que ejecutan sagas, pero donde aplica el remitente controla a qué saga pertenece un exchange
(CWE-20).
| Runtime | Directorio | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-spring-boot 4.22.0 (afectado; corregido en 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-saga (Camel 4.22.0, afectado; control corregido CQ 3.40.0 / Camel 4.22.1) |
Ambos módulos demuestran el comportamiento afectado y el corregido frente al SagaProcessor real de camel-core.
El driver replica la propia prueba de regresión de la corrección (SagaHeaderCannotSelectCoordinatorTest). Construye una ruta de saga
from("direct:…").saga().propagation(MANDATORY) respaldada por un servicio de saga en memoria que registra cada id que se le
pide resolver, y luego envía un exchange que lleva la cabecera entrante Long-Running-Action = a-saga-id-from-the-wire
— el id que un remitente externo colocaría en el cable. El oráculo es simplemente qué ids de saga llegan al servicio:
a-saga-id-from-the-wire
— el mensaje eligió el coordinador.En ambas compilaciones el exchange MANDATORY acaba fallando (no hay una saga real a la que unirse) — la vulnerabilidad no es el
fallo, sino que se usó un id elegido por el atacante para seleccionar el coordinador, razón por la cual el oráculo observa la
búsqueda en lugar del resultado.
# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: wire id looked up = true; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85312-saga-header-hijack-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: wire id looked up = false; >>> Not exploited
# Camel Quarkus
cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected (Camel 4.22.0): wire id looked up = true
docker compose down
# Patched control: CQ 3.40.0 ships Camel 4.22.1
mvn clean package -Dcamel-quarkus.version=3.40.0 -Dquarkus.platform.version=3.40.0
java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: wire id looked up = false
| Propiedad | Valor |
|---|---|
| Componente | camel-core (SagaProcessor.getCurrentSagaCoordinator) |
| CWE | CWE-20 (Validación de entrada incorrecta) |
| Gravedad | MEDIA |
| Vector de ataque | Un remitente externo proporciona el encabezado Long-Running-Action sin prefijo en un mensaje entrante a una ruta que ejecuta el EIP saga |
| Impacto | El remitente nombra la saga a la que se une un exchange — adjuntándose a la acción de larga duración de otra parte, o asociando incorrectamente la compensación |
| Versiones afectadas | Desde 4.0.0 anterior a 4.18.5, desde 4.19.0 anterior a 4.22.1 |
| Versiones corregidas | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24449 |
| Crédito | Claude Security Scan Tool |
Aviso: https://camel.apache.org/security/CVE-2026-85312.html
El módulo afectado de Quarkus está construido sobre CQ 3.39.0 (Camel 4.22.0). El control parcheado es CQ 3.40.0 (Camel 4.22.1).
SagaProcessor ahora consulta el encabezado Long-Running-Action solo cuando
el servicio saga anuncia que participa en dicho protocolo, mediante el nuevo
CamelSagaService.isLongRunningActionHeaderSupported() (por defecto false; el servicio LRA lo sobrescribe a true). El
estado interno del exchange — que sobrevive a removeHeaders("*") — sigue siendo el portador normal del id de la saga, por lo que un mensaje
ya no puede elegir el coordinador para un servicio que no ejecuta ningún coordinador externo.
Elimine el encabezado en el límite de confianza con removeHeaders("Long-Running-Action") en cada consumidor que acepte
mensajes de un remitente no confiable.
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. La demostración ejecuta una ruta saga en proceso con un servicio saga en memoria; el id de saga del "atacante" es una cadena de marcador de posición benigna. No utilice este material contra sistemas que no sean de su propiedad o que no opere.