Автоматическая загрузка и распаковка архива (zip, rar, targz, tarbz) - проблема с безопасностью?

Я хочу создать для своего веб-приложения следующие функции:

  1. пользователь загружает архивный файл (zip / rar / tar.gz / tar.bz и т. д.) (содержимое - несколько файлов изображений)
  2. архив автоматически распаковывается после загрузки
  3. изображения отображаются в списке HTML (что угодно)

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


person gorsky    schedule 14.12.2009    source источник


Ответы (2)


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

Кроме того, если вы не будете достаточно осторожны, клиент может передать zip-файл с исполняемым содержимым на стороне сервера (.php, .asp, .aspx, ...) внутри и запросить файл через HTTP, что при неправильной настройке может привести к выполнение произвольного кода на сервере.

person mmx    schedule 14.12.2009
comment
Ого, эта зип-бомба выглядит ужасно;) (en.wikipedia.org/wiki/Zip_bomb ). Нет ли проблем с другими форматами архивов / алгоритмами извлечения? - person gorsky; 15.12.2009
comment
Сама цель алгоритма сжатия состоит в том, чтобы сжать материал настолько хорошо, насколько это возможно, чтобы это не считалось недостатком алгоритма. Сущность, распаковывающая файл, должна выполнить некоторые проверки корректности размера и предотвратить распаковку подозрительных файлов. - person mmx; 15.12.2009
comment
С zip-файлом вы не можете точно определить, какой размер у вас будет, до тех пор, пока вы не распаковываете его. - person Tom Hawtin - tackline; 15.12.2009

В дополнение к ответу Медрдада: размещение пользовательского контента немного сложно. Если вы размещаете zip-файл, то его можно использовать для хранения файлов классов Java (также используемых для других форматов), и, следовательно, «политика одного и того же происхождения» может быть нарушена. (Была атака GIFAR, когда zip был прикреплен к концу другого файла, но это больше не работает с Java PlugIn / WebStart.) Файлы изображений должны быть по крайней мере проверены, что они на самом деле являются файлами изображений. Очевидно, существует проблема с веб-браузерами, имеющими уязвимости переполнения буфера, и теперь ваш сайт может быть использован для атаки ваших посетителей (это может сделать вас непопулярными). Вы можете найти программное обеспечение на стороне клиента, использующее, скажем, регулярные выражения для передачи данных, поэтому данные в середине файла изображения могут быть выполнены. Zip-файлы могут иметь непристойные имена (например, обход каталога с ../ и странными символами).

Что делать (не обязательно исчерпывающий список):

  • Размещайте файлы, предоставленные пользователем, в совершенно другом домене.
  • Домен с пользовательскими файлами должен использовать разные IP-адреса.
  • Если возможно, декодируйте и перекодируйте данные.
  • Есть еще один вопрос о переполнении стека для zip-бомб - я предлагаю распаковать с помощью ZipInputStream и останавливаться, если он становится слишком большим.
  • Там, где собственный код касается пользовательских данных, делайте это в chroot-тюрьме.
  • Белый список символов или полностью заменить имена файлов.
  • Потенциально вы можете использовать IDS некоторого описания для сканирования подозрительных данных (я действительно не знаю, сколько это делается - убедитесь, что ваша IDS не написана на C!).
person Tom Hawtin - tackline    schedule 14.12.2009