Se ha identificado una vulnerabilidad crítica en la red de entrega de contenido cdnjs proporcionada por Cloudflare, diseñada para acelerar la entrega de bibliotecas de JavaScript, que permite la ejecución de código arbitrario en los servidores CDN. El peligro del problema se agrava por el hecho de que alrededor del 12.7% de todos los sitios en internet utilizan el servicio para cargar bibliotecas de JavaScript, y la compromisión de la infraestructura permite sustituir las bibliotecas entregadas por cualquiera de estos sitios.
El servicio cdnjs carga paquetes desde Git o el repositorio NPM, después de lo cual permite que cualquier sitio utilice gratuitamente la red de entrega de contenido de Cloudflare para acelerar la carga de bibliotecas de JavaScript. Al estudiar el código de los componentes de cdnjs publicados en GitHub, se identificó que para descomprimir paquetes NPM en archivos tgz se utiliza el módulo estándar archive/tar en el lenguaje Go, el cual devuelve la lista de archivos tal como están, sin normalizar las rutas. En el caso de que el script descomprima el contenido basado en la lista proporcionada, la presencia de archivos en el archivo que contengan rutas del tipo «..../..../..../..../..../..../..../tmp/test» puede conducir a la sobrescritura de archivos arbitrarios en el sistema, según lo permitan los permisos de acceso.
Se supuso que un atacante podría solicitar la adición de su propia biblioteca a cdnjs y cargar un archivo comprimido especialmente diseñado en el repositorio NPM, que contenga archivos con caracteres «..» en las rutas. En los servidores de cdnjs, periódicamente se realiza una operación de «autoupdate», durante la cual el manejador descarga nuevas versiones de la biblioteca propuesta y descomprime el contenido. Con archivos que contienen rutas «..», el atacante podría lograr la sobrescritura de archivos de scripts del servicio y ejecutar su código en servidor el que se estaba realizando la descompresión.
En el caso de cargar actualizaciones desde Git, se descubrió que el manejador que carga las actualizaciones no consideraba los enlaces simbólicos al copiar archivos desde Git. Esta característica permitía organizar la lectura de cualquier archivo con servidores mediante la adición de enlaces simbólicos en Git.
Los experimentos con la demostración de la explotación de cdnjs para obtener recompensas en HackerOne comenzaron con la verificación de la hipótesis sobre la lectura de archivos. Se agregó un enlace simbólico test.js al repositorio de la biblioteca de JavaScript entregada a través de CDN, apuntando al archivo /proc/self/maps. Tras la publicación de una nueva versión de la biblioteca, el manejador de actualizaciones procesó este repositorio y publicó el archivo mencionado en cdnjs (test.js fue creado como un enlace simbólico y al solicitar este archivo se devolvía el contenido de /proc/self/maps).
Al insertar un enlace simbólico al archivo /proc/self/environ, el autor del estudio notó que dentro de los datos entregados había valores de las variables de entorno GITHUB_REPO_API_KEY y WORKERS_KV_API_TOKEN. En la primera variable se almacenaba la clave de API para el acceso con permisos de escritura al repositorio robocdnjs en GitHub. En la segunda variable se almacenaba el token para el almacenamiento KV en cdnjs. Utilizando esta información, un atacante podría haber realizado cambios en cdnjs y comprometido completamente la infraestructura.
Fuente: opennet.ru
