PyPI 包 lightning 遭供应链攻击,800 万月下载量的 ML 框架暴露开发者凭证

2026年4月30日,深度学习框架 PyTorch Lightning 的 PyPI 包 lightning 的 2.6.2 和 2.6.3 版本被植入恶意代码,import lightning 即触发窃取行为。月下载量约 800 万的包被劫持,波及大量 ML 训练管线和 CI 环境。

事件时间线

  • UTC 12:45 — lightning 2.6.2 发布到 PyPI
  • UTC 12:50 — Socket 标记 2.6.2 为恶意
  • UTC 12:52 — lightning 2.6.3 发布(7分钟后)
  • UTC 13:01 — Socket 标记 2.6.3 为恶意
  • ~UTC 15:00 — PyPI 隔离整个 lightning 项目

最后一个确认干净的版本是 2.6.1(2026年1月30日发布)。

攻击链

三阶段攻击,导入即触发:

阶段一:导入触发。 恶意代码注入 __init__.py,导入时自动生成守护线程启动 _runtime/start.py,用户无感知。

阶段二:Bun 引导器。 下载 Bun JavaScript 运行时(支持 Linux/macOS/Windows 的 x64 和 ARM64),stdout/stderr 重定向到 DEVNULL 抑制输出。

阶段三:混淆载荷。 11MB 的 router_runtime.js 使用 hex 编码变量名逃避静态分析,通过 javascript-obfuscator 生成。

窃取范围

载荷覆盖 17 个 AWS 区域,全平台扫描:

  • GitHub PATs、npm tokens
  • AWS(IMDS、STS、Secrets Manager)
  • Azure(AD、Key Vault、Service Fabric)
  • GCP(OAuth、metadata、KMS)
  • 本地环境变量、SSH 密钥、加密钱包
  • Claude Code 和 MCP 配置文件

数据外泄

三个通道并行:

  1. HTTPS C2 直连 — 攻击者控制的基础设施
  2. GitHub commit 死信箱 — 轮换仓库提交加密数据
  3. 受害者 GitHub 账户 — 利用 stolen token 直接往开发者自己的仓库写入

自传播

蠕虫通过两种机制横向移动:

  • 篡改本地 npm 包的 package.json,注入 preinstall 脚本,下游开发者 npm install 即中招
  • 在 GitHub Actions 中利用 OIDC token 换取 npm publish token,无需 stolen credentials

维护者账户异常

Socket 在 Lightning-AI/pytorch-lightning 仓库提交安全预警 Issue 后,被 pl-ghost 账户在 1 分钟内关闭,并帖了 "SILENCE DEVELOPER" 梗图。攻击者疑似通过 PyPI 项目级 token 上传恶意版本,而非 GitHub workflow。

Shai-Hulud 蠕虫关联

本次攻击与近期多起供应链攻击属同一活动:

包名生态日期
Bitwarden CLInpm2026-04-23
LiteLLMPyPI2026-03-24
XinferencePyPI2026-04-22
SAP npm 包npm2026-04-29
intercom-client 7.0.4npm2026-04-30

技术签名一致:Bun 运行时 + 混淆 JS + 多云凭证窃取 + npm 自传播。六周内第三次针对 AI/ML 开发者的高调攻击。

防护建议

  • 清除 pip 缓存:pip cache remove lightning
  • 卸载恶意版本并回滚:pip install lightning==2.6.1
  • 轮换所有可能暴露的凭证
  • 排查 GitHub 仓库异常提交和 npm 包的 hook
  • 依赖锁定(lockfile pinning)是最有效的单一防护手段
  • 采用 24-72 小时版本冷却期

来源:Socket · Sonatype · Endor Labs

相关推荐