¿Cómo se hace una bomba Zip?

131

Esta pregunta sobre las bombas zip naturalmente me llevó a la página de Wikipedia sobre el tema. El artículo menciona un ejemplo de un archivo zip de 45.1 kb que se descomprime a 1.3 exabytes.

¿Cuáles son los principios / técnicas que se utilizarían para crear dicho archivo en primer lugar? Realmente no quiero hacer esto, más interesado en una explicación simplificada de "cómo funciona" de los conceptos involucrados.

PD

El artículo menciona 9 capas de archivos zip, por lo que no es un simple caso de comprimir un montón de ceros. ¿Por qué 9, por qué 10 archivos en cada uno?

pez globo
fuente
55
@Michael tu queja no es válida. OP no solo preguntó cómo funciona, sino que nada en el artículo publicado dice que tiene el propósito expreso de desactivar el antivirus. Todo lo contrario, parece que el objetivo del artículo es un ataque de estilo DOS con solo una mención pasajera de la desactivación de antivirus.
San Jacinto
2
El punto es que el OP se refería a un archivo específico, que consiste en archivos anidados, no un archivo comprimido enorme.
Michael Borgwardt
1
Creo que Michael tiene razón, explica cómo crear el archivo descrito en el "PS", y todos los demás no. Sin embargo, la "PS" se agregó como una edición, por lo que esas respuestas pueden no haber sido descaradamente incorrectas en el momento en que se dieron. Simplemente pensaron que "tal archivo" significaba "cualquier archivo que se descomprime a 1.3 exabytes", cuando resultó que estaba destinado a significar "un archivo estructurado como el que se describe en el artículo al que enlazo".
Steve Jessop
1
@onebyone Estoy completamente de acuerdo. Simplemente no creo que un voto negativo sea apropiado en tal circunstancia.
San Jacinto
44
Supongo que depende de si consideras que un voto negativo significa "esta no es la mejor respuesta a la pregunta", o "eres un tonto y no eres digno de vivir", o un paradero intermedio. Personalmente, tomo un voto negativo para decir que debería volver a leer mi respuesta y ver si hay algo obviamente malo que deba solucionar. Pero entonces, estoy bastante feliz de estar en desacuerdo y no cambiar mi respuesta, si creo que mi respuesta aporta algo. Y de todos modos me he vuelto bastante despreocupado por todo el proceso de votación, ahora que está claro que nunca atraparé a Jon Skeet ;-)
Steve Jessop

Respuestas:

92

Citando de la página de Wikipedia:

Un ejemplo de una bomba Zip es el archivo 45.1.zip que tenía 45.1 kilobytes de datos comprimidos, que contenía nueve capas de archivos zip anidados en conjuntos de 10, cada archivo de la capa inferior contenía un archivo de 1.30 gigabytes para un total de 1.30 exabytes de datos sin comprimir .

Entonces, todo lo que necesita es un solo archivo de 1.3GB lleno de ceros, comprimirlo en un archivo ZIP, hacer 10 copias, empaquetarlos en un archivo ZIP y repetir este proceso 9 veces.

De esta manera, obtienes un archivo que, cuando se descomprime por completo, produce una cantidad absurda de datos sin requerir que comiences con esa cantidad.

Además, los archivos anidados hacen que sea mucho más difícil para los programas como los escáneres de virus (el objetivo principal de estas "bombas") ser inteligentes y negarse a desempaquetar archivos que son "demasiado grandes", porque hasta el último nivel la cantidad total de datos es no tanto, usted no "ve" qué tan grandes son los archivos en el nivel más bajo hasta que haya alcanzado ese nivel, y cada archivo individual no es "demasiado grande", solo el gran número es problemático.

Michael Borgwardt
fuente
2
No puede ser ... una vez que comprime el archivo de ceros en la parte inferior, el archivo comprimido resultante no será tan compresible para la siguiente capa.
pez globo
16
Ah, pero en cada nivel, tienes diez archivos idénticos , que nuevamente se comprimen bien. Aunque ZIP no explota la redundancia de archivos cruzados, un archivo que contiene diez archivos idénticos comprimidos individualmente probablemente tenga mucha redundancia en sí misma para la siguiente capa a explotar.
Michael Borgwardt
10
El punto NO es cómo generar la cantidad máxima de datos desde el archivo más pequeño posible; el punto es derrotar los intentos de los escáneres de virus para protegerse contra archivos demasiado grandes.
Michael Borgwardt
2
Ese no es el objetivo del artículo en wikipedia. Parece impulsar un ataque al estilo DOS.
San Jacinto
2
Pero los archivos no se extraen de forma recursiva ... la víctima debe seguir extrayendo los archivos sub zip para que funcione ... Cualquier solución para ello.
Manoj
46

