我希望能够提取一个 tar 文件,以便所有提取的文件都放在某个前缀目录下。任何由 tar 文件写入外部目录的尝试都会导致提取失败。
正如您想象的那样,这样我就可以安全地提取不受信任的 tar 文件。
我怎样才能用 GNU 做到这一点tar
?
我想出了:
tar --exclude='/*' --exclude='*/../*' --exclude='../*' -xvf untrusted_file.tar
Run Code Online (Sandbox Code Playgroud)
但我不确定这是否足够偏执。
War*_*ung 41
你根本不需要偏执。GNU tar
-事实上任何写得很好tar
,在过去30年左右生产计划-将拒绝在以斜杠开头或包含压缩包解压缩文件的..
内容,默认情况下。
您必须竭尽全力强制现代tar
程序提取此类潜在恶意的 tarball:GNU 和 BSD 都tar
需要-P
使它们禁用此保护的选项。请参阅GNU tar 手册中的绝对文件名部分。
该-P
标志不是由 POSIX 指定的,¹ 不过,因此其他tar
程序可能有不同的处理方式。例如,Schily Tools 的star
程序使用-/
并-..
禁用这些保护。
您可能会考虑添加到简单tar
命令中的唯一一件事是-C
强制它在安全的临时目录中提取内容的标志,因此您不必cd
先到那里。
旁白:
从技术上讲,tar
POSIX 根本不再指定。他们试图告诉 Unix 计算世界我们pax
现在应该使用tar
和cpio
,但计算世界基本上忽略了它们。
这里需要注意的是,POSIX 规范pax
没有说明它应该如何处理前导斜杠或嵌入..
元素。BSD有一个非标准--insecure
标志来抑制对嵌入路径元素的保护,但显然没有针对前导斜杠的默认保护;BSD手册页间接推荐编写替换规则来处理绝对路径风险。pax
..
pax
-s
当事实上的标准仍在使用中而法律上的标准在很大程度上被忽略时,就会发生这种情况。
Gil*_*il' 20
使用 GNU tar,它只是
tar -xvf untrusted_file.tar
Run Code Online (Sandbox Code Playgroud)
在一个空目录中。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)。其他一些实现没有这样的保护。
由于符号链接,您使用的保护是不够的:存档可能包含指向树外部目录的符号链接,并在该目录中提取文件。单纯根据成员名没有办法解决这个问题,你需要检查符号链接的目标。
请注意,如果您要提取到已经包含符号链接的目录,则该保证可能不再有效。
为了涵盖其他答案没有的几点:
首先,在提取文件之前查看文件中的内容:
tar -tvf untrusted_tar_file.tar
Run Code Online (Sandbox Code Playgroud)
如果其中有您不信任或不想提取的内容,请不要提取 tarball。
归档时间: |
|
查看次数: |
7982 次 |
最近记录: |