Как сделать Zip-бомбу?

131

Этот вопрос о zip-бомбах естественным образом привел меня на страницу Википедии соответствующей теме . В статье упоминается пример zip-файла размером 45,1 КБ, который распаковывается до 1,3 эксабайта.

Какие принципы / методы будут использованы в первую очередь для создания такого файла? На самом деле я не хочу этого делать, меня больше интересует упрощенное объяснение задействованных концепций "как все работает".

п.с.

В статье упоминается 9 слоев zip-файлов, так что это непростой случай заархивирования кучи нулей. Почему 9, почему по 10 файлов в каждом?

рыба фугу
источник
5
@Michael, ваша жалоба недействительна. OP не только спрашивал, как это работает, но и ничто в опубликованной статье не говорит, что это сделано специально для отключения антивируса. Напротив, похоже, что суть статьи - это атака в стиле DOS с лишь мимолетным упоминанием об отключении антивируса.
Сан-Хасинто,
2
Дело в том, что OP имел в виду определенный файл, который состоит из вложенных архивов, а не один огромный сжатый файл.
Майкл Боргвардт,
1
Я думаю, что Майкл прав, он объясняет, как создать файл, описанный в «PS», а все остальные этого не делают. Однако «PS» был добавлен как отредактированный, поэтому эти ответы не могли быть явно неправильными в то время, когда они были даны. Они просто подумали, что «такой файл» означал «любой файл, который распаковывается до 1,3 эксабайта», когда оказалось, что это означало «файл со структурой, подобной той, что описана в статье, на которую я ссылаюсь».
Стив Джессоп,
1
@onebyone Полностью согласен. Я просто не думаю, что отрицательный голос уместен в таких обстоятельствах.
Сан-Хасинто,
4
Я предполагаю, что это зависит от того, считаете ли вы, что голос против означает «это не лучший ответ на вопрос», или «вы дурак и недостоин жить», или промежуточное положение. Лично я принимаю отрицательный голос, чтобы означать, что я должен перечитать свой ответ и посмотреть, есть ли в нем что-то явно не так, что я должен исправить. Но теперь я довольно счастлив, что не согласен с моим ответом и не изменил его, если считаю, что мой ответ что-то дает. И я в любом случае стал довольно безразличным ко всему процессу голосования, теперь, когда ясно, что я никогда не поймаю Джона Скита ;-)
Стив Джессоп

Ответы:

92

Цитата со страницы Википедии:

Одним из примеров Zip-бомбы является файл 45.1.zip, который содержал 45,1 килобайт сжатых данных, содержащий девять слоев вложенных zip-файлов в наборах по 10, каждый архив нижнего уровня содержал файл 1,30 ГБ, что в общей сложности составляло 1,30 эксабайта несжатых данных. ,

Итак, все, что вам нужно, это один файл размером 1,3 ГБ, полный нулей, сжать его в ZIP-файл, сделать 10 копий, упаковать их в ZIP-файл и повторить этот процесс 9 раз.

Таким образом, вы получаете файл, который после полного распаковки производит абсурдное количество данных, не требуя начинать с этого количества.

Кроме того, вложенные архивы значительно усложняют работу программ, таких как антивирусные сканеры (основная цель этих "бомб"), и отказываются распаковывать "слишком большие" архивы, потому что до последнего уровня общий объем данных не так уж и много, вы не «видите», насколько велики файлы на самом низком уровне, пока не достигнете этого уровня, и каждый отдельный файл не будет «слишком большим» - проблематично только огромное количество.

Майкл Боргвардт
источник
2
Не может быть ... как только вы заархивируете файл с нулями внизу, полученный заархивированный файл не будет почти таким же сжимаемым для следующего слоя.
pufferfish
16
Ах, но на каждом уровне у вас есть десять одинаковых файлов, которые снова хорошо сжимаются. Хотя ZIP не использует межфайловую избыточность, архив, содержащий десять по отдельности сжатых идентичных файлов, вероятно, сам по себе имеет большую избыточность для использования на следующем уровне.
Майкл Боргвардт,
10
Дело НЕ в том, как сгенерировать максимальный объем данных из минимально возможного файла - дело в том, чтобы победить попытки антивирусных сканеров защититься от слишком больших архивов.
Майкл Боргвардт,
2
Не в этом суть статьи в Википедии. Это похоже на атаку в стиле DOS.
Сан-Хасинто,
2
Но файлы не извлекаются рекурсивно ... жертва должна продолжать извлекать файлы sub zip, чтобы они работали ... Любые обходные пути.
Manoj,
46