Cree un archivo de exabyte 1.3 de ceros.

Haga clic derecho> Enviar a la carpeta comprimida (comprimida).

wefwfwefwe
fuente
22
Olvidaste el sarcasmo "smiley".
tvanfosson
1
Es muy probable que eso sea imposible con la mayoría de los sistemas de archivos y algoritmos de compresión debido a los límites de tamaño de archivo. Sin embargo, anidar archivos en el archivo comprimido (y poner más archivos anidados en el archivo, si el algoritmo de compresión tiene una limitación de tamaño total) le permite evitar estos límites.
Blixt
133
debe hacer un archivo 1.3 exabyte de 1's. Son mucho más delgados que los 0 :)
Quinn Wilson
33
@quinn - es por eso que la compresión de los más gordos (Duro) ceros es mucho más eficaz
wefwfwefwe
1
Esto le da un archivo zip> 1gb a menos que me equivoque
Chris S
36

Esto se hace fácilmente bajo Linux usando el siguiente comando:

dd if=/dev/zero bs=1024 count=10000 | zip zipbomb.zip -

Reemplace el recuento con el número de KB que desea comprimir. El ejemplo anterior crea una bomba zip de 10MiB (no es una gran bomba, pero muestra el proceso).

NO necesita espacio en el disco duro para almacenar todos los datos sin comprimir.

Thomi
fuente
8
Pero necesita la potencia informática para comprimir los datos sin comprimir, sigue siendo O (n) en el tamaño de los datos sin comprimir .
tonfa
2
Sí, como todas las otras respuestas aquí.
Thomi
66
La respuesta de Michael Borgwardt es O (log N) en el tamaño de los datos sin comprimir.
Steve Jessop
1
Aproximadamente, de todos modos. Cada repetición del proceso "elimina los encabezados del archivo, duplica la entrada del archivo comprimido 10 veces, reemplaza los encabezados del archivo, comprime", aumenta el nivel de anidación zip en 1, toma tiempo proporcional al tamaño de los datos comprimidos del paso anterior , multiplica el tamaño de los datos sin comprimir por 10, y si aumenta el tamaño de los datos comprimidos, ciertamente no lo hace por un factor lineal.
Steve Jessop
3
Entonces, solo como prueba, comprimo -9 1.3 GB de ceros. El resultado es un archivo 1.3M. Dupliqué esto 10 veces (no podría molestarse en manipular los encabezados zip, por lo que el resultado no funcionará como una bomba zip, pero ilustra el principio) para dar un archivo 13M, que se comprime con zip -9 a 34381 bytes. Entonces, el paso de duplicación en realidad hace que el archivo sea más pequeño, porque deflate solo admite tokens de cierto tamaño máximo. El siguiente paso da como resultado 18453, luego 19012, 19312, 19743, 20120, 20531, 20870.
Steve Jessop
10

A continuación es para Windows:

Desde la prueba de concepto Security Focus (NSFW!), Es un archivo ZIP con 16 carpetas, cada una con 16 carpetas, que continúa así (42 es el nombre del archivo zip):

\ 42 \ lib 0 \ book 0 \ chapter 0 \ doc 0 \ 0.dll
...
\ 42 \ lib F \ book F \ chapter F \ doc F \ 0.dll

Probablemente estoy equivocado con esta cifra, pero produce 4 ^ 16 (4,294,967,296) directorios. Debido a que cada directorio necesita un espacio de asignación de N bytes, termina siendo enorme. El archivo dll al final es de 0 bytes.

Descomprimir el primer directorio solo \42\lib 0\book 0\chapter 0\doc 0\0.dllda como resultado 4 gb de espacio de asignación.

Chris S
fuente
27
Simplemente asumí que eran mujeres desnudas haciendo investigación de seguridad.
James McMahon
3
El zip fue nsfw. Se disparará una gran alarma roja de pánico y una jaula caerá del techo alrededor de su escritorio
Chris S
44
Si cada visita a un archivo de virus resulta en una entrevista con RRHH, entonces no necesita el escáner de virus o no necesita su departamento de RRHH. Uno de ellos no está contribuyendo al negocio ;-)
Steve Jessop
2
También podría ser NSFW porque un escáner de virus de red podría desear verificarlo y extraerlo para hacerlo.
Michael Stum
55
El escáner de virus solo debe marcarlo como sospechoso (lo que puede provocar que se bloquee de forma segura o que se informe de forma insegura por intentar instalar virus). Si la bomba realmente explota, entonces su departamento de TI ha aprendido algo valioso: necesitan un mejor antivirus.
Steve Jessop
8

