Como se faz uma bomba Zip?

131

Naturalmente, essa pergunta sobre bombas zip me levou à página da Wikipedia sobre o assunto. O artigo menciona um exemplo de um arquivo zip de 45,1 kb que descompacta para 1,3 exabytes.

Quais são os princípios / técnicas que seriam usados ​​para criar esse arquivo em primeiro lugar? Na verdade, não quero fazer isso, mais interessado em uma explicação simplificada do tipo "como funciona as coisas" dos conceitos envolvidos.

ps

O artigo menciona 9 camadas de arquivos zip, portanto, não é um caso simples de compactar zeros. Por que 9, por que 10 arquivos em cada um?

baiacu
fonte
5
@ Michael, sua reclamação não é válida. O OP não apenas perguntou como funciona, nada no artigo publicado diz que é para o propósito expresso de desativar o antivírus. Pelo contrário, parece que o objetivo do artigo é um ataque no estilo DOS com apenas uma menção passageira à desativação do antivírus.
San Jacinto
2
O ponto é que o OP estava se referindo a um arquivo específico, que consiste em arquivos aninhados, não em um arquivo compactado enorme.
Michael Borgwardt
1
Acho que Michael está certo, ele explica como criar o arquivo descrito no "PS", e todo mundo não. No entanto, o "PS" foi adicionado como uma edição; portanto, essas respostas podem não estar descaradamente erradas no momento em que foram dadas. Eles achavam que "esse arquivo" significava "qualquer arquivo que fosse descompactado para 1,3 exabytes", quando, na verdade, ele pretendia significar "um arquivo estruturado como o descrito no artigo ao qual vinculo".
21609 Steve Jessop
1
@onebyone Eu concordo completamente. Eu simplesmente não acho que um voto negativo seja apropriado nessas circunstâncias.
San Jacinto
4
Eu acho que depende se você considera um voto negativo como "essa não é a melhor resposta para a pergunta" ou "você é um tolo e não é digno de viver" ou o paradeiro entre eles. Pessoalmente, tomo um voto negativo para dizer que devo reler minha resposta e ver se há algo obviamente errado com isso que eu deveria corrigir. Mas então, agora estou bastante feliz por não concordar e não mudar minha resposta, se acho que minha resposta contribui com algo. E eu me tornei bastante despreocupado com todo o processo de votação de qualquer maneira, agora que é claro que eu nunca vou pegar Jon Skeet ;-)
Steve Jessop

Respostas:

92

Citação da página da Wikipedia:

Um exemplo de bomba Zip é o arquivo 45.1.zip, que contém 45.1 kilobytes de dados compactados, contendo nove camadas de arquivos zip aninhados em conjuntos de 10, cada arquivo da camada inferior contendo um arquivo de 1,30 gigabyte para um total de 1,30 exabyte de dados não compactados .

Então, tudo o que você precisa é de um único arquivo de 1,3 GB cheio de zeros, compactá-lo em um arquivo ZIP, fazer 10 cópias, compactá-las em um arquivo ZIP e repetir esse processo 9 vezes.

Dessa forma, você obtém um arquivo que, quando descompactado completamente, produz uma quantidade absurda de dados sem exigir que você comece com essa quantidade.

Além disso, os arquivos aninhados tornam muito mais difícil programas como antivírus (o principal alvo dessas "bombas") serem inteligentes e se recusam a descompactar arquivos "muito grandes", porque até o último nível a quantidade total de dados é nem tanto, você não "vê" o tamanho dos arquivos no nível mais baixo até atingir esse nível e cada arquivo individual não é "muito grande" - apenas o grande número é problemático.

Michael Borgwardt
fonte
2
Não pode ser ... depois de compactar o arquivo de zeros na parte inferior, o arquivo compactado resultante não será tão compressível para a próxima camada.
Pufferfish
16
Ah, mas em cada nível, você tem dez arquivos idênticos - o que novamente comprime muito bem. Embora o ZIP não explore a redundância entre arquivos, um arquivo contendo dez arquivos idênticos compactados individualmente provavelmente possui muita redundância para a próxima camada explorar.
Michael Borgwardt
10
O ponto NÃO é como gerar a quantidade máxima de dados a partir do menor arquivo possível - o ponto é derrotar as tentativas dos antivírus de se proteger contra arquivos muito grandes.
Michael Borgwardt
2
Esse não é o objetivo do artigo na wikipedia. Parece empurrar um ataque no estilo DOS.
San Jacinto
2
Mas os arquivos não são extraídos recursivamente ... a vítima deve continuar extraindo os arquivos subzip para fazê-lo funcionar ... Qualquer solução para isso.
Manoj
46

