Я хотел бы иметь возможность извлечь файл tar, чтобы все извлеченные файлы были помещены в определенный каталог префиксов. Любая попытка файлов tar выполнить запись во внешние каталоги должна привести к сбою извлечения.
Как вы можете себе представить, это так, что я могу безопасно извлечь недоверенный файл tar.
Как я могу сделать это с GNU tar
?
Я придумал:
tar --exclude='/*' --exclude='*/../*' --exclude='../*' -xvf untrusted_file.tar
но я не уверен, что это достаточно параноидально.
-t
опцию.Ответы:
Вам не нужна паранойя вообще. GNU
tar
- и фактически любая хорошо написаннаяtar
программа, созданная за последние 30 лет или около того -..
по умолчанию откажется извлекать файлы из архива, начинающиеся с косой черты или содержащие элементы.Вы должны приложить все усилия, чтобы заставить современные
tar
программы извлекать такие потенциально вредоносные tar-архивы: и GNU, и BSDtar
должны-P
иметь возможность отключить эту защиту. См. Раздел « Абсолютные имена файлов» в руководстве по GNU tar.Однако
-P
POSIX не указывает этот флаг, поэтому другиеtar
программы могут по-разному справиться с этим. Например, инструменты Шилиstar
программа использует-/
и-..
отключить эти средства защиты.Единственное, что вы можете подумать о добавлении в наивную
tar
команду - это-C
флаг, заставляющий ее извлекать вещи из безопасного временного каталога, поэтому вам не нужно делатьcd
это сначала.В сторону :
Технически,
tar
POSIX больше не указан. Они пытались сообщить миру вычислительных систем Unix, что мы должны использоватьpax
сейчас вместоtar
иcpio
, но вычислительный мир в значительной степени игнорировал их.Здесь уместно заметить, что в спецификации POSIX
pax
не сказано, как она должна обрабатывать начальные косые черты или встроенные..
элементы. Существует нестандартный--insecure
флаг для BSDpax
для подавления защиты от встроенных..
элементов пути, но, по-видимому, нет защиты по умолчанию от ведущих косых черт; Справочнаяpax
страница BSD косвенно рекомендует писать-s
правила замещения, чтобы справиться с абсолютным риском пути.Это то, что происходит, когда стандарт де-факто остается в активном использовании, в то время как стандарт де-юре в значительной степени игнорируется.
источник
pax - portable archive interchange
Ой, как мило, POSIX думает, что это заменит возможно самый широко используемый формат архива: PС GNU tar это просто
в пустой директории. GNU tar автоматически удаляет
/
имена ведущих членов при извлечении, если явно не указано иное с--absolute-names
опцией . GNU tar также определяет, когда использование../
приведет к извлечению файла за пределы каталога верхнего уровня, и вместо этого помещает эти файлы в каталог верхнего уровня, например, компонентfoo/../../bar/qux
будет извлечен, какbar/qux
в каталоге верхнего уровня, а неbar/qux
в родительском каталоге верхнего уровня. , GNU tar также заботится о символических ссылках, указывающих вне каталога верхнего уровня, например,foo -> ../..
иfoo/bar
не будет вызыватьbar
извлечение вне каталога верхнего уровня.Обратите внимание, что это относится только к (достаточно новым версиям) GNU tar (а также к некоторым другим реализациям, например, * BSD tar и BusyBox tar). Некоторые другие реализации не имеют такой защиты.
Из-за символических ссылок используемая вами защита будет недостаточной: архив может содержать символическую ссылку, указывающую на каталог вне дерева, и извлекать файлы в этом каталоге. Нет способа решить эту проблему, основываясь исключительно на именах членов, вам нужно изучить цель символических ссылок.
Обратите внимание, что при извлечении в каталог, который уже содержит символические ссылки, гарантия может больше не действовать.
источник
Чтобы охватить несколько моментов, другие ответы не имеют:
Во-первых, посмотрите, что находится в файле, прежде чем извлечь его:
Если там есть что-то, чему вы не доверяете или хотите извлечь, не извлекайте тарбол.
источник