Respuesta seria:

(Muy básicamente) La compresión se basa en detectar patrones repetitivos, por lo que el archivo zip contendría datos que representan algo como

0x100000000000000000000000000000000000  
(Repeat this '0' ten trillion times)

Archivo zip muy corto, pero enorme cuando lo expande.

wefwfwefwe
fuente
1
Eso podría comprimirse aún más, realmente: 0x1 (0x35) (es decir, el segundo 0 se repite 35 veces, por lo que se expandiría a su comentario)
Michael
5

Para crear uno en un entorno práctico (es decir, sin crear un archivo de 1.3 exabytes en su disco duro enorme), probablemente tenga que aprender el formato de archivo a nivel binario y escribir algo que se traduzca a cómo se vería su archivo deseado, después de compresión.

Andy_Vulhop
fuente
5

El artículo menciona 9 capas de archivos zip, por lo que no es un simple caso de comprimir un montón de ceros. ¿Por qué 9, por qué 10 archivos en cada uno?

En primer lugar, el artículo de Wikipedia dice actualmente 5 capas con 16 archivos cada una. No estoy seguro de dónde viene la discrepancia, pero no es tan relevante. La verdadera pregunta es por qué usar anidamiento en primer lugar.

DEFLATE, el único método de compresión comúnmente soportado para archivos zip *, tiene una relación de compresión máxima de 1032. Esto puede lograrse asintóticamente para cualquier secuencia repetitiva de 1-3 bytes. No importa lo que le haga a un archivo zip, siempre y cuando solo esté usando DEFLATE, el tamaño desempaquetado será como máximo 1032 veces el tamaño del archivo zip original.

Por lo tanto, es necesario usar archivos zip anidados para lograr relaciones de compresión realmente escandalosas. Si tiene 2 capas de compresión, la relación máxima se convierte en 1032 ^ 2 = 1065024. Para 3, es 1099104768, y así sucesivamente. Para las 5 capas utilizadas en 42.zip, la relación de compresión máxima teórica es 1170572956434432. Como puede ver, el 42.zip real está lejos de ese nivel. Parte de eso es la sobrecarga del formato zip, y parte de eso es que simplemente no les importaba.

Si tuviera que adivinar, diría que 42.zip se formó simplemente creando un archivo vacío grande y comprimiéndolo y comprimiéndolo repetidamente. No hay ningún intento de superar los límites del formato o maximizar la compresión ni nada, simplemente seleccionaron arbitrariamente 16 copias por capa. El punto era crear una gran carga útil sin mucho esfuerzo.

Nota: Otros formatos de compresión, como bzip2, ofrecen relaciones de compresión máxima mucho, mucho, mucho más grandes. Sin embargo, la mayoría de los analizadores zip no los aceptan.

PD: es posible crear un archivo zip que se descomprimirá en una copia de sí mismo (una quine). También puede hacer uno que descomprima en múltiples copias de sí mismo. Por lo tanto, si descomprime recursivamente un archivo para siempre, el tamaño máximo posible es infinito. La única limitación es que puede aumentar como máximo 1032 en cada iteración.

PPS La figura 1032 supone que los datos del archivo en el archivo zip son disjuntos. Una peculiaridad del formato de archivo zip es que tiene un directorio central que enumera los archivos en el archivo y se desplaza a los datos del archivo. Si crea múltiples entradas de archivo que apuntan a los mismos datos, puede lograr relaciones de compresión mucho más altas incluso sin anidar, pero es probable que los analizadores rechacen dicho archivo zip.

Antimonio
fuente
4

Una buena manera de crear un zipbomb (o gzbomb) es conocer el formato binario al que se dirige. De lo contrario, incluso si usa un archivo de transmisión (por ejemplo, usando /dev/zero), todavía estará limitado por la potencia informática necesaria para comprimir la transmisión.

Un buen ejemplo de una bomba gzip: http://selenic.com/googolplex.gz57 (hay un mensaje incrustado en el archivo después de varios niveles de compresión que resultan en archivos enormes)

Diviértete encontrando ese mensaje :)