Crie um arquivo de 1,3 exabyte de zeros.

Clique com o botão direito do mouse em> Enviar para a pasta compactada (zipada).

wefwfwefwe
fonte
22
Você esqueceu o sarcasmo "smiley".
tvanfosson 22/09/09
1
Isso provavelmente seria impossível na maioria dos sistemas de arquivos e algoritmos de compactação devido a limites de tamanho de arquivo. No entanto, aninhar arquivos no arquivo compactado (e colocar mais arquivos aninhados no arquivo, se o algoritmo de compactação tiver uma limitação de tamanho total) permite ignorar esses limites.
Blixt 22/09/09
133
deve criar um arquivo de 1,3 exabyte de 1's. Eles são muito mais magro do que 0 de :)
Quinn Wilson
33
@quinn - é por isso comprimindo os (Initally mais gordo) zeros é muito mais eficaz
wefwfwefwe
1
Isto dá-lhe a> arquivo zip 1GB se não me engano
Chris S
36

Isso é feito facilmente no Linux, usando o seguinte comando:

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

Substitua count pelo número de KB que você deseja compactar. O exemplo acima cria uma bomba zip de 10MiB (quase nenhuma bomba, mas mostra o processo).

Você NÃO precisa de espaço no disco rígido para armazenar todos os dados não compactados.

Thomi
fonte
8
Mas você precisa da capacidade de computação para compactar os dados não compactados, mas ainda é O (n) no tamanho dos dados não compactados .
tonfa
2
Sim, assim como todas as outras respostas aqui.
Thomi 22/09/09
6
A resposta de Michael Borgwardt é O (log N) no tamanho dos dados não compactados.
Steve Jessop
1
Aproximadamente, pelo menos. Cada repetição do processo "retira os cabeçalhos do arquivo morto, duplica a entrada do arquivo compactado 10 vezes, substitui os cabeçalhos do arquivo morto, comprime" aumenta o nível de aninhamento de zip em 1, leva um tempo proporcional ao tamanho dos dados compactados da etapa anterior , multiplica o tamanho dos dados não compactados por 10 e, se aumentar o tamanho dos dados compactados, certamente não o fará por um fator linear.
21609 Steve Jessop
3
Então, como teste, eu fecho -9 1,3 GB de zeros. O resultado é um arquivo de 1.3M. Dupliquei isso 10 vezes (não poderia ser incomodado mexer com os cabeçalhos zip, para que o resultado não funcione como uma bomba zip, mas ilustra o princípio) para fornecer um arquivo 13M, que compacta com zip -9 a 34381 bytes. Portanto, a etapa de duplicação na verdade torna o arquivo menor, porque o deflate suporta apenas tokens de um determinado tamanho máximo. O passo seguinte resultado em 18453, em seguida, 19012, 19312, 19743, 20120, 20531, 20870.
Steve Jessop
10

Abaixo é para Windows:

Na prova de conceito do Security Focus (NSFW!), É um arquivo ZIP com 16 pastas, cada uma com 16 pastas, que continua assim (42 é o nome do arquivo zip):

\ 42 \ lib 0 \ livro 0 \ capítulo 0 \ doc 0 \ 0.dll
...
\ 42 \ lib F \ livro F \ capítulo F \ doc F \ 0.dll

Provavelmente estou errado com esta figura, mas ela produz 4 ^ 16 (4.294.967.296) diretórios. Como cada diretório precisa de um espaço de alocação de N bytes, ele acaba sendo enorme. O arquivo DLL no final é 0 bytes.

Descompactar o primeiro diretório sozinho \42\lib 0\book 0\chapter 0\doc 0\0.dllresulta em 4 GB de espaço de alocação.

Chris S
fonte
27
Eu apenas presumi que eram mulheres nuas fazendo pesquisa de segurança.
James McMahon
3
O zip era nsfw. Um alarme vermelho grande pânico vai sair e uma gaiola cairá para baixo do teto em torno de sua mesa
Chris S
4
Se cada ocorrência em um arquivo de vírus resultar em uma entrevista com o RH, você não precisará do antivírus ou do seu departamento de RH. Um deles não está contribuindo para o negócio ;-)
Steve Jessop
2
Também pode ser NSFW porque um Scanner de vírus de rede pode querer verificá-lo - e extraí-lo para isso.
Michael Stum
5
O antivírus deve apenas suspeitá-lo (o que pode resultar em um bloqueio seguro ou uma denúncia insegura por tentar instalar vírus). Se a bomba realmente explodir, seu departamento de TI aprendeu algo valioso - eles precisam de um melhor antivírus.
Steve Jessop
8

