沙丘蠕虫(Shai-Hulud)攻击 npm 供应链,企业防护六步法

自5月11日以来,任何安装或导入了被入侵的 npm 或 PyPI 包的开发环境,都应被视为潜在的受感染系统。该蠕虫会从超过100个文件路径中窃取敏感凭证,包括 AWS 密钥、SSH 私钥、npm 令牌、GitHub 个人访问令牌、HashiCorp Vault 令牌、Kubernetes 服务账户凭证、Docker 配置文件、Shell 历史记录以及加密货币钱包地址。根据《SecurityWeek》的报道,这是 TeamPCP 团伙首次将密码管理器(如 1Password 和 Bitwarden)作为攻击目标。

蠕虫还会窃取 Claude 和 Kiro 等 AI 代理的配置文件,其中包含这些代理连接外部服务所需的 MCP 服务器认证令牌。更严重的是,即使删除了恶意包,这些恶意行为也不会停止。

蠕虫通过在项目目录中植入持久化机制来确保其长期存在,例如在 Claude Code 的 .claude/settings.json 和 VS Code 的 .vscode/tasks.json 中添加配置,使其在每次打开项目时自动重新执行。此外,它还会安装系统级守护进程(macOS 的 LaunchAgent 或 Linux 的 systemd),这些进程在系统重启后依然存活。这些恶意代码位于项目根目录,而非 node_modules 中,因此卸载包无法清除它们。在 CI 运行器上,蠕虫通过读取进程内存 (/proc/pid/mem) 来提取秘密,包括被隐藏的凭证。Wiz 的分析发现,如果用户在隔离受感染机器前就撤销了令牌,蠕虫中的一个破坏性守护进程会清除用户的 home 目录。

攻击规模与影响

在5月11日协调世界时19:20至19:26期间,Mini Shai-Hulud 蠕虫在42个 @tanstack/* npm 包上发布了84个恶意版本。在48小时内,该攻击活动扩展到影响172个包和403个恶意版本,波及 npm 和 PyPI 两个生态系统。仅 @tanstack/react-router 一个包的周下载量就高达1270万次。此次攻击被标记为 CVE-2026-45321,CVSS 评分为9.6。OX Security 报告称,受影响的累计下载量达到5.18亿次。值得注意的是,每个恶意版本都附带有效的 SLSA Build Level 3 构建来源证明,证明本身是真实的,但包已被投毒。

Endor Labs 的高级安全研究员 Peyton Kennedy 在接受《VentureBeat》采访时表示:“TanStack 在纸面上拥有正确的配置:OIDC 受信任发布、签名证明、所有维护者账户都启用双因素认证。但攻击依然成功了。”她解释道:“孤立提交技术表明,真正起作用的是 OIDC 范围,而非证明或双因素认证。如果你的发布流程信任整个仓库,而不是特定工作流或特定分支,那么一个没有父提交历史且不关联任何分支的提交就足以获取有效的发布令牌。这只是一个单行配置的修复。”

三个漏洞链式利用,绕过安全证明

TanStack 的事后分析揭示了攻击链。5月10日,攻击者以 zblgg/configuration 的名称分叉了 TanStack/router,以规避 fork 列表搜索。一个拉取请求触发了 pull_request_target 工作流,该工作流检出了分叉的代码并运行构建,从而让攻击者在 TanStack 的运行器上获得了代码执行权限。攻击者污染了 GitHub Actions 缓存。当合法维护者合并到主分支后,发布工作流恢复了被污染的缓存。攻击者二进制文件读取了 /proc/pid/mem 以提取 OIDC 令牌,并直接 POST 到 registry.npmjs.org。尽管测试失败,84个已签名的包最终还是发布到了注册中心。

事后分析指出:“每个漏洞都跨越了其他漏洞所依赖的信任边界。”这种攻击手法是对2025年3月 tj-actions/changed-files 攻击中公开的攻击技术的重组应用。

蠕虫数小时内跨 ecosystem 传播

微软威胁情报证实,被入侵的 mistralai PyPI 包 v2.4.6 在导入时(而非安装时)执行,并下载一个伪装成 Hugging Face Transformers 的载荷。npm 的缓解措施(如锁定文件强制和 --ignore-scripts)无法覆盖 Python 的导入时执行。

Mistral AI 发布了安全公告确认了此次影响。受影响的 npm 包在协调世界时5月11日22:45至5月12日01:53期间可用(约3小时)。PyPI 上的 mistralai==2.4.6 版本已被隔离。Mistral 表示是一名受影响的开发设备导致此问题,但其自身基础设施并未被入侵。SafeDep 确认 Mistral 从未发布过 v2.4.6,5月11日没有提交记录,也不存在相应标签。

Wiz 记录了完整的影响范围,包括65个 UiPath 包、Mistral AI SDK、OpenSearch、Guardrails AI 以及20个 Squawk 包。StepSecurity 根据与先前 Shai-Hulud 攻击波的工具链重叠以及与 Bitwarden CLI/Trivy 攻击的关联,将此活动归因于 TeamPCP。该蠕虫使用 Bun 而非 Node.js 运行,以规避 Node.js 的安全监控。

新型攻击目标:AI 编码代理

Socket 的技术分析显示,2.3MB 的 router_init.js 载荷中包含十个并行运行的凭证收集类。蠕虫将持久化代码写入 .claude/.vscode/ 目录,钩住了 Claude Code 的 SessionStart 配置和 VS Code 的文件夹打开任务运行器。StepSecurity 的反混淆分析确认,蠕虫还会窃取 Claude 和 Kiro 的 MCP 服务器配置 (~/.claude.json, ~/.claude/mcp.json, ~/.kiro/settings/mcp.json),这些文件存储着外部服务的 API 密钥和认证令牌。这被确认为供应链恶意软件将 AI 代理配置视为高价值凭证目标的早期实例。

蠕虫设置的 npm 令牌描述为:“如果你撤销此令牌,它将清除计算机所有者的所有数据。”这并非虚张声势。

Kennedy 对《VentureBeat》说:“这个载荷最让我印象深刻的是它在运行后植入的位置。它将持久化钩子写入 Claude Code 的 SessionStart 配置和 VS Code 的文件夹打开任务运行器,这样每次开发者打开项目时都会重新执行,即使 npm 包已被删除。攻击者将 AI 编码代理视为可信执行环境的一部分,而事实也的确如此。这些工具会读取你的仓库、执行 shell 命令,并拥有与开发者相同的秘密访问权限。因此,保护开发环境现在意味着要考虑这些代理,而不仅仅是包本身。”


关注微信号:智享开源 ,可及时获取信息

原文链接:https://venturebeat.com/security/shai-hulud-worm-172-npm-pypi-packages-valid-provenance-ci-cd-audit

评论列表
 
 
发表评论
😀 😂 😃 😄 😅 😆 😉 😊 😋 😎 😍 😘 🥰 😜 😝 🤗 🤔 😭 😤 👍

为你推荐
Ta的个人站点

Mark Do发布文章703篇


关注微信

主站最新信息

分类