tonfa
fuente
2

¿Quizás, en Unix, podría canalizar una cierta cantidad de ceros directamente en un programa zip o algo así? Sin embargo, no sé lo suficiente sobre Unix para explicar cómo lo harías. Aparte de eso, necesitaría una fuente de ceros y colocarlos en una cremallera que lea de stdin o algo así ...

Svish
fuente
Votados por no tener en cuenta la pregunta real, que menciona un archivo específico que explícitamente no es el resultado de comprimir un gran flujo de ceros.
Michael Borgwardt
No, todavía estará limitado por la potencia informática. Idealmente, no desea ejecutar gzip / zip, ya que usará una gran cantidad de CPU (o al menos O (n) n será del tamaño del archivo descomprimido)
tonfa
@tonfa: Bueno, por supuesto, estarás limitado por la potencia informática. Mi razonamiento fue que es posible que no desee crear un archivo exabyte de gran tamaño en su disco y luego comprimirlo ...
Svish
2

Todos los algoritmos de compresión de archivos se basan en la entropía de la información a comprimir. Teóricamente, puede comprimir una secuencia de 0 o 1, y si es lo suficientemente larga, se comprimirá muy bien.

Esa es la parte de la teoría. La parte práctica ya ha sido señalada por otros.

Calyth
fuente
2

Algoritmos de compresión recientes (posteriores a 1995) como bz2, lzma (7-zip) y rar dan una compresión espectacular de archivos monótonos, y una sola capa de compresión es suficiente para envolver contenido de gran tamaño a un tamaño manejable.

Otro enfoque podría ser crear un archivo disperso de tamaño extremo (exabytes) y luego comprimirlo con algo mundano que comprenda archivos dispersos (por ejemplo, tar), ahora si el examinador transmite el archivo, el examinador deberá leer más allá de todos los ceros que existen solo para rellenar entre el contenido real del archivo, si el examinador lo escribe en el disco, sin embargo, se utilizará muy poco espacio (suponiendo un desarchivador con buen comportamiento y un sistema de archivos moderno).

usuario340140
fuente
2

Lo intenté. El tamaño del archivo zip de salida era un pequeño archivo de 84 KB.

Pasos que hice hasta ahora:

  1. cree un archivo .txt de 1.4 GB lleno de '0'
  2. comprimirlo
  3. cambie el nombre del .zip a .txt y luego haga 16 copias
  4. comprimirlo todo en un archivo .zip,
  5. cambie el nombre de los archivos .txt renombrados dentro del archivo .zip a .zip nuevamente
  6. repita los pasos 3 a 5 ocho veces.
  7. Disfruta :)

aunque no sé cómo explicar la parte donde la compresión del archivo zip renombrado todavía lo comprime en un tamaño más pequeño, pero funciona. Quizás solo me faltan los términos técnicos.

Jaycroll
fuente
Por cierto, no tengas miedo de que extraiga continuamente todos los archivos zip que contiene. Solo extrae el archivo zip que está anidado debajo de él, y no hasta el final.
jaycroll
2

Silicon Valley Season 3 Episode 7 me trajo aquí. Los pasos para generar una bomba zip serían.

  1. Cree un archivo ficticio con ceros (o unos si cree que son delgados) de tamaño (digamos 1 GB).
  2. Comprime este archivo en un archivo zip, por ejemplo 1.zip.
  3. Haga n(digamos 10) copias de este archivo y agregue estos 10 archivos a un archivo comprimido (digamos 2.zip).
  4. Repita el paso 3 kvarias veces.
  5. Obtendrás una bomba zip.

Para una implementación de Python, verifique esto .

Abdul Fatir
fuente
1

No sé si ZIP usa la codificación de longitud de ejecución, pero si lo hiciera, un archivo comprimido de este tipo contendría una pequeña pieza de datos y un valor de longitud de ejecución muy grande. El valor de longitud de ejecución especificaría cuántas veces se repite el pequeño dato. Cuando tiene un valor muy grande, los datos resultantes son proporcionalmente grandes.

Joe
fuente
2
ZIP utiliza la compresión Lempel-Ziv-Welch (o una versión modificada de) que efectivamente tokeniza los datos. Las series largas de 'conjuntos' de bytes darán como resultado una buena compresión, de ahí que GIF (que también usa LZW) sea bueno para gráficos y JPEG (que usa una compresión de onda sinusoidal compleja) es mejor para fotos donde los datos son mucho más 'aleatorios '.
Lázaro