Создайте файл нулей размером 1,3 эксабайта.

Щелкните правой кнопкой мыши> Отправить в сжатую (заархивированную) папку.

wefwfwefwe
источник
22
Вы забыли сарказм «смайлик».
tvanfosson,
1
Скорее всего, это было бы невозможно с большинством файловых систем и алгоритмов сжатия из-за ограничений на размер файла. Однако вложение файлов в сжатый архив (и размещение большего количества вложенных архивов в архиве, если алгоритм сжатия имеет ограничение на общий размер) позволяет обойти эти ограничения.
Blixt,
133
должен создать файл размером 1,3 эксабайта из единиц. Они намного тоньше, чем 0 :)
Куинн Уилсон,
33
@quinn - вот почему сжатие (
изначально
1
Это дает вам zip-файл размером> 1 ГБ, если я не ошибаюсь
Крис С.
36

В Linux это легко сделать с помощью следующей команды:

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

Замените count на количество КБ, которое вы хотите сжать. В приведенном выше примере создается zip-бомба размером 10 МБ (совсем не бомба, но он показывает процесс).

Вам НЕ нужно место на жестком диске для хранения всех несжатых данных.

Thomi
источник
8
Но вам нужны вычислительные мощности для сжатия несжатых данных, это по-прежнему O (n) в размере несжатых данных.
tonfa
2
Да, как и все остальные ответы здесь.
Thomi
6
Ответ Майкла Боргвардта - O (log N) размера несжатых данных.
Стив Джессоп,
1
Во всяком случае, примерно. Каждое повторение процесса «вырезать заголовки архива, дублировать запись сжатого файла 10 раз, заменить заголовки архива, сжать» увеличивает уровень вложенности zip на 1, занимает время, пропорциональное размеру сжатых данных из предыдущего шага. , умножает размер несжатых данных на 10, и, если он вообще увеличивает размер сжатых данных, конечно же, не делает этого ни на что похожее на линейный коэффициент.
Стив Джессоп,
3
Так что просто в качестве теста я заархивировал -9 1,3 ГБ нулей. В результате получился файл размером 1,3 МБ. Я продублировал это 10 раз (я не беспокоился о том, чтобы возиться с zip-заголовками, поэтому результат не будет работать как zip-бомба, но иллюстрирует принцип), чтобы получить файл размером 13M, который сжимается с zip -9 до 34381 байта. Таким образом, шаг дублирования фактически уменьшает размер файла, потому что deflate поддерживает только токены определенного максимального размера. Следующий шаг - 18453, затем 19012, 19312, 19743, 20120, 20531, 20870.
Стив Джессоп,
10

Ниже для Windows:

Из доказательства концепции Security Focus (NSFW!), Это ZIP-файл с 16 папками, по 16 папок в каждой, что выглядит следующим образом (42 - это имя zip-файла):

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

Я, вероятно, ошибаюсь с этой цифрой, но она дает 4 ^ 16 (4294967296) каталогов. Поскольку каждому каталогу требуется место в N байтов, он оказывается огромным. Файл dll в конце имеет размер 0 байт.

При распаковке только первого каталога \42\lib 0\book 0\chapter 0\doc 0\0.dllвыделяется 4 ГБ дискового пространства.

Крис С
источник
27
Я просто предположил, что это обнаженные дамы, которые проводят исследования безопасности.
Джеймс МакМахон,
3
Почтовый индекс был nsfw. Сработает большая тревога паники, и клетка упадет с потолка вокруг вашего стола
Крис С.
4
Если каждое попадание в вирусный файл приводит к собеседованию с HR, то вам либо не нужен сканер вирусов, либо вам не нужен отдел кадров. Один из них не способствует бизнесу ;-)
Стив Джессоп
2
Также может быть NSFW, потому что сетевой сканер вирусов может захотеть его проверить и извлечь для этого.
Майкл Штум
5
Сканер вирусов должен просто пометить его как подозрительный (что может привести к его безопасной блокировке или может привести к тому, что о вас будут сообщать небезопасно за попытку установки вирусов). Если бомба действительно взорвется, ваш ИТ-отдел узнал нечто ценное - им нужен лучший антивирусный сканер.
Стив Джессоп,
8

