我希望能够提取tar文件,以便将所有提取的文件放在某个前缀目录下。tar文件尝试写入外部目录的任何尝试均应导致提取失败。
您可能会想到,这样我可以安全地提取不可信的tar文件。
我该如何使用GNU tar
?
我想出了:
tar --exclude='/*' --exclude='*/../*' --exclude='../*' -xvf untrusted_file.tar
但是我不确定这是否足够偏执。
-t
选项检查tar文件中的内容。
我希望能够提取tar文件,以便将所有提取的文件放在某个前缀目录下。tar文件尝试写入外部目录的任何尝试均应导致提取失败。
您可能会想到,这样我可以安全地提取不可信的tar文件。
我该如何使用GNU tar
?
我想出了:
tar --exclude='/*' --exclude='*/../*' --exclude='../*' -xvf untrusted_file.tar
但是我不确定这是否足够偏执。
-t
选项检查tar文件中的内容。
Answers:
您根本不需要妄想症。默认情况下,GNU tar
(实际上是过去30年左右编写的任何编写良好的tar
程序)都将拒绝在压缩包中提取以斜杠开头或包含..
元素的文件。
您必须全力以赴,迫使现代tar
程序提取此类可能有害的tarball:GNU和BSD都tar
需要-P
选择使它们禁用此保护的选项。请参阅GNU tar手册中的“ 绝对文件名 ”部分。
-P
不过POSIX并未指定该标志,因此其他tar
程序可能有不同的处理方式。例如,Schily Tools的star
程序使用-/
和-..
禁用这些保护。
您可能考虑添加到朴素tar
命令中的唯一一件事就是-C
强制其将其提取到安全的临时目录中的标志,因此您不必cd
首先到那里。
助手:
pax - portable archive interchange
Awww,多么可爱,POSIX认为它将取代最广泛使用的存档格式:P
使用GNU tar,
tar -xvf untrusted_file.tar
在一个空目录中。/
提取时,GNU tar会自动剥离前导成员名称,除非使用--absolute-names
option明确告知。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
如果其中有您不信任或不想提取的内容,请不要提取压缩包。