Bomba Zip I: Bombas recursivas

Cuando un archivo se comprime, se reduce su tamaño. El principio en el que se basa es sencillo: si tienes un archivo con el texto “aaaaaabbb”, que ocupa 9 caracteres, podrías reducir el tamaño si lo guardas como “6a3b”. Utilizando este rudimentario algoritmo, puedes descomprimir el archivo comprimido multiplicando el numero de veces que indica la cifra el caracter que le sigue. 

Por esto mismo dos archivos que pesen lo mismo se comprimen con una tasa de compresión distinta. Siguiendo el ejemplo anterior, el archivo “aaaaaabbb” pasaría a ser “6a3b”, lo que supone una tasa de compresión 4:9, es decir, se reduce un 66%. Sin embargo, el archivo “aaabbaaab” pasaría a ser “3a2b3a1b”, con una tasa de compresión 8:9, tan solo se reduce un 12%.

El otro método de compresión supone una pérdida de datos, puesto que se basa en eliminar información que no aporta mucho al resultado final, pero que requiere de muchos bytes para ser almacenada. Esto se puede hacer sin grandes problemas en imágenes y música. 

Hay cientos de algoritmos de compresión. Es una rama de la informática muy intersante. Si te interesa ahondar más en ello, te recomiendo este post sobre la historia de los algoritmos de compresión.

 

Las bombas zip

Ahora imagina que puedes conseguir una tasa de compresión muy muy buena. 1:1000. O mejor, 1:1000000. Esto implicaría que un archivo de varios TB se comprima en otro de unos pocos KB. Si este archivo comprimido se lo mandamos a un usuario incauto que lo descomprima, su ordenador intentará descomprimir una cantidad de datos superior a su capacidad de almacenamiento, lo que provocará que el sistema se quede pillado. Esto se puede utilizar para ataca la disponibilidad de un sistema, o para incapacitar su antivirus y tratar de entrar con otro tipo de malware.

A continuación te voy a mostrar varias formas de hacer este tipo de ataque.

Bombas zip recursivas

El método de compresión de los archivos zip es DEFLATE. El mayor inconveniente que encontramos es que la tasa de compresión máxima que admite este método es 1:1032. Por ello se utiliza la recursión. De esa forma, mediante una recursión piramidal, puedes obtener una tasa de compresión realmente alta. Veamos un ejemplo. Primero, he creado con un bucle en python un archivo de 17GB que contiene únicamente ceros, “file.txt”.

A continuación lo he comprimido, creando el archivo 1.zip., que ocupa tan solo 17MB. He realizado 9 copias de este archivo comprimido. Para comprimirlo basta con utilizar el comando zip 1.zip file.txt

Ahora llega el único problema que he encontrado haciendo esta PoC. Si intentamos comprimir estos 10 zips en otro zip, veríamos que el archivo resultante no ha comprimido nada, y ocupa lo mismo que los 10 zips juntos:

 

Esto se debe a que el método “store” de Zip no realiza ninguna compresión, y Zip elige este método cuando considera que es mejor almacenar en vez de comprimir, como es este caso. Tampoco sirve que indiques que quieres comprimirlo con la opcion -Z deflate, si el programa lo considera mejor seguirá almacenandolo con store.

Sin embargo, utiliizando la librería de python zipfile puedes forzar a que comprima. Yo he realizado este pequeño script que comprime los diez zips en uno solo, y lo he metido en un bucle para tener 10 copias de este nuevo zip.

Estas nuevas copias ocupan tan solo 263KB:

Con un anidamiento de 4 niveles, llegamos a tener un solo zip de 29KB que contiene 10 zips de 26KB que contienen cada uno 10 zips de 27KB que contienen cada uno 10 zips de 263KB que contienen cada uno 10 zips de 17MB que contienen cada uno un archivo de 17GB. Esto supone un total de 17*10*10*10*10 = 170TB comprimidos en tan solo 29KB. Y basta con hacer un par de iteraciones más para conseguir varios PB con apenas unos KB.

Puedes acceder aquí al siguiente blog con información sobre otro tipo de bombas zip: las bombas quine.

 

Lethani.

Lethani

Hola! Soy el admin ;)

Esta entrada tiene 3 comentarios

Deja una respuesta