在 Python 中安全地提取不受信任的 tarball

Kan*_* Li 5 python tar python-2.7

在tarfile.extractall的文档中它说

未经事先检查,切勿从不可信来源提取档案。文件可能是在路径之外创建的,例如具有以“/”开头的绝对文件名或带有两个点“..”的文件名的成员。

网络或 stackoverflow 上的一些帖子解决了这些漏洞,但是,我仍然可以想到另一种情况,例如包含以下两个文件的 tarball:

A --> /etc
A/passwd
Run Code Online (Sandbox Code Playgroud)

条目A是一个符号链接,下面的任何内容都A将被重定向到/etc,网络上的大多数解决方案都无法检测到它。

我的问题是,除此之外,可能还有一些我忽略的其他漏洞,所以即使我有一段代码可以处理这个问题,它可能仍然不安全。有没有成熟的Python库可以安全地提取tarball?

Dav*_*day 0

您可以在使用库序列化 tar 存档之前检查其内容tarfile。例如,从文档中,

import tarfile
tar = tarfile.open("sample.tar.gz", "r:gz")
for tarinfo in tar:
    print(tarinfo.name, "is", tarinfo.size, "bytes in size and is ", end="")
    if tarinfo.isreg():
        print("a regular file.")
    elif tarinfo.isdir():
        print("a directory.")
    else:
        print("something else.")
tar.close()
Run Code Online (Sandbox Code Playgroud)