Серьезный ответ:

(Очень в основном) Сжатие основано на обнаружении повторяющихся шаблонов, поэтому zip-файл будет содержать данные, представляющие что-то вроде

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

Очень короткий zip-файл, но огромный при его расширении.

wefwfwefwe
источник
1
На самом деле, это можно было бы сжать еще больше: 0x1 (0x35) (то есть второй 0 повторяется 35 раз, поэтому он будет расширен до вашего комментария)
Майкл
5

Чтобы создать его в практических условиях (то есть без создания файла размером 1,3 эксабайта на вашем огромном жестком диске), вам, вероятно, придется изучить формат файла на двоичном уровне и написать что-то, что переводит на то, как будет выглядеть ваш желаемый файл, после сжатия.

Andy_Vulhop
источник
5

В статье упоминается 9 слоев zip-файлов, так что это непростой случай заархивирования кучи нулей. Почему 9, почему по 10 файлов в каждом?

Во-первых, в статье Википедии сейчас говорится о 5 слоях по 16 файлов в каждом. Не уверен, откуда взялось несоответствие, но это не так уж важно. Настоящий вопрос в том, зачем вообще использовать вложение.

DEFLATE, единственный широко поддерживаемый метод сжатия для zip-файлов *, имеет максимальный коэффициент сжатия 1032. Этого можно достичь асимптотически для любой повторяющейся последовательности размером 1-3 байта. Независимо от того, что вы делаете с zip-файлом, если он использует только DEFLATE, распакованный размер будет не более чем в 1032 раз больше размера исходного zip-файла.

Следовательно, необходимо использовать вложенные zip-файлы для достижения действительно невероятных степеней сжатия. Если у вас 2 уровня сжатия, максимальное соотношение станет 1032 ^ 2 = 1065024. Для 3 это 1099104768 и так далее. Для 5 слоев, используемых в 42.zip, теоретическая максимальная степень сжатия составляет 1170572956434432. Как видите, фактический 42.zip далек от этого уровня. Частично это накладные расходы на формат zip, а частично - то, что им было все равно.

Если бы мне пришлось угадывать, я бы сказал, что 42.zip был сформирован путем простого создания большого пустого файла и его многократного архивирования и копирования. Нет никаких попыток раздвинуть границы формата или максимизировать сжатие или что-то еще - они просто произвольно выбрали 16 копий на слой. Суть заключалась в том, чтобы без особых усилий создать большую полезную нагрузку.

Примечание. Другие форматы сжатия, такие как bzip2, предлагают гораздо большие максимальные степени сжатия. Однако большинство парсеров zip их не принимают.

PS Можно создать zip-файл, который будет распаковываться в свою копию (квайн). Вы также можете сделать тот, который распаковывается на несколько своих копий. Следовательно, если вы рекурсивно разархивируете файл навсегда, максимально возможный размер будет бесконечным. Единственное ограничение - он может увеличиваться максимум на 1032 на каждой итерации.

PPS Рисунок 1032 предполагает, что данные файла в zip-архиве не пересекаются. Одна из особенностей формата zip-файла заключается в том, что он имеет центральный каталог, в котором перечислены файлы в архиве и смещены данные файла. Если вы создаете несколько файловых записей, указывающих на одни и те же данные, вы можете добиться гораздо более высоких степеней сжатия даже без вложенности, но такой zip-файл, вероятно, будет отклонен синтаксическими анализаторами.

сурьма
источник
4

Хороший способ создать zipbomb (или gzbomb) - это знать двоичный формат, на который вы нацеливаетесь. В противном случае, даже если вы используете потоковый файл (например, используя/dev/zero ), вы все равно будете ограничены вычислительной мощностью, необходимой для сжатия потока.

Хороший пример gzip-бомбы: http://selenic.com/googolplex.gz57 (в файл встроено сообщение после нескольких уровней сжатия, приводящих к огромным файлам)

Удачи найти это сообщение :)

тонфа
источник
2