Resposta séria:

(Basicamente) A compactação depende de detectar padrões de repetição; portanto, o arquivo zip deve conter dados que representam algo como

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

Arquivo zip muito curto, mas enorme quando você o expande.

wefwfwefwe
fonte
1
Isso poderia ser comprimido ainda mais, realmente: 0x1 (0x35) (isto é, o segundo 0 é repetido 35 vezes para que ele iria expandir-se para o seu comentário)
Michael
5

Para criar um em uma configuração prática (ou seja, sem criar um arquivo de 1,3 exabyte no seu disco rígido enorme), você provavelmente precisaria aprender o formato do arquivo em um nível binário e escrever algo que se traduza na aparência do arquivo desejado, pós- compressão.

Andy_Vulhop
fonte
5

O artigo menciona 9 camadas de arquivos zip, portanto, não é um caso simples de compactar zeros. Por que 9, por que 10 arquivos em cada um?

Primeiro, o artigo da Wikipedia diz atualmente 5 camadas com 16 arquivos cada. Não sei de onde vem a discrepância, mas não é tão relevante. A verdadeira questão é por que usar o aninhamento em primeiro lugar.

DEFLATE, o único método de compactação comumente suportado para arquivos zip *, possui uma taxa de compactação máxima de 1032. Isso pode ser alcançado assintoticamente para qualquer sequência repetida de 1 a 3 bytes. Não importa o que você faz com um arquivo zip, desde que esteja usando apenas DEFLATE, o tamanho descompactado será no máximo 1032 vezes o tamanho do arquivo zip original.

Portanto, é necessário usar arquivos zip aninhados para obter taxas de compactação realmente ultrajantes. Se você tiver 2 camadas de compactação, a proporção máxima se tornará 1032 ^ 2 = 1065024. Para 3, é 1099104768 e assim por diante. Para as 5 camadas usadas no 42.zip, a taxa de compressão máxima teórica é 1170572956434432. Como você pode ver, o 42.zip real está longe desse nível. Parte disso é a sobrecarga do formato zip, e parte disso é que eles simplesmente não se importaram.

Se eu tivesse que adivinhar, diria que o 42.zip foi criado apenas criando um arquivo grande e vazio e fechando e copiando repetidamente. Não há nenhuma tentativa de ultrapassar os limites do formato ou maximizar a compactação ou qualquer outra coisa - eles escolheram arbitrariamente 16 cópias por camada. O objetivo era criar uma grande carga útil sem muito esforço.

Nota: Outros formatos de compactação, como o bzip2, oferecem taxas de compactação máximas muito, muito, muito maiores. No entanto, a maioria dos analisadores de zip não os aceita.

PS É possível criar um arquivo zip que será descompactado para uma cópia de si mesmo (um arquivo). Você também pode criar um que descompacte em várias cópias de si mesmo. Portanto, se você descompactar recursivamente um arquivo para sempre, o tamanho máximo possível será infinito. A única limitação é que ele pode aumentar no máximo 1032 em cada iteração.

PPS A figura 1032 pressupõe que os dados do arquivo no zip não sejam comuns. Uma peculiaridade do formato do arquivo zip é que ele possui um diretório central que lista os arquivos no arquivo morto e compensa os dados do arquivo. Se você criar várias entradas de arquivo apontando para os mesmos dados, poderá obter taxas de compactação muito mais altas, mesmo sem aninhamento, mas esse arquivo zip provavelmente será rejeitado pelos analisadores.

Antimônio
fonte
4

Uma boa maneira de criar um zipbomb (ou gzbomb) é conhecer o formato binário que você está alvejando. Caso contrário, mesmo se você usar um arquivo de streaming (por exemplo, usando/dev/zero ), você ainda estará limitado pelo poder de computação necessário para compactar o fluxo.

Um bom exemplo de uma bomba gzip: http://selenic.com/googolplex.gz57 (há uma mensagem incorporada no arquivo após vários níveis de compactação, resultando em arquivos enormes)

Divirta-se encontrando essa mensagem :)

