Zip bomba cómo funciona. La bomba de archivo de Putin. Wordpress nos ha sentenciado

💖 ¿Te gusta? Comparte el enlace con tus amigos
[Actualización] Ahora estoy en una lista de inteligencia porque escribí un artículo sobre algún tipo de "bomba", ¿verdad?

Si alguna vez alojó un sitio web o administró un servidor, probablemente esté al tanto de las malas personas que intentan hacer cosas malas en su propiedad.

Cuando alojé por primera vez mi pequeña caja de Linux con acceso SSH a la edad de 13 años, miré los registros y todos los días vi direcciones IP (principalmente de China y Rusia) tratando de conectarse a mi dulce caja pequeña (que en realidad era una vieja computadora portátil ThinkPad T21 con una pantalla rota zumbando debajo de la cama). Informé estas direcciones IP a sus ISP.

De hecho, si tienes un servidor Linux con SSH abierto, puedes comprobar por ti mismo cuántos intentos de conexión se producen al día:

Grep "fallos de autenticación" /var/log/auth.log


Cientos de intentos de autorización fallidos, aunque el servidor no tiene ninguna autorización de contraseña y se ejecuta en un puerto no estándar

Wordpress nos ha sentenciado

De acuerdo, seamos realistas, los escáneres de vulnerabilidad web existían antes de Wordpress, pero después de que la plataforma se hizo tan popular, la mayoría de los escáneres comenzaron a buscar carpetas wp-admin mal configuradas y complementos sin parches.

Entonces, si una pequeña pandilla de piratas informáticos novatos quiere obtener algunas cuentas nuevas, descargarán una de estas herramientas de escaneo y la ejecutarán contra un montón de sitios web con la esperanza de acceder a algún sitio y desfigurarlo.


Registros de muestra cuando se escanean con la herramienta Nikto

Esta es la razón por la que todos los servidores y administradores de sitios web manejan gigabytes de registros llenos de intentos de rastreo. Así que pensé...

¿Puedes contraatacar?

Después de experimentar con el uso potencial de IDS o Fail2ban, recordé las buenas bombas ZIP del pasado.

¿Qué clase de cosa es una bomba ZIP?

Resulta que la compresión ZIP es excelente para manejar datos repetitivos, por lo que si tiene un gigante Archivo de texto, lleno de datos repetidos como todos los ceros, se comprimirá muy bien. Quiero decir MUY bueno.

Como mostró 42.zip, es posible comprimir 4,5 petabytes (4.500.000 gigabytes) en 42 kilobytes. Cuando intente ver el contenido del archivo (extraerlo o descomprimirlo), probablemente utilizará todo el espacio en disco o RAM.

¿Cómo lanzar una bomba ZIP en un escáner de vulnerabilidad?

Desafortunadamente, los navegadores web no entienden ZIP, pero sí entienden GZIP.

Así que lo primero que haremos será crear un archivo GZIP de 10 GB lleno de ceros. Puede hacer muchas compresiones anidadas, pero comencemos con una simple.

Dd if=/dev/cero bs=1M cuenta=10240 | gzip > 10G.gzip


Construyendo una bomba y comprobando su tamaño.

Como puedes ver, su tamaño es de 10 MB. Podría haber sido un poco más ajustado, pero eso es suficiente por ahora.

Ahora instalemos un script PHP que lo entregará al cliente.

¡Listo!

Ahora podemos usarlo como una simple defensa:

Obviamente, este script no es una pieza de elegancia, pero puede protegernos de los script kiddies mencionados anteriormente, que no tienen idea de que es posible cambiar el agente de usuario en los rastreadores.

Entonces... ¿Qué pasa si ejecutas este script?


