2009-09-22 18 views
47

Acabo de leer acerca de zip bombs, es decir, archivos zip que contienen una gran cantidad de datos altamente comprimibles (00000000000000000 ...).¿Cómo puedo protegerme de una bomba zip?

Cuando se abren, llenan el disco del servidor.

¿Cómo puedo detectar un archivo zip es una bomba zip antes de descomprimirlo?

ACTUALIZACIÓN ¿Puede decirme cómo se hace esto en Python o Java?

+1

La relación de compresión puede ser tan pequeña como 1000 a 1: no solo consume mucho espacio en disco, sino que también lleva mucho tiempo escribir la salida. – sharptooth

+1

[Pregunta relacionada sobre gzip y bzip2] (http://stackoverflow.com/questions/13622706/how-to-protect-myself-from-a-gzip-or-bzip2-bomb). –

Respuesta

20

Prueba esto en Python:

import zipfile 
z = zipfile.ZipFile('c:/a_zip_file') 
print 'total files size=', sum(e.file_size for e in z.infolist()) 
z.close() 
+5

Al menos con gzip creo que el tamaño no comprimido podría no estar en el encabezado (por lo que podría funcionar con zip, pero no con .tar.gz) – tonfa

+0

@tonfa, gracias por mencionar que zipfile doesn maneja el formato zip gnu. –

+4

IIRC, estándar Zip (y seamos sinceros, si desea causar un DoS, necesariamente va a seguir los estándares) permite que ciertos tamaños se eliminen del directorio central y los encabezados de entrada. –

4

Si el descompresor ZIP que utiliza puede proporcionar los datos en tamaño original y comprimido, puede usar esa información. De lo contrario, comience a descomprimir y monitorear el tamaño de salida; si crece demasiado, ciérrelo.

5

Comprobar una cabecera postal primero :)

+2

revise los comentarios en la respuesta de Nick Dandoulakis – n611x007

1

Asegúrese de que no está utilizando la unidad del sistema para el almacenamiento temporal. No estoy seguro si un virusscanner lo comprobará si lo encuentra.

También puede ver la información dentro del archivo zip y recuperar una lista del contenido. ¿Cómo hacer esto depende de la utilidad que se utiliza para extraer el archivo, por lo que necesita para proporcionar más información aquí

10

lectura sobre la descripción de Wikipedia -

Deny cualquier archivo comprimido que contenga archivos comprimidos.
        Uso ZipFile.entries() para recuperar una lista de archivos y, a continuación ZipEntry.getName() para encontrar la extensión de archivo.
Denegar cualquier archivo comprimido que contenga archivos de un tamaño determinado, o el tamaño no se puede determinar al inicio.
        Al iterar sobre los archivos, utilice ZipEntry.getSize() para recuperar el tamaño del archivo.

4

No permita que el proceso de carga escriba suficientes datos para llenar el disco, es decir, resuelva el problema, no solo una posible causa del problema.

19

Zip es, erm, un formato "interesante". Una solución robusta es transmitir los datos y detener cuando haya tenido suficiente. En Java, use ZipInputStream en lugar de ZipFile. Este último también requiere que almacene los datos en un archivo temporal, que tampoco es la mejor idea.

Cuestiones relacionadas