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

Dem*_*emi 31 security tar

我希望能够提取一个 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先到那里。


旁白

  1. 从技术上讲,tarPOSIX 根本不再指定。他们试图告诉 Unix 计算世界我们pax现在应该使用tarcpio,但计算世界基本上忽略了它们。

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

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

  • @QPaysTaxes 不是。de jure 是拉丁语,与当前情况形成对比,即事实上的。De jour 也应该是 du jour 遵守法语语法规则。 (8认同)
  • `pax - 便携式存档交换` 哇,多可爱,POSIX 认为它可能会取代最广泛使用的存档格式:P (7认同)
  • @cat 默认存档格式是一种广泛支持的 tar 变体(AIUI 它还应该支持 cpio 格式)。Pax 更像是一种替换 _command_ 接口来处理此类档案的尝试,因为 tar 的命令参数处理是......古怪的。 (2认同)
  • 这是一个不幸的假同源案例。法语的“du jour”(“当天的”)看起来/听起来很像拉丁语的“de jure”(“法律的”),这里与“de facto”(“事实的”)形成鲜明对比。有人可能会争辩说 pax 是“本月标准”或“今日标准”,以取笑如何频繁提出新标准,而广大用户只是坚持使用适合他们的标准(事实上的标准),知道(比喻地)明天将会有一个新的标准让他们忽略。 (2认同)

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)。其他一些实现没有这样的保护。

由于符号链接,您使用的保护是不够的:存档可能包含指向树外部目录的符号链接,并在该目录中提取文件。单纯根据成员名没有办法解决这个问题,你需要检查符号链接的目标。

请注意,如果您要提取到已经包含符号链接的目录,则该保证可能不再有效。


And*_*nle 6

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

  1. 首先,在提取文件之前查看文件中的内容:

    tar -tvf untrusted_tar_file.tar
    
    Run Code Online (Sandbox Code Playgroud)

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

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

  • @AndrewHenle 嗯,好的。你认为互联网上的每台服务器都是如何工作的?您认为 stackexchange 的某些人在手动监控操作的同时通过他们的数据库和标记系统运行此评论吗?因为这个输入是通过批处理操作的不可信数据。 (6认同)
  • 1. 这对于批处理操作来说是不切实际的。2. 除非您运行自定义设置,否则所有用户都可以写入某些位置,特别是 /tmp/ (4认同)
  • @pipe 为什么在上帝的美好地球上,您 **EVER** 通过批处理操作传递*不受信任的* 数据?如果你不信任它,你**不要**在无人看管的情况下运行它。 (2认同)