Vulnerabilidad en cdnjs que permitía la ejecución de código en servidores de Cloudflare

Se ha identificado una vulnerabilidad crítica en la red de entrega de contenido cdnjs de Cloudflare, que está diseñada para acelerar la entrega de bibliotecas JavaScript, permitiendo la ejecución de código arbitrario en servidores CDN. El peligro del problema se ve agravado por el hecho de que alrededor del 12.7% de todos los sitios en Internet utilizan el servicio para descargar bibliotecas JavaScript, y el compromiso de la infraestructura permite reemplazar las bibliotecas proporcionadas por cualquiera de estos sitios.

El servicio cdnjs descarga paquetes de Git o un repositorio NPM, después de lo cual permite que cualquier sitio use la red de entrega de contenido Cloudflare de forma gratuita para acelerar la carga de bibliotecas JavaScript. Al estudiar el código de los componentes cdnjs publicados en GitHub, se reveló que para descomprimir paquetes NPM en archivos tgz, se utiliza el módulo archive/tar estándar en el lenguaje Go, que produce una lista de archivos tal cual, sin normalizar las rutas. . En el caso de que el script descomprima el contenido basándose en la lista dada, la presencia en el archivo de archivos como “../../../../../../../tmp/test” puede provocar la sobrescritura de archivos arbitrarios en el sistema, en la medida en que lo permitan los derechos de acceso.

Se sugirió que un atacante podría solicitar agregar su biblioteca a cdnjs y cargar un archivo especialmente diseñado que contenga archivos con caracteres "../" en la ruta al repositorio de NPM. En los servidores cdnjs, se realiza periódicamente una operación de "actualización automática", durante la cual el controlador descarga nuevas versiones de la biblioteca propuesta y descomprime el contenido. Al utilizar archivos con rutas "../", un atacante puede sobrescribir archivos con scripts de servicio y ejecutar su código en el servidor en el que se realizó el descomprimido.

En el caso de la descarga de actualizaciones de Git, se descubrió que el controlador que descargaba las actualizaciones no tenía en cuenta los enlaces simbólicos al copiar archivos de Git. Esta característica hizo posible organizar la lectura de cualquier archivo del servidor agregando enlaces simbólicos a Git.

Se decidió comenzar los experimentos con una demostración de piratería de cdnjs para recibir un premio en HackerOne probando la hipótesis sobre la lectura de archivos. Se agregó un enlace simbólico test.js al repositorio Git de la biblioteca JavaScript servido a través de CDN, que apunta al archivo /proc/self/maps. Después de publicar una nueva versión de la biblioteca, el controlador de actualizaciones procesó este repositorio y publicó el archivo especificado en cdnjs (test.js se creó como un enlace simbólico y cuando se solicitó este archivo, se devolvió el contenido de /proc/self/maps ).

Al sustituir un enlace simbólico al archivo /proc/self/environ, el autor del estudio notó que los datos proporcionados contenían los valores de las variables de entorno GITHUB_REPO_API_KEY y WORKERS_KV_API_TOKEN. La primera variable almacenó la clave API para el acceso de escritura al repositorio de robocdnjs en GitHub. La segunda variable almacenó el token en el almacenamiento KV en cdnjs. Utilizando la información recibida, el atacante podría realizar cambios en cdnjs y comprometer completamente la infraestructura.

Fuente: opennet.ru

Añadir un comentario