(si probó la bomba en otros dispositivos/navegadores/scripts, por favor

Un evento muy interesante e importante sucedió en silencio e imperceptiblemente para los insultantes. El presidente ruso, Vladimir Putin, se reunió y habló con uno de los líderes del servicio civil, cuyo nombre rara vez aparece en la prensa. No, esta persona no es un agente secreto, aunque por la naturaleza de su actividad tiene acceso a información clasificada, pudiendo incluso ser considerado una especie de “luchador del frente invisible”. En general, Putin habló con el jefe de la Agencia Federal de Archivos, Andrei Artizov.

La conversación entre el jefe de Estado y el titular de la agencia fue de carácter comercial, cuyas posibles consecuencias podrían provocar en algunos lugares el efecto de la explosión de una bomba, y en algunos casos incluso la detonación de una boquilla personal.

El presidente hizo una declaración de bajo perfil de que había decidido desclasificar muchos documentos de archivo, además, el decreto se firmaría el mismo día. Además, Putin anunció el traspaso del Rosarkhiv a la subordinación directa del presidente de Rusia, ya que muchos de los materiales del departamento “tienen un valor particular y son de importancia mundial”.

El titular de la agencia, a su vez, informó al presidente que el fondo de archivos de Rusia almacenó 500 millones de archivos, y que "nunca en las últimas décadas se ha planificado, organizado un trabajo de desclasificación como se está haciendo ahora".

El punto clave es que inmediatamente después de la desclasificación, los documentos de archivo estarán disponibles en el sitio web oficial del Archivo Ruso, para el cual ya se ha creado una base de datos especial.

Entre los archivos ya desclasificados se encuentran materiales con los que los historiadores nacionales y extranjeros se relamieron durante mucho tiempo: 1400 directivas únicas de Stalin, órdenes del Cuartel General, órdenes de primera línea, mapas operativos, resoluciones y fotografías de esa época, hasta hace poco guardado en el archivos bajo el título "ultrasecreto".

Uno solo puede alegrarse sinceramente por los historiadores, desearles trabajos frescos e interesantes, que se basarán en los documentos mencionados anteriormente, pero solo la desclasificación no afectará un solo tema histórico-militar.

Una fuente cercana a los archivos rusos proporciona detalles interesantes: “Hasta donde yo sé por información del departamento de archivos, se trata del período de 1930 a 1989. Hay casos, disculpe, de delatores -así como inocentemente reprimidos- con apellidos muy interesantes. Habrá datos sobre desarrollos espaciales y militares que ya se pueden informar. Además, se están desclasificando datos sobre el curso de las batallas, órdenes e inteligencia recibida durante la Gran Guerra Patria, así como sobre las relaciones interestatales durante la Guerra Fría.

Y añade con mucho peso: “Algunos documentos sorprenderán a la sociedad. Necesitas conocer tu propia historia, cualquiera que sea.

Los archivos tienen una larga memoria y llevan una carga potencial no peor que una bomba de hidrógeno. No es casualidad que en nuestro país el “caso de los alguaciles” y el “caso de los médicos” sigan clasificados, durante mucho tiempo dando pie a todo tipo de especulaciones. No hace mucho tiempo, en el Reino Unido, una comisión especial se ocupó de los documentos de archivo cuyo período de secreto estaba llegando a su fin, pero se decidió extender el régimen de secreto por otros 50 años en base a los datos de los contactos de antes de la guerra de la inteligencia británica con el SD nazi.

La reserva de que “algunos documentos sorprenderán al público” no es casual. A fines de la década de 1980, tanto en Rusia como en las repúblicas de la antigua URSS, una variedad de personas llegaron al poder en la ola de "democratización".

Muchos muestran una vitalidad política asombrosa, a pesar de su aparente falta de talento gerencial y una tendencia a enseñarle a la gente sobre la democracia desde su punto de vista.

En el extranjero cercano, los antiguos líderes de los "frentes populares", que cambiaron su visión del mundo de antisoviética a antirrusa, se aferraron firmemente al poder y siguen una política hostil hacia Rusia desde su territorio, desde la organización de congresos de todo tipo. de desposeídos de "Rusia Abierta" para entrenar militantes pro-fascistas y brindar asistencia militar a Bandera.

La comunidad europea, así como los ciudadanos de estos tramos limítrofes, estarán interesados ​​en aprender de los documentos desclasificados del Rosarchive, cuáles de los notables "eurodemócratas" eran informantes de la KGB. Los rumores de que el exlíder del Frente Nacional de Lituania Landsbergis y la actual señora presidenta Dalia Grybauskaite "golpearon" a la KGB en la época de la juventud nublada: la tierra está llena. Ahora, sobre este lado de su biografía, creo que será posible aprender de la fuente original.

Puedes chismear que "fue hace mucho tiempo, y no es cierto", "el pasado ha crecido", tanto como quieras, pero no subestimes el poder destructivo de tales revelaciones.

Se puede recordar cómo el año pasado un paquete de documentos desenterrado por el Instituto de la Memoria Nacional, sobre la colaboración de Lech Walesa (bajo el impulso operativo "Bolek"), fue arrancado espectacularmente en la prensa polaca en medio de sus actividades en el Gdansk. astillero. La explosión de información no dejó piedra sin remover en la imagen del ícono, "Polo No. 1", el líder de Solidaridad, el ganador del Premio Nobel de la Paz y el primer presidente de la Polonia antisoviética. A partir de ahora, Walesa no es más que un viejo gordo y bigotudo, ruina de una época pasada, cuya vergüenza se ve con tus propios ojos en forma de 17 recibos depositados en el mismo Instituto de la Memoria Nacional por recibir dinero por el golpe. -knock-información transferida a los servicios especiales.

Uno solo puede lamentar que la "bomba" de archivo no explotó bajo el fondo del agente "Bolek" en la década de 1980, cuando él y su "Solidaridad", que cantaba con los servicios de inteligencia occidentales, sacudieron a la Polonia socialista.

Muchas sorpresas interesantes también pueden acechar a los liberales nacionales. Su sinuoso camino de vida es en muchos aspectos similar al camino de Walesa hacia las alturas del poder. Para nuestro profundo pesar, la KGB no tuvo prisa por exponer a los informantes reformados por muchas razones, entre las cuales las éticas no ocuparon el último lugar. Después de todo, si revela un agente, especialmente uno voluntario, ¿quién cooperará? No llegará muy lejos con los agentes atrapados en la comisión de actos indecorosos y reclutados sobre esta base.

Los medios de comunicación difunden información no oficial de que "figuras prominentes del movimiento liberal-democrático en Rusia" cooperaron voluntariamente con los servicios secretos soviéticos, por motivos egoístas: interesantes viajes de negocios, promoción profesional, trabajo prestigioso, etc.

Uno solo puede imaginar qué tipo de víboras chillonas fueron varias asociaciones creativas de escritores, figuras teatrales y cineastas.

Para muchos críticos de la URSS y el sistema soviético, los padres no solo eran figuras prominentes del partido o de la economía, sino que también servían en los organismos de la NKVD-MGB-KGB, e incluso tomaron parte personal en las represiones.

Por supuesto, los niños no son responsables de sus padres, pero se vuelve repugnante en el fondo cuando se lleva a los hijos repintados a exponer y arrancar las cubiertas, que no quieren recordar el pasado de sus padres, pero una vez, sin ningún remordimiento, tomó ventaja de su alta posición, como trampolín hacia un futuro personal brillante.

Los archivos desclasificados son capaces de influir en la alineación de fuerzas en la Ucrania bandida. Uno puede recordar cómo una serie de documentos publicados en las redes sociales por Miroslava Berdnik incluso antes del golpe de Maidan, sobre la cooperación de los líderes de la OUN con el Ministerio de Seguridad del Estado y el Ministerio del Interior, provocaron ataques de contorsiones y fuentes de Diarrea de garganta entre fans de Bandera muerta. Los Svidomitas maldijeron, llamaron a las fotocopias de los documentos "falsificaciones de FB", pero no pudieron discutir por ningún motivo.

¿Por qué es importante? El nacionalismo radical ucraniano es malvado sin reservas. Pero es profesado por una variedad de personas. Entre los miembros modernos de la OUN hay sus propios idealistas que quieren purgar el nacionalismo ucraniano de las figuras más odiosas de Bandera y Shukhevych, ya que se han comprometido durante mucho tiempo e irremediablemente como títeres y castigadores hitlerianos. Sea como fuere, pero la inteligencia soviética de la posguerra entendió bien los sentimientos de los nacionalistas alemanes, que claramente se separaron de los nazis y los partidarios del general Gehlen, que cayeron bajo los estadounidenses. Los nacionalistas alemanes, que consideraban a Bismarck su ídolo, habiendo sobrevivido a los horrores de la guerra y viendo cómo los estadounidenses empujaban a la RFA a una nueva guerra con la URSS, prefirieron trabajar para la inteligencia soviética y de Alemania Oriental. Definitivamente vale la pena considerar este punto.

Por otro lado, Ucrania está llena de ardientes neobanderistas que no sufren exceso de repugnancia, que no temen ninguna prueba documental de la cooperación de sus ídolos con los servicios secretos nazis. ¿Y qué pasa si se publican documentos desclasificados que dicen que sus ídolos, como Vasil Kuk, filtraron información al MGB sobre sus "hermanos" sentados en escondites?

¿Qué pasa si de repente resulta que todo tipo de "derechistas" y "cuadrados" de finales del período soviético llamaron a la KGB para suavizar el régimen de encarcelamiento, por un paquete adicional de tocino de casa o un paquete de pelusa de un puesto de campamento? ¿Resistirá personalmente la "spilnota" de Bandera, que ve en todas partes la mano larga de Moscú, el FSB y Putin, tal prueba de fuerza de convicciones?

Información de este tipo puede provocar una poderosa liberación de plasma termonuclear de los dups Svidomo, cuyos propietarios se jactan de "pureza nacional" y "Svidomo". Las revelaciones de los ídolos pueden hacer que alguien retroceda y cambie de opinión.

Sería interesante conocer la doble vida de los líderes del autodenominado "Mejlis", así como de otras viles figuras, que languidecen bajo el peso de la "conciencia de la nación" arbitrariamente asumida.

Entonces, ¿bajo el trasero personal de quién explotará la primera "bomba" de archivo? ¿Quién irá con la "locomotora" desenrollando una larga cadena de revelaciones?


*Hay dos versiones de 42.zip: la anterior tiene 42 374 bytes y la más nueva tiene 42 838 bytes. La diferencia es que el nuevo requiere una contraseña antes de desempacar. Solo comparamos con la versión anterior. Aquí hay una copia del archivo si lo necesita: 42.zip.

Las bombas zip deben superar el hecho de que el algoritmo de compresión DEFLATE más comúnmente admitido por los analizadores no puede exceder una relación de compresión de 1032 a 1. Por esta razón, las bombas zip generalmente se basan en la descompresión recursiva al anidar archivos zip dentro de archivos zip para obtener una relación adicional 1032 con cada capa. Pero el truco solo funciona en implementaciones que se desempaquetan recursivamente, y la mayoría no lo hace. La bomba 42.zip más famosa se expande a unos formidables 4,5 PB cuando las seis capas se descomprimen recursivamente, pero tiene unos míseros 0,6 MB en la capa superior. Zip quines, como los de Cox y Ellingsen, producen una copia de sí mismos y, por lo tanto, se expanden indefinidamente cuando se descomprimen recursivamente. Pero también son perfectamente seguros cuando se desempaquetan una vez.

Este artículo muestra cómo crear una bomba zip no recursiva cuya relación de compresión supere el límite DEFLATE de 1032. Funciona superponiendo archivos dentro de un contenedor zip para hacer referencia al "núcleo" de datos altamente comprimidos en varios archivos sin hacer varias copias. El tamaño de salida de una bomba zip crece cuadráticamente desde el tamaño de entrada; es decir, la relación de compresión mejora a medida que aumenta el tamaño de la bomba. El diseño depende de las características de zip y DEFLATE: no es directamente portátil a otros formatos de archivo o algoritmos de compresión. La bomba es compatible con la mayoría de los analizadores zip, a excepción de los analizadores de "transmisión", que analizan los archivos en una sola pasada sin verificar el directorio central del archivo zip. Intentamos equilibrar dos objetivos en conflicto:

  • Aumente la relación de compresión. Definimos la relación de compresión como la suma de los tamaños de todos los archivos en el archivo dividida por el tamaño del propio archivo zip. Esto no incluye nombres de archivo u otros metadatos del sistema de archivos, solo contenido.
  • Mantener la compatibilidad. Zip es un formato complejo y los analizadores difieren, especialmente en casos extremos y características adicionales. No use trucos que solo funcionan con ciertos analizadores. Notaremos algunas formas de mejorar la efectividad de la bomba zip con una cierta pérdida de compatibilidad.

Estructura del archivo zip

El archivo zip consta de directorio central enlaces a archivos.

El directorio central se encuentra al final del archivo zip. esta es la lista encabezados del directorio central. Cada encabezado del directorio central contiene metadatos de un solo archivo, como el nombre del archivo y la suma de verificación CRC-32, y un puntero de retroceso al encabezado del archivo local. El encabezado del directorio central tiene una longitud de 46 bytes más la longitud del nombre del archivo.

El archivo consta de un encabezado de archivo local seguido de los datos del archivo comprimido. La longitud del encabezado del archivo local es de 30 bytes más la longitud del nombre del archivo. Contiene una copia redundante de los metadatos del encabezado del directorio central y los tamaños de los archivos de datos comprimidos y sin comprimir detrás de él. Zip es un formato contenedor, no un algoritmo de compresión. Los datos de cada archivo se comprimen utilizando el algoritmo especificado en los metadatos, generalmente DEFLATE.

Esta descripción del formato zip omite muchos detalles que no son necesarios para comprender la bomba zip. Consulte la Sección 4.3 APPNOTE.TXT o la "Estructura de archivos PKZip" de Florian Buchholz para obtener detalles completos, o consulte .

La considerable redundancia y muchas ambigüedades en el formato zip abren oportunidades para travesuras de todo tipo. La bomba zip es solo la punta del iceberg. Enlaces para leer más:

$ python3 -m zipfile -e superposición.zip. Rastreo (última llamada más reciente): ... __main__.BadZipFile: el nombre del archivo en el directorio "B" y el encabezado b"A" difieren.
A continuación, veremos cómo modificar la construcción para que el nombre de archivo sea coherente y, al mismo tiempo, conservar la mayoría de los beneficios de los archivos superpuestos.

Segundo descubrimiento: citar encabezados de archivos locales

Necesitamos separar los encabezados de los archivos locales para cada archivo, sin dejar de reutilizar un núcleo. Simplemente concatenar todos los encabezados no funciona, porque el analizador zip encontrará ese encabezado de archivo local donde espera que comience la transmisión DEFLATE. Pero la idea funcionará, con algunos cambios. Usaremos la función DEFLATE de bloques sin comprimir para "citar" encabezados de archivos locales para que parezcan ser parte del mismo flujo DEFLATE que termina en el kernel. Cada encabezado de archivo local (excepto el primero) se interpretará de dos maneras: como código (parte de la estructura del archivo zip) y como datos (parte del contenido del archivo).

Un flujo DEFLATE es una secuencia de bloques, donde cada bloque se puede comprimir o descomprimir. Por lo general, solo pensamos en bloques comprimidos, por ejemplo, el núcleo es un gran bloque comprimido. Pero también los hay sin comprimir que comienzan con un encabezado de 5 bytes con un campo de longitud, lo que simplemente significa: "imprime lo siguiente norte bytes textualmente. Descomprimir un bloque sin comprimir solo significa eliminar el encabezado de 5 bytes. Los bloques comprimidos y sin comprimir se pueden mezclar libremente en el flujo DEFLATE. El resultado es una concatenación de los resultados de desempaquetar todos los bloques en orden. El término "sin comprimir" solo es relevante en el nivel DEFLATE; los datos del archivo todavía se consideran "comprimidos" en el nivel zip, sin importar qué bloques se usen.

La forma más sencilla de pensar en esta construcción es como una superposición interna, desde el último archivo hasta el primero. Comenzamos insertando un kernel que formará el final del archivo de datos para cada archivo. Adición de un encabezado de archivo LFH local norte y el título del directorio central CDH norte, que lo señala. Establezca el campo de metadatos de tamaño comprimido en LFH norte y CDH norte en el tamaño comprimido del kernel. Ahora agregamos un encabezado de bloque sin comprimir de 5 bytes (en verde en el diagrama), cuyo campo de longitud es igual al tamaño de LFH norte. Adición de un segundo encabezado de archivo LFH local norte−1 y encabezado del directorio central de CDH norte−1 , que apunta a él. Establezca el campo de metadatos "tamaño comprimido" como el nuevo encabezado de tamaño comprimido del kernel más tamaño de encabezado de bloque sin comprimir (5 bytes) más Tamaño LFH norte .

Por el momento, el archivo zip contiene dos archivos llamados Y y Z. Veamos lo que verá el analizador al analizar. Suponga que el tamaño del kernel comprimido es de 1000 bytes y el tamaño de LFH es norte- 31 bytes. Comenzando con CDH norte−1 y sigue el puntero a LFH norte-1 . El nombre del primer archivo es Y y el tamaño comprimido de su archivo de datos es de 1036 bytes. Al interpretar los siguientes 1036 bytes como un flujo DEFLATE, primero encontramos un encabezado de bloque sin comprimir de 5 bytes que dice copiar los siguientes 31 bytes. Escriba los siguientes 31 bytes, que son LFH norte, que descomprimimos y agregamos al archivo Y. Continuando con la transmisión DEFLATE, encontramos el bloque comprimido (kernel), que descomprimimos en el archivo Y. Ahora hemos llegado al final de los datos comprimidos y hemos terminado con el archivo Y.

Pasando al siguiente archivo, seguimos el puntero de CDH norte a LFH norte y busque un archivo llamado Z, cuyo tamaño comprimido es de 1000 bytes. Al interpretar estos 1000 bytes como un flujo DEFLATE, inmediatamente encontramos el bloque comprimido (núcleo nuevamente) y lo descomprimimos en el archivo Z. Hemos llegado al final del archivo final y hemos terminado. El archivo de salida Z contiene el núcleo desempaquetado; el archivo de salida Y es el mismo, pero además tiene el prefijo LFH de 31 bytes norte .

Completamos la construcción repitiendo el procedimiento de cotización hasta que el archivo zip contenga la cantidad requerida de archivos. Cada archivo nuevo agrega un encabezado de directorio central, un encabezado de archivo local y un bloque sin comprimir para citar el encabezado de archivo local inmediatamente siguiente. Los datos de archivos comprimidos suelen ser una cadena de bloques DEFLATE sin comprimir (encabezados de archivos locales citados) seguidos de un kernel comprimido. Cada byte en el núcleo contribuye alrededor de 1032 norte al tamaño de salida, porque cada byte es parte de todos norte archivos Los archivos de salida también tienen diferentes tamaños: los más antiguos son más grandes que los posteriores porque citan más los encabezados de los archivos locales. El contenido de los archivos de salida no tiene mucho sentido, pero nadie dijo que debería tenerlo.

Esta construcción de comillas superpuestas tiene mejor compatibilidad que la construcción de superposición completa de la sección anterior, pero la compatibilidad tiene el costo de la compresión. Allí, cada archivo agregado valía solo el encabezado del directorio central, aquí vale el encabezado del directorio central, el encabezado del archivo local y otros 5 bytes para el encabezado de la cita.

Mejoramiento

Habiendo recibido el diseño básico de la bomba zip, intentaremos que sea lo más efectivo posible. Queremos responder a dos preguntas:
  • ¿Cuál es la relación de compresión máxima para un tamaño de archivo zip dado?
  • ¿Cuál es la relación de compresión máxima dadas las limitaciones del formato zip?

Compresión del núcleo

Es beneficioso para nosotros comprimir el núcleo tanto como sea posible, porque cada byte desempaquetado se multiplica por norte. Para ello, utilizamos un compresor DEFLATE personalizado llamado bulk_deflate, especializado en comprimir una cadena de bytes repetidos.

Todos los archivadores DEFLATE decentes se acercan a una relación de compresión de 1032 en un flujo interminable de bytes repetidos, pero nos preocupamos por el tamaño específico. En nuestro tamaño de archivo, bulk_deflate contiene más datos que los archivadores de uso general: alrededor de 26 KB más que zlib e Info-ZIP, y alrededor de 15 KB más que Zopfli, lo que sacrifica la velocidad por la calidad de la compresión.

El costo de una alta relación de compresión bulk_deflate es la falta de versatilidad. Solo puede comprimir cadenas de bytes repetidos y solo una cierta longitud, a saber, 517 + 258 k para entero k≥ 0. Además de una buena compresión, bulk_deflate es rápido y realiza el trabajo casi al mismo tiempo, independientemente del tamaño de los datos de entrada, aparte del trabajo de escribir la cadena comprimida.

Nombres de archivo

Para nuestros propósitos, los nombres de archivo son prácticamente un peso muerto. Aunque contribuyen al tamaño de salida al ser parte de los encabezados de archivos locales citados, el byte en el nombre del archivo contribuye mucho menos que el byte en el kernel. Queremos que los nombres de los archivos sean lo más cortos posible, pero diferentes, teniendo en cuenta la compatibilidad.

Cada byte gastado en un nombre de archivo significa dos bytes no gastados en el kernel (dos, porque cada nombre de archivo aparece dos veces: en el encabezado del directorio central y en el encabezado del archivo local). El byte de nombre de archivo solo da como resultado ( norte+ 1) / 4 bytes de salida, mientras que un byte en el kernel cuenta como 1032 norte. Ejemplos: , , .

La primera consideración de compatibilidad es la codificación. La especificación del formato zip establece que los nombres de archivo deben interpretarse como CP 437 o UTF-8 si se establece un determinado bit de indicador (APPNOTE.TXT, Apéndice D). Este es el principal punto de incompatibilidad entre los analizadores zip, que pueden interpretar los nombres de los archivos en alguna codificación fija o específica del lugar. Por lo tanto, por compatibilidad, es mejor limitarse a caracteres con la misma codificación tanto en CP 437 como en UTF-8. Es decir, son 95 caracteres US-ASCII imprimibles.

También estamos sujetos a restricciones de nombres del sistema de archivos. Algunos sistemas de archivos no distinguen entre mayúsculas y minúsculas, por lo que "a" y "A" no se consideran nombres diferentes. Los sistemas de archivos comunes como FAT32 no permiten ciertos caracteres como "*" y "?".

Como compromiso seguro, pero no necesariamente óptimo, nuestra bomba zip utilizará nombres de archivo de un alfabeto de 36 caracteres que no incluye caracteres especiales o mixtos:

0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Los nombres de los archivos se generan de forma obvia, todas las posiciones por turno, con la posición añadida al final del bucle:

"0", "1", "2", ..., "Z", "00", "01", "02", ..., "0Z", ..., "Z0", "Z1", "Z2", …, "ZZ", "000", "001", "002", ...
Hay 36 nombres de archivo que tienen un carácter de largo, 362 nombres de archivo que tienen dos caracteres de largo, y así sucesivamente. Cuatro bytes son suficientes para 1.727.604 nombres de archivo distintos.

Teniendo en cuenta que los nombres de los archivos en un archivo suelen tener diferentes longitudes, ¿cuál es la mejor manera de ordenarlos: del más corto al más largo, o viceversa? Si lo piensas un poco, es mejor poner los nombres más largos al final. Esta clasificación agrega más de 900 MB de salida a zblg.zip, en comparación con la ordenación más larga a la más corta. Sin embargo, se trata de una optimización menor, ya que 900 MB son solo el 0,0003 % del tamaño total del problema.

Tamaño del núcleo

La construcción de comillas superpuestas le permite colocar un núcleo de datos comprimidos y luego copiarlo de forma económica una y otra vez. Para un tamaño de archivo zip específico X, ¿cuánto espacio es óptimo para almacenar el núcleo y cuánto para crear copias?

Para encontrar el equilibrio óptimo, necesita optimizar solo una variable norte, el número de archivos en el archivo zip. cada valor norte requiere una cierta cantidad de gastos generales para los encabezados del directorio central, los encabezados de los archivos locales, los encabezados de los bloques de citas y los nombres de los archivos. El resto del espacio lo ocupará el núcleo. Porque el norte debe ser un número entero, y solo puede caber una cierta cantidad de archivos antes de que el tamaño del núcleo caiga a cero, solo verifique todos los valores posibles norte y elige el que te dé más salida.

Aplicando el procedimiento de optimización a X= 42 374 para 42.zip encuentra el máximo en norte= 250. Estos 250 archivos requieren 21 195 bytes de sobrecarga, dejando 21 179 bytes para el kernel. Un núcleo de este tamaño se descomprime en 21 841 249 bytes (una proporción de 1031,3 a 1). 250 copias del núcleo descomprimido más algunos encabezados de archivos locales citados dan una salida total descomprimida de 5.461.307.620 bytes y una tasa de compresión de 129.000.

CRC-32 se puede modelar como una máquina de estado que actualiza un registro de estado de 32 bits para cada bit de entrada. Las operaciones básicas de actualización para los bits 0 y 1 son:

Uint32 crc32_update_0(uint32 state) ( // Desplaza el bit menos significativo. bit b = state & 1; state = state >> 1; // Si el bit desplazado fuera 1, XOR con la constante CRC-32. if (b == 1) state = state ^ 0xedb88320; return state; ) uint32 crc32_update_1(uint32 state) ( // Hacer como un bit 0, luego XOR con la constante CRC-32. return crc32_update_0(state) ^ 0xedb88320; )
Si representa el registro de estado como un vector binario de 32 elementos y usa XOR para la suma y la multiplicación, entonces crc32_update_0 es una asignación lineal; es decir, se puede representar como una multiplicación por una matriz de transición binaria de 32 × 32. Para ver por qué, tenga en cuenta que multiplicar una matriz por un vector es simplemente sumar las columnas de la matriz después de multiplicar cada columna por el elemento correspondiente del vector. El estado de operación de cambio >> 1 simplemente toma cada bit i vector de estado y lo multiplica por un vector que es cero en todas partes excepto en un bit i− 1 (numeración de bits de derecha a izquierda). En términos relativos, el estado XOR final ^ 0xedb88320 ocurre solo cuando el bit b es igual a uno. Esto se puede considerar como primero multiplicar b por 0xedb88320 y luego aplicar XOR a ese estado.

Además, crc32_update_1 es simplemente crc32_update_0 más una constante (XOR). Esto hace que crc32_update_1 sea una transformación afín: una multiplicación de matrices seguida de una asignación (es decir, suma de vectores). Podemos representar la multiplicación y el mapeo de matrices en un solo paso si aumentamos las dimensiones de la matriz de transformación a 33x33 y agregamos un elemento adicional al vector de estado, que siempre es 1 (tal representación se llama coordenadas homogéneas).


Matrices de transformación de 33×33 M 0 y M 1 , que calculan el cambio de estado CRC-32 realizado por los bits 0 y 1, respectivamente. Los vectores de columna se almacenan con el bit más significativo en la parte inferior: al leer la primera columna de abajo hacia arriba, verá la constante polinomial CRC-32 edb8832016 = 111 011 011 0111 0001 0000011 001 00000 2 . Las dos matrices difieren solo en la columna final, que representa el vector de traslación en coordenadas homogéneas. En M 0 la traslación es cero, y en M 1 es edb88320 16 , una constante polinomial CRC-32. Los que están justo encima de la diagonal representan el estado de la operación estado >> 1

Ambas operaciones crc32_update_0 y crc32_update_1 se pueden representar mediante una matriz de transición de 33x33. Se muestran las matrices M 0 y M 1. La ventaja de la representación matricial es que las matrices se pueden multiplicar. Supongamos que queremos ver el cambio de estado realizado al procesar el carácter ASCII "a", cuya representación binaria es 01100001 2 . Podemos representar el cambio de estado CRC-32 acumulativo de estos ocho bits en una matriz de transformación:


Y podemos representar el cambio de estado de una cadena de "a" repetidas multiplicando muchas copias de M a - elevando la matriz a una potencia. Podemos hacer esto rápidamente usando el algoritmo de exponenciación rápida, que calcula M n en solo log 2 n pasos. Por ejemplo, aquí está la matriz de cambio de estado de una fila de 9 caracteres "a":
El algoritmo de multiplicación de matriz rápida es útil para calcular M kernel, la matriz de un kernel sin comprimir, porque el kernel es una cadena de bytes repetidos. Para obtener una suma de verificación CRC-32 de una matriz, multiplique la matriz por el vector nulo (el vector nulo está en coordenadas homogéneas, es decir, 32 ceros seguidos de un uno; aquí omitimos la complicación menor del procesamiento previo y posterior de la suma de verificación por consistencia). Para calcular la suma de comprobación de cada archivo, trabajamos al revés. Comenzando con la inicialización M:= Núcleo M. La suma de verificación del kernel también es la suma de verificación del archivo final. norte, entonces multiplicamos METRO al vector cero y almacene la suma de comprobación resultante en CDH N y LFH N . Datos del archivo n−1 igual que los datos del archivo norte, pero con el prefijo LFH N agregado. Por lo tanto, calculamos la matriz de transición de estado para LFH N y la actualizamos. Ahora METRO representa el cambio de estado acumulativo del procesamiento LFH N detrás del kernel. Calcular la suma de comprobación de un archivo n−1, de nuevo multiplicando METRO al vector nulo. Continuamos el procedimiento acumulando matrices de cambio de estado en METRO hasta que todos los archivos hayan sido procesados.

Extensión: Zip64

Anteriormente nos encontramos con un problema de expansión debido a las limitaciones del formato zip: era imposible entregar más de 281 TB, sin importar cuán inteligentemente se empaquetara el archivo zip. Es posible superar estas limitaciones utilizando Zip64, una extensión del formato zip que aumenta el tamaño de algunos campos de encabezado a 64 bits. La compatibilidad con Zip64 no es universal, pero es una de las extensiones implementadas con mayor frecuencia. En términos de relación de compresión, el efecto de Zip64 es aumentar el tamaño del encabezado del directorio central de 46 a 58 bytes y el tamaño del encabezado del directorio local de 30 a 50 bytes. Al observar la fórmula para el factor de expansión óptimo en el modelo simplificado, podemos ver que la bomba zip Zip64 aún crece cuadráticamente, pero más lentamente debido al denominador más grande; esto se puede ver en el diagrama a continuación. Debido a la pérdida de compatibilidad y al crecimiento más lento, se eliminan casi todas las restricciones sobre el tamaño del archivo.

Digamos que queremos una bomba zip que se expanda a 4.5PB como 42.zip. ¿Qué tamaño debe tener el archivo? Con una búsqueda binaria, encontramos que el tamaño mínimo de dicho archivo es de 46 MB.

  • zbxl.zip 46 MB → 4,5 PB (Zip64, menos compatible)
zipbomb --mode=quoted_overlap --num-files=190023 --compressed-size=22982788 --zip64 > zbxl.zip
4,5 petabytes: el Event Horizon Telescope registró aproximadamente la misma cantidad de datos para la primera imagen de un agujero negro: bastidores y bastidores con discos duros en el centro de datos.

Con Zip64, ya no es interesante considerar la relación de compresión máxima, porque podemos seguir aumentando el tamaño del archivo zip y la relación de compresión junto con él, hasta que incluso el archivo zip comprimido se vuelva prohibitivamente grande. Sin embargo, un umbral interesante es 264 bytes (18 EB o 16 EiB), esa cantidad de datos no cabrá en la mayoría de los sistemas de archivos. Una búsqueda binaria encuentra la bomba zip más pequeña que produce al menos esa cantidad de salida: contiene 12 millones de archivos y un núcleo comprimido de 1,5 GB. El tamaño total del archivo zip es de 2,9 GB y se descomprime en 264+11727895877 bytes con una relación de compresión de más de 6200 millones a uno. No publiqué este archivo para descargarlo, pero puedes generarlo tú mismo usando . Tiene archivos de tal tamaño que incluso se reveló un error en Info-ZIP UnZip 6.0.

Zipbomb --mode=quoted_overlap --num-files=12056313 --compressed-size=1482284040 --zip64 > zbxxl.zip

Extensión: bzip2

DEFLATE es el algoritmo de compresión más común para el formato zip, pero es solo una de muchas opciones. Probablemente el segundo algoritmo más común es bzip2. Aunque no es tan compatible como DEFLATE. En teoría, bzip2 tiene una relación de compresión máxima de alrededor de 1,4 millones a uno, lo que permite que el núcleo se empaquete más.

Bzip2 primero codifica una codificación de longitud de ejecución, reduciendo la longitud de una cadena de bytes repetidos por un factor de 51. Luego, los datos se dividen en bloques de 900 KB y cada bloque se comprime por separado. Teóricamente, un bloque se puede comprimir a 32 bytes. 900.000 × 51 / 32 = 1.434.375.

Dejando de lado las pérdidas de compatibilidad, ¿bzip2 permite una bomba más eficiente?

Sí, pero solo para archivos pequeños. El problema es que bzip2 no tiene nada parecido a los bloques DEFLATE sin comprimir que usamos para citar encabezados de archivos locales. Por lo tanto, no es posible superponer archivos y reutilizar el núcleo: cada archivo tiene que escribir su propia copia, por lo que la relación de compresión general no será mejor que la relación de cualquier archivo individual. En el gráfico a continuación, podemos ver que, sin superposición, bzip2 supera a DEFLATE solo para archivos de alrededor de un megabyte de tamaño.

La única esperanza que queda es un medio alternativo para citar encabezados bzip2, que se analiza en la siguiente sección. Además, si sabe que un analizador zip en particular es compatible con bzip2 Y permite discrepancias en el nombre de archivo, puede usar una construcción de anulación completa que no necesita ser citada.

Comparación de la relación de compresión de diferentes bombas zip. Observe los ejes logarítmicos. Cada construcción se muestra con y sin Zip64. Las estructuras sin superposición tienen una tasa de crecimiento lineal, que se puede ver a partir de la relación constante de los ejes. El desplazamiento vertical del gráfico bzip2 significa que la relación de compresión de bzip2 es unas mil veces mayor que la de DEFLATE. Las construcciones DEFLATE citadas tienen una tasa de crecimiento cuadrática, como lo demuestra un sesgo de 2:1. La variante Zip64 es un poco menos eficiente, pero permite más de 281 TB. Gráficos para bzip2 con comillas a través de un cambio de campo adicional de cuadrático a lineal cuando se alcanza el tamaño máximo de archivo (2 32 −2 bytes) o el número máximo permitido de archivos

Extensión: cotización a través de un campo adicional

Hasta ahora hemos estado usando la función DEFLATE para citar encabezados de archivos locales y acabamos de ver que este truco no funciona en bzip2. Sin embargo, existe una forma alternativa de cotizar, algo más limitada, que utiliza únicamente las funciones del formato zip y no depende del algoritmo de compresión.

Al final de la estructura del encabezado del archivo local hay campo adicional longitud variable para almacenar información que no cabe en los campos de encabezado normales (APPNOTE.TXT, sección 4.3.7). La información adicional puede incluir, por ejemplo, una marca de tiempo o uid/gid de Unix. La información de Zip64 también se almacena en un campo adicional. El campo adicional se representa como una estructura de valor de longitud; si aumenta la longitud sin agregar un valor, el campo adicional incluirá lo que hay detrás en el archivo zip, es decir, el siguiente encabezado del archivo local. Con este método, cada encabezado de archivo local puede "citar" los siguientes encabezados envolviéndolos en su propio campo opcional. En comparación con DEFLATE, aquí hay tres ventajas:

  1. Citar a través de un campo adicional solo requiere 4 bytes en lugar de 5, lo que deja más espacio para el kernel.
  2. No aumenta el tamaño de los archivos, lo que significa un kernel más grande, dadas las limitaciones del formato zip.
  3. Proporciona cotización bzip2.
A pesar de estas ventajas, cotizar a través de campos adicionales es menos flexible. Esto no es una cadena, como en DEFLATE: cada encabezado de archivo local debe contener no solo el encabezado inmediatamente siguiente, sino también Todo encabezamientos posteriores. Los campos adicionales aumentan a medida que se acerca al comienzo del archivo zip. Debido a que la longitud máxima del campo 2 es de 16 −1 bytes, solo puede citar hasta 1808 encabezados de archivos locales (o 1170 en Zip64) asumiendo nombres (en el caso de DEFLATE, puede usar un campo adicional para citar el primero (el más corto) encabezados de archivos locales y luego cambie a citar DEFLATE para el resto). Otro problema es que para que coincida con la estructura de datos internos del campo adicional, se debe seleccionar una etiqueta de 16 bits para el tipo (APPNOTE.TXT, Sección 4.5.2) antes de los datos de la cita. Queremos elegir una etiqueta de tipo que haga que los analizadores ignoren los datos citados en lugar de intentar interpretarlos como metadatos significativos. Los analizadores Zip deben ignorar las etiquetas de tipo desconocido, por lo que podemos elegir etiquetas al azar, pero existe el riesgo de que alguna etiqueta rompa la compatibilidad del diseño en el futuro.

El diagrama anterior ilustra la posibilidad de usar campos adicionales en bzip2, con y sin Zip64. Ambos gráficos tienen un punto de quiebre donde el crecimiento pasa de cuadrático a lineal. Sin Zip64, esto sucede cuando se alcanza el tamaño máximo de archivo sin comprimir (2 32 −2 bytes); entonces solo se puede aumentar la cantidad de archivos, no su tamaño. El gráfico finaliza por completo cuando el número de archivos llega a 1809, momento en el que nos quedamos sin espacio en el campo adicional para citar títulos adicionales. Con Zip64, la ruptura ocurre en 1171 archivos, después de lo cual solo se puede aumentar el tamaño de los archivos, no la cantidad de archivos. El campo adicional también ayuda con DEFLATE, pero la diferencia es tan pequeña que no se nota visualmente. Aumenta la relación de compresión de zbsm.zip en un 1,2 %; zblg.zip en un 0,019 %; y zbxl.zip en un 0,0025 %.

Discusión

En su trabajo sobre este tema, Pletz y sus colegas utilizan la superposición de archivos para crear un archivo zip casi autorreplicante. La superposición de archivos fue sugerida anteriormente (diapositiva 47) por Ginvael Coldwind.

Diseñamos la bomba zip superpuesta de citas teniendo en cuenta la compatibilidad, una serie de diferencias de implementación, algunas de las cuales se muestran en la tabla a continuación. La construcción resultante es compatible con los analizadores zip, que funcionan de la forma habitual, es decir, comprobando primero el directorio central y usándolo como índice de archivos. Entre ellos se encuentra el exclusivo analizador zip de Nail, que se genera automáticamente a partir de una gramática formal. Sin embargo, el diseño es incompatible con los analizadores de "flujo", que analizan un archivo zip de un extremo a otro en una sola pasada sin leer primero el directorio central. Por su naturaleza, los analizadores de secuencias no permiten la superposición de archivos de ningún tipo. Lo más probable es que solo extraigan el primer archivo. Además, pueden incluso arrojar un error, como es el caso de

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

Primero, el artículo de Wikipedia actualmente dice 5 capas de 16 archivos. No estoy seguro de dónde está ocurriendo la inconsistencia, pero eso no es todo lo relevante. La verdadera pregunta es por qué usar la anidación en primer lugar.

DEFLATE, el único método de compresión admitido para archivos zip*, tiene una tasa de compresión máxima de 1032. Esto se puede lograr asintóticamente para cualquier secuencia repetitiva de 1 a 3 bytes. No importa lo que haga con el archivo zip, siempre que solo se use con DEFLATE, el tamaño del archivo descomprimido no será más de 1032 veces el tamaño del archivo zip original.

Por lo tanto, se deben usar archivos zip anidados para lograr proporciones de compresión verdaderamente escandalosas. Si tiene 2 capas de compresión, la relación máxima es 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 tamaño real de 42.zip está lejos de este nivel. Parte de eso es la sobrecarga del formato zip, y parte es que simplemente no les importa.

Si tuviera que adivinar, diría que 42.zip se formó creando un gran archivo vacío y copiándolo y copiándolo muchas veces. No hay forma de empujar los límites de formato o maximizar la compresión ni nada, simplemente eligieron aleatoriamente 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áximas mucho, mucho más altas. Sin embargo, la mayoría de los analizadores zip no los aceptan.

PD Es posible crear un archivo zip que desempaquetará una copia de sí mismo (quine). También puede hacer uno que descomprima varias copias. Entonces, si descomprime recursivamente un archivo para siempre, el tamaño máximo posible es infinito. La única limitación es que solo puede aumentar en 1032 en cada iteración.

P.P.D. El valor 1032 asume que los datos del archivo en el zip no se superponen. Una característica del formato de archivo zip es que tiene un directorio central que enumera los archivos en el archivo y las compensaciones de datos del archivo. Si crea varias entradas en archivos 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.

decirles a los amigos