CVE-2026-66907
Apache Camel: Camel-Google-Storage: el consumidor añadía el nombre del objeto remoto al directorio downloadFileName configurado sin restringir el resultado.
- Publicado
- 24 ago 2026
- Actualizado
- 25 ago 2026
- Asignación de CNA
- apache
- Evidencia observada
- 24 ago 2026
CVSS primario
nvd · CVSS 3.1
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:NBajo · próximos 30 días
- Percentil
- 46,1 %
- Fecha del modelo
- 21 sept 2026
EPSS es una estimación estadística, no una certeza o una medida de impacto. Combínelo con CVSS, estado KEV, exposición y su entorno.
Resumen
Vulnerabilidad de path traversal relativo en el componente Google Storage de Apache Camel. Este problema afecta a Apache Camel: desde 4.0.0 hasta antes de 4.14.9, desde 4.15.0 hasta antes de 4.18.4, desde 4.19.0 hasta antes de 4.22.0. El consumidor camel-google-storage descarga objetos de Google Cloud Storage al sistema de archivos local cuando la opción downloadFileName está configurada. Dicha opción está documentada como una carpeta o un nombre de archivo, y cuando su valor no contiene ningún token de expresión, el consumidor construye el destino local añadiéndole el nombre del objeto: evaluateFileExpression establece la cabecera file-name del Exchange como el nombre del objeto remoto y evalúa downloadFileName + "/${file:name}". El token ${file:name} devuelve la cabecera file-name tal cual, a diferencia de ${file:onlyname}, que le aplica FileUtil.stripPath. La cadena resultante se pasaba directamente a new File(result) y a blob.downloadTo(file.toPath()) sin normalización léxica ni comprobación de que el destino permaneciera dentro del directorio configurado. El nombre del objeto no es un dato controlado por la ruta: el consumidor lista el bucket, itera sobre cada blob devuelto y crea un exchange por objeto a partir de blob.getBlobId().getName() tal cual, y la opción filter, que podría restringir esos nombres, no se aplica en absoluto a menos que se haya establecido explícitamente. Los nombres de objetos de Google Cloud Storage son claves UTF-8 opacas que el servicio almacena y lista exactamente tal como se escriben, sin canonicalización en el servidor, y una barra inclinada es solo una convención de visualización para pseudo-directorios, por lo que una clave que contenga segmentos de directorio padre sobrevive intacta al round-trip. Por tanto, un nombre de objeto que contenga dichos segmentos se resolvía a una ubicación fuera del directorio downloadFileName configurado, permitiendo que cualquiera capaz de influir en los nombres presentes en el bucket consumido hiciera que Camel creara o sobrescribiera un archivo en una ubicación de su elección, con los privilegios del proceso Camel. Dependiendo de sobre qué pueda escribir el proceso, sobrescribir un archivo fuera del directorio de descarga puede escalar más allá de la pérdida de integridad de ese archivo. La opción downloadFileName es un parámetro ordinario de consumidor y no lleva ningún marcador de seguridad, por lo que nada indicaba a los usuarios que su valor no se estaba aplicando como límite de contención. El defecto es solo del consumidor; el productor no tiene ningún sumidero de descarga a archivo. Los otros consumidores de descarga de archivos de Camel - camel-file, camel-ftp, camel-smb, camel-mina-sftp, camel-azure-files y las rutas de descarga de Azure Storage - ya restringían sus descargas locales al directorio configurado mediante una comprobación de límite de segmentos de ruta; camel-google-storage era el sumidero de descarga de almacenamiento de objetos restante no cubierto por ese trabajo. Se recomienda a los usuarios actualizar a la versión 4.22.0, que corrige el problema. Si los usuarios se encuentran en la línea de versiones LTS 4.14.x, se les sugiere actualizar a 4.14.9. Si los usuarios se encuentran en la línea de versiones 4.18.x, se les sugiere actualizar a 4.18.4. Para despliegues que no puedan actualizar de inmediato, configure la opción filter con una expresión regular que acepte únicamente nombres de objeto simples de un solo segmento, de modo que cualquier nombre que contenga un separador de ruta o un segmento de directorio padre quede excluido antes de que se cree un exchange; tenga en cuenta que no se aplica absolutamente ningún filtrado cuando la opción se deja sin configurar, y que la expresión se compara contra el nombre completo del objeto. Alternativamente, asigne a downloadFileName una expresión explícita que no traslade la ruta remota, por ejemplo, una construida sobre ${file:onlyname} en lugar del ${file:name} implícito, teniendo en cuenta que un downloadFileName que contenga una expresión se trata como controlado por el autor de la ruta y no está cubierto por la comprobación de contención añadida en la corrección. Como defensa en profundidad, trate los nombres de objetos de cualquier bucket con escritura externa como entrada no confiable y no derive rutas del sistema de archivos local a partir de ellos.
Uso responsable
Utilice información sobre vulnerabilidades solo en sistemas de su propiedad o que esté autorizado a probar. Kitploit enlaza con metadatos de investigación pública y no almacena código de explotación ni cargas útiles maliciosas.