
Reproductor ejecutable de Spring Boot y Quarkus para CVE-2026-85248, una condición de carrera concurrente de Signature en camel-pqc que provoca la omisión de la verificación de firmas ML-DSA, con compilaciones afectadas frente a corregidas.
Signature (omisión de la verificación de firmas)Reproductor ejecutable de prueba de concepto para la vulnerabilidad de Apache Camel en la que el productor PQC mantenía una única instancia de java.security.Signature y la usaba para cada exchange sin sincronización. Signature es stateful y no es thread-safe: update() acumula los datos que se van a firmar o verificar, y verify()/sign() consumen ese estado acumulado. Con exchanges concurrentes compartiendo una sola instancia, las llamadas update y verify de distintos mensajes se intercalan, de modo que una verificación puede completarse contra datos que pertenecen a otro exchange, o contra un búfer acumulado parcialmente. El resultado es no determinista e incluye una verificación que informa éxito para un mensaje cuya firma nunca se comprobó realmente, lo que anula la garantía que el componente existe para proporcionar. Alcanzarlo requiere únicamente tráfico concurrente a través del mismo endpoint — la condición ordinaria de una ruta Camel bajo carga.
| Runtime | Directorio | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-pqc 4.22.0 (afectado; corregido en 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-pqc (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.
Una ruta firma cada mensaje con una clave post-cuántica ML-DSA y luego verifica inmediatamente la firma que acaba de producir, de modo que todo mensaje firmado legítimamente debe verificar true. El driver ejecuta 1024 de estos ciclos sign→verify de forma concurrente (16 hilos) a través de los productores pqc: compartidos.
true — algunas devuelven false, otras generan errores del motor de firmas — porque la única Signature stateful compartida entre exchanges concurrentes se corrompe por el intercalado. Un veredicto ya no corresponde al mensaje para el que se calculó. (La misma carrera, en la dirección peligrosa, permite que un verify() tenga éxito para datos que nunca cubrió.)Signature.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: many of 1024 broken; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85248-pqc-signature-race-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: 0 broken; >>> 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): many broken
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: 0 broken
La carrera depende, por naturaleza, del timing; el reproductor genera suficiente concurrencia (1024 round-trips) para que se manifieste de forma fiable en la compilación afectada. Si alguna ejecución afectada muestra 0 fallos, vuelve a ejecutarla.
| Propiedad | Valor |
|---|---|
| Componente | camel-pqc (firma/verificación de PQCProducer) |
| CWE | CWE-362 (Ejecución concurrente usando un recurso compartido con sincronización incorrecta) |
| Severidad | MEDIA |
| Vector de ataque | Tráfico concurrente a través del mismo endpoint pqc: que comparte una única instancia con estado de java.security.Signature |
| Impacto | Verificación de firma no determinista; una verificación puede informar éxito para un mensaje cuya firma nunca fue comprobada |
| Versiones afectadas | Desde 4.12.0 antes de 4.18.5, desde 4.19.0 antes de 4.22.1 |
| Versiones corregidas | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24445 |
| Crédito | Claude Security Scan Tool |
Aviso: https://camel.apache.org/security/CVE-2026-85248.html
PQCProducer ya no comparte la Signature entre intercambios
concurrentes. Cuando el productor creaba la instancia por sí mismo, ahora crea una nueva por intercambio
(signerForExchange()); cuando el usuario configuraba una instancia (de ámbito JVM public static final), el acceso a ella está
synchronized. En cualquier caso, dos intercambios no intercalan sus secuencias de init/update/verify sobre una misma instancia.
Restringe la ruta afectada a un único consumidor concurrente para que dos intercambios no usen la instancia de Signature a
la vez.
Este repositorio se publica con fines educativos y defensivos: 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 mensajes y las claves son fixtures locales inertes. No utilices este material contra sistemas que no sean de tu propiedad o que no operes.