旧版Python引导脚本为多个PyPI软件包带来域名劫持风险
网络安全研究人员在一些遗留的Python软件包中发现了存在漏洞的代码,这可能会为攻击者通过域名劫持攻击,在Python软件包索引(PyPI)上实施供应链攻击铺平道路。
软件供应链安全公司ReversingLabs表示,他们在名为“zc.buildout”的构建和部署自动化工具提供的引导文件中发现了这个“漏洞”。
安全研究员Vladimir Pezo表示:“这些脚本自动化了下载、构建和安装所需库和工具的过程。具体来说,当引导脚本执行时,它会从 python-distribute[.]org 获取并执行Distribute软件包的安装脚本——这是一个现已可以高价出售的遗留域名,同时其被管理用于产生广告收入。”
包含访问该问题域名的引导脚本的PyPI软件包包括:tornado、pypiserver、slapos.core、roman、xlutils和testfixtures。
问题的核心涉及一个旧的引导脚本(“bootstrap.py”),该脚本曾与zc.buildout工具一起用于初始化Buildout环境。该Python脚本还支持将名为“Distribute”的打包工具安装到本地环境中,Distribute是Setuptools项目的一个短暂存在的分支。
为了实现这一点,Distribute安装脚本(“distribute_setup.py”)是从 python-distribute[.]org 获取的,该域名自2014年以来一直处于待售状态。添加此选项的初衷是,引导脚本能够下载并安装Distribute软件包,以替代较旧的Setuptools包,来管理buildout的eggs和依赖项。
值得注意的是,Distribute分支的出现是因为当时使用的主要包管理工具Setuptools缺乏积极开发。然而,Distribute的功能在2013年被重新集成回Setuptools,使得Distribute变得过时。
ReversingLabs发现的问题在于,许多软件包仍在继续发布该引导脚本,这些脚本要么默认尝试安装Distribute,要么在指定命令行选项(“-d”或“–distribute”)时尝试安装。再加上相关域名可被获取这一事实,将用户置于潜在风险之中,因为攻击者可以利用此设置在引导脚本无意中被运行时提供恶意代码,并可能窃取敏感数据。
尽管一些受影响的软件包已采取措施移除引导脚本,但slapos.core软件包仍在继续发布存在漏洞的代码。该脚本也包含在Tornado的开发和维护版本中。
另一个需要考虑的重要方面是,引导脚本在软件包安装过程中不会自动执行,并且是用Python 2编写的。这意味着该脚本未经修改无法在Python 3中执行。但仅仅该文件的存在就留下了一个“不必要的攻击面”,如果开发者被诱骗运行触发引导脚本执行的代码,攻击者就可以利用这一点。
域名劫持的威胁并非理论上的。2023年,npm软件包fsevents被恶意行为者攻陷的事件曝光,该行为者控制了一个位于 fsevents-binaries.s3-us-west-2.amazonaws[.]com 的无人认领的云资源,向安装该软件包特定版本的用户推送恶意可执行文件(CVE-2023-45311,CVSS评分:9.8)。
Pezo表示:“问题在于包含从硬编码域名获取并执行有效负载的编程模式,这是一种在表现出下载器行为的恶意软件中常见模式。未能正式停用Distribute模块,使得存在漏洞的引导脚本得以存留,并使数量未知的项目暴露在潜在攻击之下。”
此次披露之际,HelixGuard在PyPI上发现了一个名为“spellcheckers”的恶意软件包,该软件包声称是使用OpenAI Vision检查拼写错误的工具,但包含恶意代码,旨在连接到外部服务器并下载下一阶段有效负载,然后执行远程访问木马(RAT)。
该软件包由名为leo636722的用户于2025年11月15日首次上传到PyPI,已被下载955次。目前已无法下载。
HelixGuard表示:“这个RAT可以接收远程命令并通过 exec() 执行攻击者控制的Python代码,从而实现对受害者主机的完全远程控制。当用户安装并运行恶意软件包时,后门将被激活,允许攻击者远程控制用户的计算机。”