Aiignitions
科技新闻

自我复制 npm 蠕虫毒害 Keyv 和 440 多个软件包

2026 年 8 月 4 日,一种自我复制的 npm 蠕虫病毒破坏了 keyv 和 440 多个软件包,窃取了云和 CI 凭证。发生了什么以及如何应对。

自我复制 npm 蠕虫毒害 Keyv 和 440 多个软件包

发生了什么

2026年8月4日有人接管了维护的GitHub帐户 钥匙 和更广泛的 可缓存的 缓存库系列,然后推送有毒版本。第一个确认的恶意版本是 [email protected]。从那里它自行传播。

安全公司 SafeDep 每分钟跟踪该活动,在 UTC 时间 09:02 记录了发布提交,大约半小时后发布了第一个中毒的 npm。到 UTC 时间 13:18,相同的有效载荷已在 12 个组织中达到最终目标。截至 2026 年 8 月 5 日,其已确认的足迹: 444 个软件包名称中的 2,234 个中毒软件包版本。由于波浪仍在移动,追踪器之间的计数有所不同。 Socket 和 Aikido 在同一天发布了自己的分析,并在当天早些时候报告了较小的数字。

The npm logo. keyv is published on the npm registry, which the worm used to republish itself.

该恶意软件是一个变种 谢胡鲁德,一种自我传播的 npm 蠕虫研究人员已将其与 2026 年早些时候的妥协联系起来。它会在安装时窃取凭据,然后使用它发现的任何 npm 发布令牌来毒害更多软件包。这就是单一账户接管变成快速爆发的原因。

为什么这很重要

keyv 并不是一个不起眼的包。它每周的下载量约为 1.27 亿次,其中两个受感染的兄弟姐妹, 平面缓存文件条目缓存,坐在 ESLint 下方。这会将恶意代码放置在从未直接安装过 keyv 且没有明显理由考虑它的项目的依赖关系树中。

爆炸半径是任何跑过的人 npm install 在窗口、笔记本电脑或 CI 中。 SafeDep 统计,受影响最大的软件包的每月下载量合计超过 10 亿次。当树中这么深的包运送凭证窃取者时,问题不是谁受到影响,而是谁能证明他们没有受到影响。

A GitHub search for Shai-Hulud returning about 3,000 repositories, showing the scale of the worm's exfiltration infrastructure.

范围内的 @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 中打开项目,有效负载将获得第二次执行机会,这次锁定文件中没有任何内容可以泄露它。

The GitHub logo. The attacker seized a maintainer's GitHub account and hid execution hooks inside the repository's editor config.

这两个钩子都需要编辑器的工作区信任提示来触发,因此它们不是全自动的。但它们显示了供应链攻击的发展方向。 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 配置。
A second GitHub search showing hundreds of Shai-Hulud dead-drop repositories used to exfiltrate stolen credentials.

接下来是什么

到 8 月 4 日为止,社区已经开始拉取中毒版本并撤销令牌,而 npm 在新客户端中的默认脚本阻止功能使许多机器无法运行有效负载。截至 2026 年 8 月 5 日,初始访问路径(即维护者帐户最初如何被接管)尚未确定,也没有指定参与者的名字。

重点并不是keyv特别粗心。一个拥有广泛依赖的软件包发布权的帐户足以在一个下午达到 10 亿次下载,而针对人工智能编码工具的最新问题、执行挂钩则位于大多数防御措施尚未发现的地方。对维护者帐户实施双因素可信发布,默认禁用 CI 中的安装脚本,并扫描整个存储库而不是单独扫描依赖项清单。

阅读原始来源

前往原始来源查看完整公告和详细信息。

阅读原始来源