
Prueba de concepto ejecutable en Spring Boot y Quarkus que reproduce CVE-2026-85296, una confusión de claves de firma MDN entre socios en camel-as2 (CWE-488), con compilaciones afectadas y corregidas.
Reproductor de prueba de concepto ejecutable para la vulnerabilidad de Apache Camel en la que el material de firma por solicitud se mantenía en
estado compartido entre solicitudes en lugar de confinarse a la solicitud que se estaba procesando. Un único ResponseMDN está
registrado en el HttpProcessor compartido y atiende cada solicitud AS2; en la configuración de claves dinámicas (un socio comercial
por ruta, cada uno con sus propias claves resueltas por solicitud desde el HttpContext) la compilación afectada escribía la
clave de firma resuelta por solicitud de vuelta en un campo de instancia. Cuando un despliegue atiende a más de un socio,
las solicitudes concurrentes o sucesivas podían por tanto observar el material de las demás, y una Message Disposition
Notification podía ser firmada con la clave de un socio comercial diferente. Los despliegues AS2 son típicamente
multisocio por diseño, por lo que la condición se alcanza con tráfico concurrente ordinario.
| Runtime | Directorio | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-as2 4.22.0 (afectado; corregido en 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-as2 (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.
El driver utiliza el ResponseMDN real (el interceptor de respuesta AS2) en su forma de claves dinámicas. Resuelve el material de firma de dos
socios por turnos — Socio A, luego Socio B — a través de ResponseMDN.process(...) (cada uno con la clave RSA de ese
socio en el HttpContext), y lee el campo signingPrivateKey de la instancia después de cada uno.
final y nunca se escribe; la clave por solicitud permanece confinada a la solicitud, por lo que el
signingPrivateKey de la instancia compartida permanece null.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: per-request key on the shared instance; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85296-as2-signing-key-confusion-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: field stays null; >>> 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): per-request key on the shared instance
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: field stays null
| Propiedad | Valor |
|---|---|
| Componente | camel-as2 (manejo de claves dinámicas de ResponseMDN) |
| CWE | CWE-488 (Exposición de un elemento de datos a la sesión incorrecta) |
| Gravedad | MEDIA |
| Vector de ataque | Tráfico AS2 concurrente ordinario en un despliegue multi-socio que comparte una única instancia de ResponseMDN |
| Impacto | Una Notificación de Disposición de Mensaje firmada con la clave privada de otro socio comercial; reutilización de material de firma entre socios |
| 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-24429 |
| Crédito | Claude Security Scan Tool |
Aviso: https://camel.apache.org/security/CVE-2026-85296.html
El módulo afectado de Quarkus está construido sobre CQ 3.39.0 (Camel 4.22.0): el mecanismo dinámico de clave de firma AS2 por solicitud que ejercita esta PoC es posterior a CQ 3.29.0 (Camel 4.15.0), por lo que CQ 3.39.0 incluye el mismo Camel 4.22.0 que el módulo de Spring Boot.
ResponseMDN convierte los campos de seguridad configurados en final y resuelve
el material dinámico por solicitud en variables locales dentro de process(), sin escribirlo nunca de vuelta en los campos de la instancia. Por lo tanto, una
única instancia compartida ya no puede filtrar la clave de firma de una solicitud a otra.
Ejecute un contexto de Camel independiente por cada socio comercial para que no se comparta material de firma entre ellos.
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. Los pares de claves RSA se generan en el propio proceso para la demostración y son inertes. No utilice este material contra sistemas que no sean de su propiedad o que no opere.