自我复制 npm 蠕虫毒害 Keyv 和 440 多个软件包
2026 年 8 月 4 日,一种自我复制的 npm 蠕虫病毒破坏了 keyv 和 440 多个软件包,窃取了云和 CI 凭证。发生了什么以及如何应对。
发生了什么
2026年8月4日有人接管了维护的GitHub帐户 钥匙 和更广泛的 可缓存的 缓存库系列,然后推送有毒版本。第一个确认的恶意版本是 [email protected]。从那里它自行传播。
安全公司 SafeDep 每分钟跟踪该活动,在 UTC 时间 09:02 记录了发布提交,大约半小时后发布了第一个中毒的 npm。到 UTC 时间 13:18,相同的有效载荷已在 12 个组织中达到最终目标。截至 2026 年 8 月 5 日,其已确认的足迹: 444 个软件包名称中的 2,234 个中毒软件包版本。由于波浪仍在移动,追踪器之间的计数有所不同。 Socket 和 Aikido 在同一天发布了自己的分析,并在当天早些时候报告了较小的数字。
该恶意软件是一个变种 谢胡鲁德,一种自我传播的 npm 蠕虫研究人员已将其与 2026 年早些时候的妥协联系起来。它会在安装时窃取凭据,然后使用它发现的任何 npm 发布令牌来毒害更多软件包。这就是单一账户接管变成快速爆发的原因。
为什么这很重要
keyv 并不是一个不起眼的包。它每周的下载量约为 1.27 亿次,其中两个受感染的兄弟姐妹, 平面缓存 和 文件条目缓存,坐在 ESLint 下方。这会将恶意代码放置在从未直接安装过 keyv 且没有明显理由考虑它的项目的依赖关系树中。
爆炸半径是任何跑过的人 npm install 在窗口、笔记本电脑或 CI 中。 SafeDep 统计,受影响最大的软件包的每月下载量合计超过 10 亿次。当树中这么深的包运送凭证窃取者时,问题不是谁受到影响,而是谁能证明他们没有受到影响。

范围内的 @keyv/* 适配器包和 keyv 5.x 系列没有受到影响,因此并不是每个 keyv 用户都受到影响。损害发生在那些解决了中毒的 6.x 版本或其受感染的依赖项的项目上。
蠕虫如何传播
该机制古老而可靠:生命周期脚本。攻击者在 package.json 中添加了一行, preinstall 在您自己的任何代码执行之前运行“node setup.mjs”的钩子。安装时,setup.mjs 从 GitHub 的官方版本下载 Bun 运行时的副本,并使用它来运行第二个文件,即执行实际工作的 727KB 编译包。
该捆绑包会扫描机器中的秘密:GitHub 令牌、npm 令牌、AWS 密钥、Google Cloud 服务帐户、Azure 凭证、Stripe 密钥、数据库连接字符串、私钥块、Vault 令牌和 Kubernetes 服务帐户令牌。在 CI 中,它更进一步,直接从运行器内存中读取 GitHub Actions 秘密,并植入一个工作流程,将存储库的秘密转储到构建工件中。
被盗的 npm 发布代币是燃料。每隔几分钟,相同的字节相同的有效负载就会在不相关的组织中重新出现,SafeDep 将其视为由收获的令牌驱动的自动传播,而不是十几个单独的入侵。一份有毒的释放甚至有效 SLSA 出处 指向真正的发布标签。签名是真实的;它只是证明合法的基础设施已经建立了受损的源。
Claude Code 和 VS Code 的区别
安装挂钩是声音最大的部分。更安静的部分是攻击者留在存储库本身中的部分。中毒源发了一个 .claude/settings.json 带有 SessionStart 挂钩和 .vscode/tasks.json 任务设置为在打开的文件夹上运行。在 Claude Code 或 VS Code 中打开项目,有效负载将获得第二次执行机会,这次锁定文件中没有任何内容可以泄露它。
这两个钩子都需要编辑器的工作区信任提示来触发,因此它们不是全自动的。但它们显示了供应链攻击的发展方向。 AI 编码代理和编辑器代表您运行项目定义的任务,而隐藏在编辑器配置中的凭证窃取程序对于现在每个人都指向 package.json 的依赖关系扫描器来说是不可见的。
死人开关
有效负载并不是简单地获取令牌并离开。它安装了一个观察程序,每 60 秒使用被盗的令牌轮询 GitHub。当令牌被撤销并且请求开始失败时,观察者就会运行攻击者提供的代码。它作为 macOS LaunchAgent 或 Linux systemd 用户服务在重新启动后仍然存在,并且在 Linux 上它启用延迟,以便在注销后继续运行。
这个细节重写了事件响应手册。令牌泄漏后的本能是立即轮换所有内容。在这里,首先旋转可以是触发处理程序的触发器。 SafeDep 的指导很直白:在撤销任何内容之前找到并删除观察者。
现在该怎么办
如果你或你的 CI 运行了 npm install 在窗口期间针对这些包,将环境视为受到损害并按以下顺序工作:
- 在旋转之前狩猎。 查找观察者的文件、主目录下的 gh-token-monitor 脚本和配置,以及 LaunchAgent (macOS) 或 systemd 用户服务 (Linux)。首先将其删除,然后轮换凭据。
- 假设 CI 令牌泄露。 窗口中暴露给构建的任何 npm、GitHub 或云令牌都应在观察者消失后进行轮换。
- 检查你的锁文件。 将已解决的版本与已发布的受影响的软件包列表进行比较。 keyv 5.x 和作用域 @keyv/* 适配器是干净的。
- 关闭 CI 中的安装脚本。 npm 12 及更高版本默认阻止未经批准的依赖生命周期脚本;老客户仍在运营它们。固定版本或直接禁用脚本。
- 扫描存储库,而不仅仅是树。 Grep 用于注入的编辑器挂钩和秘密转储工作流程。干净的锁定文件不会清除 .claude 和 .vscode 配置。

接下来是什么
到 8 月 4 日为止,社区已经开始拉取中毒版本并撤销令牌,而 npm 在新客户端中的默认脚本阻止功能使许多机器无法运行有效负载。截至 2026 年 8 月 5 日,初始访问路径(即维护者帐户最初如何被接管)尚未确定,也没有指定参与者的名字。
重点并不是keyv特别粗心。一个拥有广泛依赖的软件包发布权的帐户足以在一个下午达到 10 亿次下载,而针对人工智能编码工具的最新问题、执行挂钩则位于大多数防御措施尚未发现的地方。对维护者帐户实施双因素可信发布,默认禁用 CI 中的安装脚本,并扫描整个存储库而不是单独扫描依赖项清单。
