一种针对 Python 包索引 (PyPI) 注册表的新供应链攻击技术已被广泛利用,试图渗透到下游组织。
软件供应链安全公司 JFrog 将其代号为 Revival Hijack,该公司表示,该攻击方法可用于劫持 22,000 个现有的 PyPI 包,并导致“数十万”恶意包下载。这些易受攻击的程序包的下载量超过 100,000 次或已使用超过 6 个月。
“这种攻击技术涉及劫持 PyPI 软件包,方法是操纵在原始所有者从 PyPI 索引中删除后重新注册它们的选项,”JFrog 安全研究员 Andrey Polkovnychenko 和 Brian Moussalli 在与 The Hacker News 分享的一份报告中说。
从本质上讲,攻击取决于这样一个事实,即 PyPI 存储库中发布的几个 Python 包被删除,使任何其他用户都可以注册它们。
JFrog 分享的统计数据显示,平均每月约有 309 个软件包被删除。发生这种情况的原因有很多:缺乏维护(即废弃软件)、包以不同的名称重新发布,或者将相同的功能引入官方库或内置 API。
这也构成了一个比拼写错误更有效的有利可图的攻击面,攻击者可以使用自己的帐户利用该攻击面发布相同名称和更高版本的恶意包,以感染开发人员环境。
“该技术不依赖于受害者在安装软件包时犯错误,”研究人员说,并指出 Revival Hijack 如何从对手的角度产生更好的结果。“许多用户将’曾经安全’的软件包更新到最新版本是一种安全的操作。”
虽然 PyPI 确实采取了针对作者冒充和拼写错误尝试的保护措施,但 JFrog 的分析发现,运行“pip list –outdated”命令会将假冒包列为原始包的新版本,其中前者对应于来自完全不同作者的不同包。
更令人担忧的是,运行“pip install –upgrade”命令会将实际的包替换为虚假的包,而不会发出太多警告,表明包的作者已更改,这可能会使不知情的开发人员面临巨大的软件供应链风险。
JFrog 表示,它采取了创建一个名为“security_holding”的新 PyPI 用户帐户的步骤,用于安全地劫持易受攻击的包并将其替换为空占位符,以防止恶意行为者利用已删除的包。
此外,这些软件包中的每一个都被分配了 0.0.0.1 的版本号(与依赖项混淆攻击场景相反),以避免在运行 pip upgrade 命令时被开发人员拉取。
更令人不安的是,Revival Hijack 已经被广泛利用,一个名叫 Jinnis 的未知威胁行为者在 2024 年 3 月 30 日推出了一个名为“pingdomv3”的包的良性版本,同一天,原所有者 (cheneyyan) 从 PyPI 中删除了该包。
据说新开发人员于 2024 年 4 月 12 日发布了一个包含 Base64 编码有效负载的更新,该有效负载检查是否存在“JENKINS_URL”环境变量,如果存在,则执行从远程服务器检索的未知下一阶段模块。
“这表明攻击者要么延迟了攻击的实施,要么将其设计得更具针对性,可能将其限制在特定的 IP 范围内,”JFrog 说。
新的攻击表明,威胁行为者正在通过针对已删除的 PyPI 包来扩大活动的范围,从而在更广泛范围内关注供应链攻击。建议组织和开发人员检查其 DevOps 管道,以确保他们没有安装已从存储库中删除的软件包。
“在处理已删除的软件包时使用易受攻击的行为允许攻击者劫持现有软件包,从而可以在不更改用户工作流程的情况下将其安装到目标系统,”JFrog 安全研究团队负责人 Moussalli 说。
“PyPI 包攻击面不断扩大。尽管这里进行了主动干预,但用户应始终保持警惕并采取必要的预防措施来保护自己和 PyPI 社区免受这种劫持技术的侵害。