
Prueba de concepto ejecutable de Spring Boot que reproduce CVE-2026-85245, una divulgación de datos entre intercambios de camel-thrift, con comparación entre versión afectada y corregida y notas de mitigación.
Reproductor de prueba de concepto ejecutable para la vulnerabilidad de Apache Camel en la que el formato de datos Thrift deserializaba
en la defaultInstance compartida del tipo destino en lugar de en una copia nueva, y devolvía ese objeto compartido
como cuerpo del exchange. Dado que la instancia se comparte en todo el proceso, el estado escrito al deserializar un mensaje
permanecía en el objeto y era visible para todos los mensajes posteriores que usaran el mismo tipo. Los campos ausentes en una
carga útil posterior conservaban los valores del mensaje anterior, por lo que el contenido perteneciente a un remitente podía leerse mientras se procesaba
el mensaje de otro remitente, y los exchanges concurrentes podían observar el estado parcialmente escrito de los demás. En un
despliegue que atiende a más de un inquilino o usuario a través de la misma ruta, eso supone la divulgación de los datos de una parte a
otra.
Solo Spring Boot. No existe una extensión
camel-quarkus-thrift, por lo que este reproductor incluye un único módulo Camel Spring Boot. (El fallo está en elThriftDataFormatdel componente, que es independiente del runtime).
| Runtime | Directorio | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-thrift 4.22.0 (afectado; corregido en 4.22.1) |
Una ruta define un único ThriftDataFormat (respaldado por el tipo Thrift generado Work) y lo reutiliza para cada mensaje,
como hacen normalmente las rutas. Dos inquilinos envían un mensaje a través de él:
Work{num1=1, op=ADD, comment="TENANT-A-SECRET-…"} — el campo opcional comment transporta datos
sensibles;Work{num1=3, op=SUBTRACT} — sin campo comment.La ruta deserializa el mensaje del inquilino A y luego el del inquilino B.
comment del inquilino A — Thrift solo asigna los
campos presentes en los bytes entrantes, y ambos mensajes se deserializaron en (y se devolvieron como) la misma instancia
compartida, por lo que el campo ausente de B conservó el valor de A. Los dos cuerpos son literalmente el mismo objeto.comment del inquilino B es null — cada exchange recibe su propia copia limpia.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: B sees A's secret; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85245-thrift-cross-exchange-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: B's comment is null; >>> Not exploited
| Propiedad | Valor |
|---|---|
| Componente | camel-thrift (ThriftDataFormat.unmarshal) |
| CWE | CWE-488 (Exposición de un elemento de datos a la sesión equivocada) |
| Gravedad | MEDIA |
| Vector de ataque | Dos mensajes del mismo tipo Thrift a través de una ruta; un mensaje posterior que omite un campo hereda el valor del anterior |
| Impacto | Divulgación de datos entre intercambios / entre inquilinos; los intercambios concurrentes pueden observar el estado parcialmente escrito de los demás |
| 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-24442 |
| Crédito | Claude Security Scan Tool |
Aviso: https://camel.apache.org/security/CVE-2026-85245.html
Los tipos Thrift generados (Work, Operation) son los fixtures de prueba públicos de las propias pruebas de
camel-thrift de Apache Camel.
ThriftDataFormat.unmarshal ahora deserializa en una copia por intercambio:
TBase instance = defaultInstance.deepCopy(); instance.clear(); — luego deserializa los bytes en instance y
lo devuelve. Cada intercambio obtiene su propio objeto limpiado, de modo que ningún campo se transfiere entre mensajes y
dos intercambios no comparten un cuerpo.
Copie el cuerpo deserializado en una nueva instancia inmediatamente después de que se ejecute el formato de datos, y no retenga referencias al objeto devuelto.
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 una cadena marcadora inerte e inventada. No utilice este material contra sistemas que no sean de su propiedad o que no opere.