Vulnerabilidad de seguridad grave en la extracción de archivos ZIP de Bower
31 de enero de 2019
0 minutos de lecturaA principios de este mes se descubrió que Bower, un popular administrador de paquetes web, es vulnerable a ataques mediante la extracción de archivos. Actualmente, se le atribuyen dos incidentes de seguridad, para los que ya hay versiones posteriores que los solucionan:
La escritura arbitraria de archivos con posible inyección de comandos remota, corregida en Bower 1.8.6, se debió a las vulnerabilidades Zip Slip detectadas en la dependencia decompress-zip, una dependencia de código abierto que usa Bower.
La escritura arbitraria de archivos causada por vulnerabilidades de enlaces simbólicos (symlinks) en archivos .tar.gz, que se explotan debido a la forma en que Bower extrae estos archivos, se corrigió en Bower 1.8.8.
Webpack, yarn y el registro de npm quizá hayan cambiado el panorama para Bower, pero todavía se sigue usando. Aunque hoy existen administradores de paquetes más populares y npm es el registro de facto para JavaScript, Bower sigue teniendo muchos usuarios: registra casi 2 millones de descargas al mes, lo que pone de manifiesto la gravedad de este problema de seguridad.
El 1 de enero de 2019, un investigador de seguridad llamado skyn3t reportó al grupo de trabajo de seguridad de Node.js en HackerOne una escritura arbitraria de archivos implementada mediante una validación incorrecta de enlaces simbólicos, causada por la forma en que Bower extrae archivos tar.
Poco después de que se clasificara el error, invitaron a Adam Stankiewicz, del equipo central de Bower, a revisar el reporte. Lo confirmó de inmediato y proporcionó una solución en la versión 1.8.8 de Bower para corregir el problema de seguridad.
Recorrido malicioso de rutas al extraer archivos
Si un actor malicioso creara un archivo ZIP especialmente diseñado para un paquete que luego se instalara con Bower, podría provocar un recorrido de rutas y hacer que los archivos se extrajeran fuera del directorio raíz previsto para descomprimir el archivo.
La siguiente prueba de concepto (POC) proviene de un reporte de seguridad divulgado por skyn3t al programa del grupo de trabajo de seguridad de Node.js en HackerOne, y muestra cómo el manejo inseguro de enlaces simbólicos puede permitir la escritura arbitraria de archivos.
El archivo malicioso del paquete
El archivo debe crear un enlace simbólico a un directorio y luego colocar un archivo en ese directorio de destino. Sin embargo, para reproducir esta estructura de directorios, debemos crear manualmente un archivo malicioso.
Primero crearemos un directorio para el paquete malicioso, un archivo package.json predeterminado para Bower y un enlace simbólico a /tmp:
Ahora podemos crear un archivo tar para este paquete y asegurarnos de no comprimirlo:

La parte complicada es introducir un archivo de nuestra elección en el directorio /tmp y, en esencia, en mySpecialDirectory/ dentro del archivo. Ese nombre de archivo ya está ocupado por un enlace, así que no podemos volver a usarlo en nuestro sistema de archivos.
Para superar este reto, volvemos a las funciones estándar de los archivos: manipular los datos dentro del archivo. Los archivos tar permiten actualizar un archivo existente, por ejemplo, agregándole más archivos, lo que nos permite crear una vía de escape.
Eliminaremos el enlace, crearemos un directorio en su lugar y pondremos nuestro propio archivo dentro. Luego agregaremos solo ese archivo al archivo tar con la función de actualización:
Como se ve en la captura de pantalla, el contenido del archivo incluye un enlace simbólico al directorio /tmp y también a un archivo malicioso que creamos:

Es importante tener en cuenta que los archivos comprimidos no se pueden manipular de la misma manera que los archivos tar. Por eso, comprimiremos el archivo con gzip ahora que ya hemos creado el archivo malicioso:
Activar la instalación de Bower
Ahora que tenemos un archivo tar.gz en el directorio de inicio ~/tmp, ejecutemos una instalación de Bower desde el sistema de archivos local para demostrar cómo se descomprime el paquete:

Como se puede ver, se usa Bower 1.8.7 y, al instalar el paquete malicioso, el archivo malicioso que controlábamos se instaló en el directorio /tmp del sistema.
Cómo corregir la vulnerabilidad
Bower admite estos tipos de archivo: tar, tar.gz y zip. Aunque ya se había corregido una vulnerabilidad similar que afectaba a los paquetes ZIP al solucionar decompress-zip, tar y tar.gz seguían siendo vulnerables.
La solución aplicada para las vulnerabilidades de tar y tar.gz mitigó el problema al ignorar los enlaces simbólicos de los paquetes que se van a instalar. Desde entonces, se lanzó la nueva versión 1.8.8 de Bower para que los usuarios la actualicen y mitiguen el problema de seguridad.
A principios de 2018, el equipo de investigación de seguridad de Snyk acuñó el término de vulnerabilidad de seguridad Zip Slip tras realizar una investigación exhaustiva sobre la explotación de la extracción de archivos que permite la escritura arbitraria de archivos. En casos de gravedad crítica, esto también puede permitir la ejecución remota de comandos y la sobrescritura de archivos de configuración sensibles del sistema.
La investigación sobre Zip Slip permitió descubrir miles de proyectos vulnerables en distintos ecosistemas, incluidos proyectos de Apache, Pivotal, Amazon y otras organizaciones.
En resumen
Vimos cómo crear deliberadamente un paquete malicioso que puede provocar la escritura arbitraria de archivos, pero el problema no se limita a la descarga de paquetes maliciosos. Si un paquete se obtiene a través de un medio inseguro, como tráfico sin HTTPS, se puede llevar a cabo un ataque de intermediario.
Los problemas al extraer archivos no son nuevos; de hecho, podrían remontarse a un artículo de Phrack de 1991 que explicaba cómo hackear un BBS mediante vectores de ataque de extracción de archivos ZIP. Es muy probable que sigamos viendo vulnerabilidades Zip Slip en bibliotecas y aplicaciones a medida que avance la investigación en este campo.
Recuerda que, aunque se permitan los enlaces simbólicos, trabajar con archivos controlados por usuarios es peligroso y debe hacerse con la debida diligencia, como con cualquier otro dato de entrada del usuario.
Puntos clave
Actualiza a Bower 1.8.8 lo antes posible.
Te invitamos a consultar nuestra guía rápida de Zip Slip para ver ejemplos de código vulnerable en distintos ecosistemas de lenguajes y aprender a evitar vulnerabilidades de seguridad similares en tu código.



