
Reproductor ejecutable de Spring Boot y Quarkus para CVE-2026-85300, que demuestra cómo camel-pqc escribe claves privadas con permisos de archivo permisivos derivados de la umask y verifica la corrección.
Reproductor de prueba de concepto ejecutable para la vulnerabilidad de Apache Camel en la que el FileBasedKeyLifecycleManager de camel-pqc escribía el material de clave generado en disco con los permisos que producía la umask predeterminada del proceso, en lugar de restringir el archivo a su propietario. En un host cuya umask permite la lectura por grupo u otros (la común 022), la clave privada sin cifrar era legible por otras cuentas locales. La exposición es ante una parte local en lugar del remitente remoto, pero donde aplica la consecuencia es total: la posesión de la clave privada anula cada firma e intercambio de claves que el despliegue realiza con ella.
| 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. Ambos se ejecutan bajo umask 022 (el valor predeterminado común), que es la premisa del fallo.
El driver utiliza el FileBasedKeyLifecycleManager real: almacena un par de claves RSA en un directorio nuevo
(manager.storeKey("k1", keyPair, new KeyMetadata("k","RSA"))) y luego lee los permisos POSIX del archivo
k1.private.json escrito.
rw-r--r-- (0644) bajo umask 022 — por lo que el grupo y otros pueden leer la clave privada sin cifrar.rw------- (0600, solo el propietario) independientemente de la umask.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: rw-r--r-- private key; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
umask 022 && java -jar target/cve-2026-85300-pqc-key-permissions-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: rw------- ; >>> 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): rw-r--r-- private key
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
umask 022 && java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: rw-------
| Propiedad | Valor |
|---|---|
| Componente | camel-pqc (FileBasedKeyLifecycleManager.storeKey) |
| CWE | CWE-276 (Permisos predeterminados incorrectos) |
| Gravedad | MEDIA |
| Vector de ataque | Una cuenta local capaz de leer el directorio de claves en un host con una umask permisiva (p. ej., 022) |
| Impacto | Divulgación de la clave privada sin cifrar a otras cuentas locales |
| Versiones afectadas | Desde 4.12.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-24447 |
| Crédito | Claude Security Scan Tool |
Aviso: https://camel.apache.org/security/CVE-2026-85300.html
El módulo afectado de Quarkus se basa en CQ 3.39.0 (Camel 4.22.0):
camel-quarkus-pqcse corresponde por primera vez con una versión de Camel afectada en ese punto (CQ 3.29.0 / Camel 4.15.0 es anterior al gestor del ciclo de vida de claves basado en archivos que se usa aquí).
FileBasedKeyLifecycleManager ahora restringe el directorio de claves y cada
archivo de clave privada a su propietario (rwx------ / rw------- mediante setPosixFilePermissions, con un respaldo
java.io.File para sistemas de archivos no POSIX) antes de escribir, y ajusta un archivo de clave preexistente legible por
cualquiera al reescribirlo (el archivo se trunca, no se recrea, por lo que de lo contrario conservaría los permisos
antiguos). El material de claves ya escrito con permisos permisivos debe considerarse expuesto y rotarse.
Coloque el directorio de claves en una ruta por la que solo la cuenta de servicio pueda transitar y restrinja la umask del proceso; trate cualquier clave ya escrita con permisos permisivos como expuesta y rótela.
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 par de claves RSA se genera en el proceso en un directorio temporal y se elimina después de la comprobación. No utilice este material contra sistemas que no sean de su propiedad o que no opere.