Возможно, в unix вы могли бы передать определенное количество нулей прямо в zip-программу или что-то в этом роде? Не знаю достаточно о unix, чтобы объяснить, как бы вы это сделали. Помимо этого, вам понадобится источник нулей и вставьте их в застежку-молнию, которая читает из стандартного ввода или чего-то еще ...

Svish
источник
Проголосовали против за игнорирование фактического вопроса, в котором упоминается конкретный файл, который явно не является результатом сжатия одного большого потока нулей.
Майкл Боргвардт,
Нет, вы все равно будете ограничены вычислительной мощностью. В идеале вы не хотите запускать gzip / zip, поскольку он будет использовать много ЦП (или, по крайней мере, O (n) n - это размер распакованного файла)
tonfa
@tonfa: Ну, конечно, вы будете ограничены вычислительной мощностью. Я полагал, что вы, возможно, не захотите создавать на своем диске большой файл эксабайта, а затем заархивировать его ...
Свиш
2

Все алгоритмы сжатия файлов полагаются на энтропию сжимаемой информации. Теоретически вы можете сжать поток нулей или единиц, и если он достаточно длинный, он сжимается очень хорошо.

Это часть теории. Практическая часть уже отмечена другими.

Calyth
источник
2

Недавние (после 1995 года) алгоритмы сжатия, такие как bz2, lzma (7-zip) и rar, дают впечатляющее сжатие монотонных файлов, и одного уровня сжатия достаточно, чтобы обернуть негабаритный контент до управляемого размера.

Другой подход может заключаться в создании разреженного файла экстремального размера (эксабайт), а затем его сжатие с помощью чего-то обыденного, которое понимает разреженные файлы (например, tar), теперь, если экзаменатор передает файл в потоковом режиме, экзаменатору необходимо будет прочитать все те нули, которые существуют. только для вставки между фактическим содержимым файла, если проверяющий записывает его на диск, однако будет использовано очень мало места (при условии хорошо работающего разархиватора и современной файловой системы).

user340140
источник
2

Попробовал это. Размер выходного zip-файла был небольшим файлом размером 84 КБ.

Шаги, которые я сделал до сих пор:

  1. создайте файл .txt размером 1,4 ГБ, полный "0"
  2. сжать его.
  3. переименуйте .zip в .txt, затем сделайте 16 копий
  4. сжать все это в файл .zip,
  5. переименуйте переименованные файлы .txt внутри файла .zip в .zip снова
  6. повторите шаги с 3 по 5 восемь раз.
  7. Наслаждаться :)

хотя я не знаю, как объяснить ту часть, где сжатие переименованного zip-файла по-прежнему сжимает его до меньшего размера, но это работает. Может, мне просто не хватает технических терминов.

jaycroll
источник
Кстати, не бойтесь, что он будет постоянно извлекать все zip-файлы внутри себя. Он извлекает только zip-файл, который находится под ним, а не до конца.
jaycroll
2

Силиконовая долина Сезон 3 Эпизод 7 привел меня сюда. Шаги для создания zip-бомбы будут.

  1. Создайте фиктивный файл с нулями (или единицами, если вы считаете их тонкими) размером (скажем, 1 ГБ).
  2. Сжать этот файл, скажем, в zip-файл 1.zip.
  3. Сделайте n(скажем, 10) копий этого файла и добавьте эти 10 файлов в сжатый архив (скажем 2.zip).
  4. Повторите шаг 3 kнесколько раз.
  5. Вы получите бомбу на молнии.

Для реализации Python проверьте это .

Абдул Фатир
источник
1

Я не знаю, использует ли ZIP кодировку длины прогона, но если бы она использовалась, такой сжатый файл содержал бы небольшой фрагмент данных и очень большое значение длины серии. Значение длины серии должно указывать, сколько раз повторяется небольшой фрагмент данных. Когда у вас очень большое значение, результирующие данные будут пропорционально большими.

Джо
источник
2
ZIP использует сжатие Lempel-Ziv-Welch (или модифицированную версию), которое эффективно токенизирует данные. Длинные серии «наборов» байтов приведут к хорошему сжатию, поэтому GIF (который также использует LZW) хорош для графики, а JPEG (который использует сложное сжатие синусоидальной волны) лучше для фотографий, где данные намного более случайны ».
Lazarus,