tonfa
fonte
2

Talvez, no unix, você possa canalizar uma certa quantidade de zeros diretamente em um programa zip ou algo assim? Porém, você não conhece o suficiente o unix para explicar como você faria isso. Fora isso, você precisaria de uma fonte de zeros e coloque-os em um zíper que leia stdin ou algo assim ...

Svish
fonte
Votado por desconsiderar a pergunta real, que menciona um arquivo específico que não é explicitamente o resultado de fechar um grande fluxo de zeros.
Michael Borgwardt
Não, você ainda será limitado pelo poder da computação. Idealmente você não deseja executar gzip / zip, uma vez que vai usar um monte de CPU (ou pelo menos O (n) n é o tamanho do arquivo descompactado)
tonfa
@tonfa: Bem, é claro que você será limitado pelo poder da computação. Meu raciocínio era que você não pode querer criar um arquivo grande exabyte em seu disco e, em seguida, zip que ...
Svish
2

Todos os algoritmos de compactação de arquivos contam com o entropia das informações a serem compactadas. Teoricamente, você pode comprimir um fluxo de 0 ou 1 e, se for longo o suficiente, comprimirá muito bem.

Essa é a parte da teoria. A parte prática já foi apontada por outros.

Calyth
fonte
2

Algoritmos de compactação recentes (pós 1995) como bz2, lzma (7-zip) e rar oferecem uma compactação espetacular de arquivos monótonos, e uma única camada de compactação é suficiente para agrupar conteúdo de grandes dimensões em um tamanho gerenciável.

Outra abordagem poderia ser criar um arquivo esparso de tamanho extremo (exabytes) e depois compactá-lo com algo mundano que entenda arquivos esparsos (por exemplo, tar), agora, se o examinador transmitir o arquivo, o examinador precisará ler além de todos os zeros existentes apenas para alternar entre o conteúdo real do arquivo, se o examinador o gravar no disco, no entanto, será usado muito pouco espaço (assumindo um desarquivador bem-comportado e um sistema de arquivos moderno).

user340140
fonte
2

Tentei. o tamanho do arquivo zip de saída era um pequeno arquivo de 84 KB.

Etapas que eu fiz até agora:

  1. crie um arquivo .txt de 1,4 GB cheio de '0'
  2. comprima.
  3. renomeie o .zip para .txt e faça 16 cópias
  4. compactar tudo isso em um arquivo .zip,
  5. renomeie os arquivos .txt renomeados dentro do arquivo .zip para .zip novamente
  6. repita as etapas 3 a 5 oito vezes.
  7. Aproveitar :)

embora eu não saiba como explicar a parte em que a compactação do arquivo zip renomeado ainda o comprime em um tamanho menor, mas funciona. Talvez eu não tenha os termos técnicos.

jaycroll
fonte
A propósito, não tenha medo de que ele extraia continuamente todos os arquivos zip dentro dele. Ele extrai apenas o arquivo zip aninhado abaixo dele, e não todo o caminho até o final.
Jaycroll # 17/12
2

O episódio 7 da temporada 3 do Vale do Silício me trouxe aqui. Os passos para gerar uma bomba zip seriam.

  1. Crie um arquivo fictício com zeros (ou os que você acha que são finos) de tamanho (digamos 1 GB).
  2. Comprima este arquivo em um arquivo zip, digamos 1.zip .
  3. Faça n(digamos 10) cópias desse arquivo e adicione esses 10 arquivos a um arquivo compactado (digamos2.zip ).
  4. Repita a etapa 3 kvárias vezes.
  5. Você receberá uma bomba zip.

Para uma implementação Python, verifique isso .

Abdul Fatir
fonte
1

Não sei se o ZIP usa a codificação de comprimento de execução, mas, se o fizesse, um arquivo compactado conteria um pequeno pedaço de dados e um valor muito grande de comprimento de execução. O valor de duração da execução especificaria quantas vezes o pequeno dado é repetido. Quando você tem um valor muito grande, os dados resultantes são proporcionalmente grandes.

Joe
fonte
2
O ZIP usa a compactação Lempel-Ziv-Welch (ou uma versão modificada) que efetivamente simboliza os dados. Execuções longas de 'conjuntos' de bytes resultarão em boa compactação, por isso o GIF (que também usa LZW) é bom para gráficos e o JPEG (que usa uma compactação complexa de ondas senoidais) é melhor para fotos em que os dados são muito mais aleatórios '
Lázaro