供应链安全警报:num2words PyPI 包出现被攻陷迹象

热门 Python 包 num2words v0.5.15 发布时无仓库标签,与已知威胁行为者有关联

关键要点

  • 热门 Python 包 num2words 0.5.15 版本发布到 PyPI 时,官方 GitHub 仓库中没有相应的标签
  • 安全研究员 @johnk3r 发现了与"Scavenger"威胁行为者的潜在关联,该行为者曾参与过之前的供应链攻击
  • PyPI 已删除受影响的包,阻止进一步安装
  • 此事件凸显了 Python 生态系统供应链安全的持续风险

事件经过

2025 年 7 月 28 日,Python 社区收到关于热门 num2words 包的潜在供应链攻击警报。这个用于将数字转换为文字的广泛使用的库的 0.5.15 版本在发布到 PyPI 后约 2 小时被标记为可能存在风险。

PyPI 发布历史,显示可疑的 v0.5.15 版本发布于"约 2 小时前"

红旗信号与初步发现

该 compromise 通过几个令人担忧的指标被首次识别:

  1. 缺少仓库标签:与之前的版本不同,0.5.15 版本发布到 PyPI 时,官方 GitHub 仓库中没有相应的标签,地址为 https://github.com/savoirfairelinux/num2words/tags
  2. 时间差异:该包出现在 PyPI 上时,源代码仓库中没有任何相关的提交或发布活动
  3. 社区警报:安全研究员 @johnk3r 迅速在社交媒体上发出警报,警告社区可能存在 compromise
GitHub 仓库标签,显示 v0.5.15 缺失,而之前的版本(v0.5.14、v0.5.13 等)都有对应的标签

Scavenger 关联

根据 @johnk3r 的分析,早期指标表明此事件可能与"Scavenger"有关,这是一个之前与软件供应链入侵相关的威胁行为者。虽然完整的归因需要更深入的调查,但作案手法与之前的攻击相符:

  • 发布合法包名的恶意版本
  • 利用用户对成熟包名的信任
  • 以热门包为目标以最大化潜在影响
来源:https://x.com/johnk3r/status/1949862337340461528/photo/1

https://x.com/johnk3r/status/1949862337340461528

https://x.com/johnk3r/status/1949862337340461528/photo/1

自动化工具已升级到恶意版本

尽管响应迅速,自动化依赖管理工具已经开始创建拉取请求,将项目升级到受影响的版本。GitHub 搜索显示大量自动化 PR 尝试将 num2words 更新到 0.5.15 版本,展示了恶意包在生态系统中的传播速度之快。以下是一个示例拉取请求:

来源:https://github.com/tarcisio-sousa/agiliza/pull/1075

https://github.com/tarcisio-sousa/agiliza/pull/1075

影响与响应

num2words 包是一个广泛使用的 Python 库,提供将数字转换为多种语言文字表示的功能。每天有数千次下载量,任何 compromise 都可能对 Python 生态系统产生重大影响。

幸运的是,社区和 PyPI 管理员的快速响应帮助控制了潜在损害:

  • 快速发现:可疑版本在发布后数小时内即被识别
  • 迅速行动:PyPI 删除了受影响的包,阻止新安装
  • 社区预警:安全警报通过社交媒体和开发者渠道快速传播

您应该采取的措施

如果您在项目中使用 num2words:

检查您的环境

运行 pip list | grep num2words 以验证您安装的版本

必要时降级

如果您已安装 v0.5.15,请立即使用 pip install num2words==0.5.14 降级到 v0.5.14

审计您的系统

审查可能已安装受影响版本的日志和系统

更新安全实践

考虑实施额外的供应链安全措施

适用于 StepSecurity 企业客户

以下步骤仅适用于 StepSecurity 企业客户。如果您不是现有企业客户,可以通过安装 StepSecurity GitHub App 开始我们 14 天的免费试用,以完成以下恢复步骤。

使用 StepSecurity Harden-Runner 检测 CI/CD 中受影响的依赖项

StepSecurity Harden-Runner 为您的 GitHub Actions 工作流程添加运行时安全监控,提供 CI/CD 运行期间网络调用、文件系统更改和进程执行的可见性。在 eslint-config-prettier 等 compromise 情况下,Harden-Runner 会检测并警报可疑行为,例如在构建过程中到恶意域的意外网络连接或未经授权的文件修改。该工具在工作流程中创建所有活动的审计跟踪,实现潜在安全事件调查时的快速取证分析。通过在 CI/CD 管道中强化运行时监控,您可以防止受影响的依赖项在构建环境中执行恶意代码。以下屏幕截图显示了 Harden-Runner 如何检测 tj-actions 供应链事件

来源:https://www.stepsecurity.io/blog/harden-runner-detection-tj-actions-changed-files-action-is-compromised

通过遵循 https://docs.stepsecurity.io/harden-runner 上的指南,在您的工作流程中实施 Harden-Runner。

更广泛的图景

此事件是针对包仓库的供应链攻击令人担忧的趋势的一部分。与最近 npm 生态系统对 is 包和 eslint-config-prettier 的攻击类似,威胁行为者继续利用开源包分发中基于信任的特性。

Python 社区,与 JavaScript 同行一样,必须保持警惕,继续加强包发布和消费方面的安全实践。

展望未来

虽然 PyPI 的快速响应防止了广泛的损害,但此事件再次提醒我们,供应链安全需要持续警惕。包维护者应该:

  • 为包发布实施强身份验证和授权
  • 使用可用的签名机制
  • 建立明确的发布流程,包括仓库标签
  • 考虑采用验证包完整性的工具和实践

对于包消费者来说,信息很明确:信任但要验证。包管理器的便利性不应凌驾于安全考虑之上。

致谢

感谢 Cedric Brisson 提醒我们注意此事件,感谢 @johnk3r 快速识别并在 X 上发出公开警报。他们在提高意识方面的快速行动帮助社区迅速做出响应。我们还感谢 PyPI 管理员在删除受影响的包方面的迅速响应。

通过关注安全研究员和订阅相关安全公告来了解供应链安全威胁。如果您发现可疑的包行为,请立即向相关包仓库管理员报告。​