Deslizamiento ZIP

Muchas aplicaciones web permiten a los usuarios enviar archivos en un formato comprimido (generalmente en formato zip) para reducir el tamaño del archivo que se carga. Más tarde, la aplicación descomprimirá los archivos comprimidos y recuperará los archivos reales en el zip.

ZIP Slip es una vulnerabilidad de seguridad altamente crítica dirigida a este tipo de aplicaciones. ZIP Slip hace que su aplicación sea vulnerable al ataque de Path Traversal y a la exposición de datos confidenciales.

                                          [/root]
                                          /   |    \
                                   [/usr1] [/usr2] [/usr3]
                                      |               |
                                 [details.zip]    [details.zip]
                                     /               \
                     [resume.doc][marksheet.pdf] [resume.doc][marksheet.pdf]
  

Considere que su solicitud acepta un archivo zip que contiene los datos personales/académicos de los candidatos y completa automáticamente el formulario de solicitud para el usuario. Idealmente, la aplicación debería descomprimir el archivo comprimido, leer los archivos en el zip uno por uno, extraer información significativa del archivo y finalmente completar automáticamente el formulario con los datos correspondientes.

Esto se hace con la ayuda del fragmento de código a continuación,

while ((entry = zIn.getNextEntry()) != null) {
    String fileName = entry.getName();
    File zFile = new File(destFolder + File.separator + fileName);
    InputStream input = zip.getInputStream(entry);
    // Write the file content
}

Si la aplicación no valida los nombres de archivo en el zip cargado, es vulnerable al ataque ZIPSlip. El usuario puede cargar el zip con un nombre de archivo diseñado específicamente. En este caso, un zip con el nombre de archivo
“../usr3/resume.doc” podría leer el archivo del directorio /usr3 al que usr1 no tiene acceso. Esto da como resultado la exposición de datos confidenciales.

Esto se debe a que ../ se trata como un nivel superior en la estructura de directorios en los sistemas basados ​​en Unix.

Aquí, en la línea n.º 3 del código, hacemos una operación de adición simple con fileName y destFolder sin ninguna validación. Deberíamos haber validado estos valores de variables y/o deberíamos haber verificado si zFile es el directorio apropiado al que le damos acceso de escritura, sin el cual la aplicación se vuelve vulnerable a los ataques ZIP Slip.

En el peor de los casos, esto podría incluso resultar en acceso remoto/ejecución de código cuando el usuario puede ejecutar comandos o scripts de shell de manera remota. Con este ataque, un atacante podría obtener acceso a ciertos directorios/carpetas en el sistema de archivos fuera de la carpeta prevista/privilegiada y puede invocar/sobrescribir archivos.

Ni siquiera es necesario que el atacante conozca la estructura de su directorio, ya que los archivos críticos del sistema de tomcat/apache como etc/passwd etc/hosts pueden leerse ya que siguen la misma estructura de directorio.

Soluciones posibles

  1. Obligar a los usuarios a nombrar archivos con nombres estándar.
  2. Elimina los caracteres especiales en los nombres de los archivos.
  3. Haga coincidir y compare nombres de archivo con expresiones regulares estándar.
  4. Cambie el nombre de todos los archivos en el zip cargado con nombres generados antes de usarlos/almacenarlos

Publicación traducida automáticamente

Artículo escrito por sub154 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *