如何安全地提取不受信任的tar文件?


30

我希望能够提取tar文件,以便将所有提取的文件放在某个前缀目录下。tar文件尝试写入外部目录的任何尝试均应导致提取失败。

您可能会想到,这样我可以安全地提取不可信的tar文件。

我该如何使用GNU tar

我想出了:

tar --exclude='/*' --exclude='*/../*' --exclude='../*' -xvf untrusted_file.tar

但是我不确定这是否足够偏执。


2
这还不够偏执。过去,我通过创建的符号链接构造了一些讨厌的tarball。我最终制作了自己的setuid-root tar,这样它可以执行chroot(“。”)并删除特权。
约书亚

8
@Joshua,因此使一个经过广泛测试的实用程序更安全的解决方案是创建自己的版本并赋予其root特权?
停止Harming Monica's

4
@OrangeDog:int main(int argc,char ** argv){chroot(“。”)|| 出口(1); setuid(getuid()); 易于审核。
约书亚

2
您可能还想通过使用该-t选项检查tar文件中的内容。
托马斯

Answers:


40

您根本不需要妄想症。默认情况下,GNU tar(实际上是过去30年左右编写的任何编写良好的tar程序)都将拒绝在压缩包中提取以斜杠开头或包含..元素的文件。

您必须全力以赴,迫使现代tar程序提取此类可能有害的tarball:GNU和BSD都tar需要-P选择使它们禁用此保护的选项。请参阅GNU tar手册中的“ 绝对文件名 ”部分。

-P不过POSIX并未指定该标志,因此其他tar程序可能有不同的处理方式。例如,Schily Tools的star程序使用-/-..禁用这些保护。

您可能考虑添加到朴素tar命令中的唯一一件事就是-C强制其将其提取到安全的临时目录中的标志,因此您不必cd首先到那里。


助手

  1. 从技术上讲,tarPOSIX不再指定。他们试图告诉Unix计算世界,我们pax现在应该使用而不是tarand cpio,但是计算世界在很大程度上忽略了它们。

    这里需要注意的是POSIX规范pax没有说明它应该如何处理前斜杠或嵌入式..元素。BSD有一个非标准--insecure标志来禁止针对嵌入式路径元素的保护,但是显然没有针对前导斜线的默认保护;BSD 手册页间接建议编写替代规则以应对绝对路径风险。pax..pax-s

    当事实上的标准仍然有效使用而法律上的标准在很大程度上被忽略时,就会发生这种情况。


7
pax - portable archive interchangeAwww,多么可爱,POSIX认为它将取代最广泛使用的存档格式:P
cat

1
@cat默认存档格式是相当广泛支持的tar变体(AIUI,它也应该支持cpio格式)。Pax只是尝试替换用于处理此类归档文件的命令界面,因为tar的命令参数处理很……古怪。
Random832'2016-4-18

随机的旁注:我很确定这是“ de jour”(即法语),而不是“ de jure”。
Fund Monica的诉讼

7
@QPaysTaxes不是。法律上是拉丁文,与目前的情况形成对比,即事实。遵守法国语法规则也应该是“周到的”。
2016年

1
这是不幸的错误关联的情况。法语“ du jour”(“当日”)的外观/听起来与拉丁语“ de jure”(“ of of law”)在这里与“ de facto”(“ of fact”)形成对比。有人可能会争辩说pax是“本月标准”或“标准du jour”,以取笑如此频繁地提出新标准的方式,而广大用户只是坚持适用于他们的标准(事实上的标准),知道(隐喻地)明天将有一个新标准让他们忽略。
Monty Harder

19

使用GNU tar,

tar -xvf untrusted_file.tar

在一个空目录中。/提取时,GNU tar会自动剥离前导成员名称,除非使用--absolute-namesoption明确告知。GNU tar还会检测何时使用../会导致在顶级目录之外提取文件,并将这些文件放到顶级目录中,例如,foo/../../bar/qux将像bar/qux在顶级目录中那样提取一个组件,而不是bar/qux在顶级目录的父目录中。GNU tar还负责指向顶级目录外部的符号链接,例如foo -> ../..foo/bar不会导致bar将其提取到顶级目录之外。

请注意,这仅适用于GNU tar(足够新的版本)(以及某些其他实现,例如* BSD tar和BusyBox tar)。其他一些实现则没有这种保护。

由于存在符号链接,因此您所使用的保护还不够:归档文件可能包含指向树外目录的符号链接,并在该目录中提取文件。无法仅基于成员名称来解决该问题,您需要检查符号链接的目标。

请注意,如果要解压缩到已经包含符号链接的目录中,则担保可能不再成立。


6

为了涵盖其他几点,其他答案还没有:

  1. 首先,在解压缩文件之前先查看文件中的内容:

    tar -tvf untrusted_tar_file.tar
    

    如果其中有您不信任或不想提取的内容,请不要提取压缩包。

  2. 其次,以非root用户身份提取tarball,该用户仅具有将tarball提取到的目录的写权限。例如,从非root用户的主目录中提取tarball。

4
1.这对于批处理操作不切实际。2.除非您正在运行自定义设置,否则所有用户都可以写入某些位置,尤其是/ tmp /
pipe

@pipe也可以创建一个目录和一个新用户,只有该用户有权访问该目录,然后运行命令。我非常喜欢我的主目录,谢谢。

2
@pipe为什么上帝的美好地球,你会EVER通过不可信通过批处理操作的数据?如果您不信任它,请不要无人看管它。
Andrew Henle

6
@AndrewHenle Uhm,好的。您如何看待互联网上的每台服务器?您是否认为stackexchange的某个人通过他们的数据库和标记系统运行此注释,同时手动监视操作?因为此输入是通过批处理操作获得的不受信任的数据。
管道

我不建议直接在主目录中提取不受信任的文件。您不希望它覆盖您的.bashrc和其他.config /文件,对吗?
Hugal31
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.