5月11日晚7点20分,84个恶意版本在6分钟内涌入42个@tanstack/*包。48小时后,这个数字膨胀到172个包、403个恶意版本,横跨npm与PyPI。TanStack/react-router单周下载量1270万次,而攻击者给每个恶意版本都配上了有效的SLSA Build Level 3来源证明。

来源证明是真的,包是毒的。

打开网易新闻 查看精彩图片

Endor Labs高级安全研究员Peyton Kennedy告诉VentureBeat:"TanStack在纸面上的配置无可挑剔:OIDC可信发布、签名来源、每个维护者账户强制2FA。攻击还是成功了。"问题出在OIDC作用域——发布流水线信任了整个仓库,而非特定分支上的特定工作流。一个无父历史、无分支关联的孤立提交,就能拿到有效的发布令牌。"这是单行配置就能修复的事。"

攻击链由三个漏洞串联而成。5月10日,攻击者fork了TanStack/router,命名为zblgg/configuration以避开fork列表搜索。一个pull request触发了pull_request_target工作流,检出fork代码并执行构建,攻击者由此获得TanStack runner上的代码执行权限。GitHub Actions缓存被投毒。

这个被称为"Shai-Hulud"的蠕虫在开发者机器上收割100多个路径的凭证:AWS密钥、SSH私钥、npm令牌、GitHub PAT、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 runner上的行为更为激进。Linux runner上,蠕虫直接读取/proc/pid/mem提取进程内存中的密钥,包括已被掩码的。Wiz分析发现,若在隔离机器前撤销令牌,一个破坏性守护进程会擦除整个home目录。

Mend追踪显示,OX Security统计的累计受影响下载量达5.18亿次。CVE-2026-45321,CVSS评分9.6。任何在5月11日后安装或导入过这172个包之一的开发环境,都应被视为可能已沦陷。