理解Python的tarfile模块中的路径遍历错误

发表于2022年10月3日
作者:Laura Verheyde
案例研究

理解Python的tarfile模块中的路径遍历错误

发表于2022年10月3日
作者:Laura Verheyde
查看资源
查看资源

最近,一个安全研究小组宣布他们在Python的tar文件提取功能中发现了一个15年前的漏洞。该漏洞于2007年首次披露,并被追踪为CVE-2007-4559。在Python的官方文档中加入了一个说明,但这个漏洞本身却没有被修补。

这个漏洞可能会影响到成千上万的软件项目,但许多人却不熟悉这种情况或如何处理。这就是为什么,在这里 Secure Code Warrior我们给你一个机会,让你自己模拟利用这个漏洞,看看第一手的影响,在这个持续存在的漏洞的机制方面获得一些实践经验,以便你能更好地保护你的应用程序

现在就试试模拟任务

漏洞:在提取tar文件时进行路径穿越

路径或目录遍历发生在未经消毒的用户输入被用来构建文件路径时,允许攻击者获得访问和覆盖文件,甚至执行任意代码。 

该漏洞存在于Python的tarfile模块。tar(磁带存档)文件是一个单独的文件,称为存档。它把多个文件和它们的元数据打包在一起,通常以.tar.gz.tgz为扩展名来识别。归档中的每个成员都可以用一个TarInfo对象表示,它包含元数据,如文件名、修改时间、所有权等等。

风险来自于档案被再次提取的能力。

当被提取时,每个成员都需要一个写入的路径。这个位置是通过连接基本路径和文件名来创建的。 

摘录自Python的 Tarfile.py


一旦这个路径被创建,它就会被传递给 tarfile.extracttarfile.extractall函数来执行提取。 

摘录自Python的 Tarfile.py

这里的问题是缺乏对文件名的消毒。攻击者可以重命名文件以包括路径遍历字符,如点点斜线(.../),这将导致文件遍历出它本应在的目录并覆盖任意文件。这最终可能导致远程代码执行,这是成熟的利用。 

如果你知道如何识别它,该漏洞出现在其他情况下。除了Python对tar文件的处理外,该漏洞还存在于zip文件的提取过程中。你可能对它的另一个名字很熟悉,比如zip slip 漏洞,它已经在 Python 以外的语言中表现出来了!

链接到任务 

你如何能减轻风险?

尽管这个漏洞已经知道很多年了,但Python维护者认为提取功能在做它应该做的事情。在这种情况下,有些人可能会说 "这是一个功能,不是一个错误"。不幸的是,开发者不可能总是避免从未知的来源提取 tar 或 zip 文件。作为安全开发实践的一部分,他们有责任对不信任的输入进行消毒,以防止路径穿越漏洞。

想了解更多关于如何用Python编写安全代码和降低风险的信息吗?

免费试用我们的Python挑战

如果你有兴趣获得更多免费的编码指南,请查看安全代码教练,以帮助你保持在安全编码实践的顶端。

查看资源
查看资源

作者

Laura Verheyde

Laura Verheyde 是Secure Code Warrior 的一名软件开发人员,主要负责研究漏洞并为Missions 和编码实验室创建内容。

想要更多吗?

在博客上深入了解我们最新的安全编码见解。

我们广泛的资源库旨在增强人类对安全编码技术提升的方法。

查看博客
想要更多吗?

获取关于开发者驱动的安全的最新研究

我们广泛的资源库充满了有用的资源,从白皮书到网络研讨会,让你开始使用开发者驱动的安全编码。现在就去探索它。

资源中心

理解Python的tarfile模块中的路径遍历错误

发表于2022年10月3日
作者:Laura Verheyde

最近,一个安全研究小组宣布他们在Python的tar文件提取功能中发现了一个15年前的漏洞。该漏洞于2007年首次披露,并被追踪为CVE-2007-4559。在Python的官方文档中加入了一个说明,但这个漏洞本身却没有被修补。

这个漏洞可能会影响到成千上万的软件项目,但许多人却不熟悉这种情况或如何处理。这就是为什么,在这里 Secure Code Warrior我们给你一个机会,让你自己模拟利用这个漏洞,看看第一手的影响,在这个持续存在的漏洞的机制方面获得一些实践经验,以便你能更好地保护你的应用程序

现在就试试模拟任务

漏洞:在提取tar文件时进行路径穿越

路径或目录遍历发生在未经消毒的用户输入被用来构建文件路径时,允许攻击者获得访问和覆盖文件,甚至执行任意代码。 

该漏洞存在于Python的tarfile模块。tar(磁带存档)文件是一个单独的文件,称为存档。它把多个文件和它们的元数据打包在一起,通常以.tar.gz.tgz为扩展名来识别。归档中的每个成员都可以用一个TarInfo对象表示,它包含元数据,如文件名、修改时间、所有权等等。

风险来自于档案被再次提取的能力。

当被提取时,每个成员都需要一个写入的路径。这个位置是通过连接基本路径和文件名来创建的。 

摘录自Python的 Tarfile.py


一旦这个路径被创建,它就会被传递给 tarfile.extracttarfile.extractall函数来执行提取。 

摘录自Python的 Tarfile.py

这里的问题是缺乏对文件名的消毒。攻击者可以重命名文件以包括路径遍历字符,如点点斜线(.../),这将导致文件遍历出它本应在的目录并覆盖任意文件。这最终可能导致远程代码执行,这是成熟的利用。 

如果你知道如何识别它,该漏洞出现在其他情况下。除了Python对tar文件的处理外,该漏洞还存在于zip文件的提取过程中。你可能对它的另一个名字很熟悉,比如zip slip 漏洞,它已经在 Python 以外的语言中表现出来了!

链接到任务 

你如何能减轻风险?

尽管这个漏洞已经知道很多年了,但Python维护者认为提取功能在做它应该做的事情。在这种情况下,有些人可能会说 "这是一个功能,不是一个错误"。不幸的是,开发者不可能总是避免从未知的来源提取 tar 或 zip 文件。作为安全开发实践的一部分,他们有责任对不信任的输入进行消毒,以防止路径穿越漏洞。

想了解更多关于如何用Python编写安全代码和降低风险的信息吗?

免费试用我们的Python挑战

如果你有兴趣获得更多免费的编码指南,请查看安全代码教练,以帮助你保持在安全编码实践的顶端。

我们希望得到您的许可,向您发送有关我们产品和/或相关安全编码主题的信息。我们将始终以最谨慎的态度对待您的个人资料,绝不会将其出售给其他公司用于营销目的。

提交
要提交表格,请启用 "分析 "cookies。完成后,请随时再次禁用它们。