根据 Checkmarx 周五发布的研究,约三分之一的 Python 包在 Python Package Index (PyPi) 中存在安全漏洞,该漏洞允许攻击者在下载时自动执行代码。这一发现凸显了开源软件仓库如 PyPi 近年来越发成为恶意攻击者的目标,Checkmarx 表示“在我们发现的许多恶意软件包中,都利用了这个安装时自动执行代码的特性,以实现更高的感染率。”
Checkmarx 的供应链安全负责人 Tzachi Zorenshtain 指出,当开发人员从 PyPi 等仓库安装软件包时,他们大多数都明白,随之而来的可能还有恶意代码的安装风险。“当我们实际检查行为并寻找新的攻击向量时,我们发现如果你下载一个恶意软件包仅仅下载它它就会在你的电脑上自动运行,”他在以色列的采访中告诉 SC Media。“所以我们试图理解为什么,因为对我们来说,下载这个词并不一定意味着代码会自动运行。”
但在 PyPi 中,它确实如此。所需的命令会运行一个名为 pip 的脚本,执行另一个名为 setuppy 的文件,该文件旨在提供数据结构,以便软件包管理器理解如何处理该软件包。这个脚本及其过程也是由 Python 代码组成,这些代码会自动运行,这就意味着攻击者可以在下载该软件包的任何设备上插入并执行恶意代码。
事实上,这个特定的漏洞早在 2014 年就已在 GitHub 上被提及,但由于该缺陷更像是软件从仓库频繁下载和安装的特性,而非直接的错误,因此未得到直接解决,也无法直接补丁。“Python 包管理生态中一个不幸的事实是,任何与打包相关的内容总是涉及任意代码执行指的就是 setuppy,”一位 GitHub 用户在 2014 年 7 月写道。

近年来,PyPi 引入了一种新的轮子文件whl类型,完全不需要运行 setuppy 命令,但出于兼容性原因,他们仍然允许贡献者选择他们偏爱的格式。这意味着 PyPi 上许多软件包根据 Checkmarx 的说法,最多可达三分之一仍然使用脆弱的 targz 格式,显然,恶意行为者会故意选择较旧的格式以传播其恶意代码。
还有其他解决方法,比如通过浏览器下载软件包,这样可以完全避免使用 setuppy 过程。除此之外,Zorenshtain 预计该漏洞将在使用旧文件格式的软件包中被利用很多年。“对我们来说,最令人担忧的是,这个漏洞并不容易修复,”Zorenshtain 说道,并补充道:“如果我们神奇地改变了所有格式,并且一切都重新提交并转存到新格式,那么修复这个行为就会很简单。我们了解这种行为可能会伴随我们一段时间,所以至少提高意识对我们来说是很重要的。”
蘑菇加速器苹果版截至发稿时,发送给管理 PyPi 的 Python 软件基金会的意见和问题未得到回复。