与 Keyv 相关的 npm 蠕虫毒化数百个软件包,植入 Claude Code 与 VS Code 钩子
导语:2026 年 8 月 4 日,一个源自 keyv@6.0.0 的窃取凭证 npm 蠕虫扩散至多个组织,污染数百个软件包,并在 Keyv 代码仓库中植入 Claude Code 与 VS Code 钩子作为备用执行路径。SafeDep 已在 npm 注册表中核实 353 个污染版本(涵盖 79 个软件包名称),其更广范围监测评估为 353 个软件包名称下的 442 个版本;Aikido 稍后报告至少 868 个软件包、1,381 个版本受影响。
一个窃取凭证的 npm 蠕虫最初出现于 keyv@6.0.0,于 2026 年 8 月 4 日扩散至多个组织,跨越 Keyv 与 Cacheable 命名空间,污染了数百个软件包。
SafeDep 已在 npm 注册表中核实 353 个污染版本,涵盖 79 个软件包名称。其监测将更广范围的影响评估为 353 个软件包名称下的 442 个版本,而 Aikido 稍后报告了至少 868 个软件包、1,381 个版本。在报道截止时,两个更广泛的总数据均无法通过完整的公开列表独立复现。
该恶意版本使用预安装脚本(preinstall script)在开发者和持续集成(CI)环境中运行凭证窃取捆绑包。SafeDep 和 Socket 表示,它可窃取代码仓库、软件包注册表、云端以及私钥材料,然后利用可用的 npm 发布权限污染更多软件包。
Keyv 代码仓库还保留了独立的 Claude Code 与 Visual Studio Code(VS Code)钩子,一旦用户信任该工作区或允许项目配置,即可执行载荷。
Socket 表示,任何执行过受影响版本的工作站或 Runner 都应被视为凭证已暴露。SafeDep 建议响应人员在轮换已暴露的令牌和密钥之前,先移除该恶意软件的凭证撤销监听器。
撤销操作就是该监听器的触发条件;若先轮换,可能会运行攻击者提供的本地处理程序。npm 12 默认阻止未经批准的依赖生命周期脚本,但更早版本的 npm 客户端以及其他允许生命周期脚本的安装路径仍然存在暴露风险。
首个已确认的恶意版本为 keyv@6.0.0。该版本将 node setup.mjs 添加为预安装命令,并在软件包中包含 setup.mjs 和 Math_Symbol.js,同时未改动已编译的库代码。
阶段一会检查 Bun,必要时从该运行时的官方 GitHub 发布中下载 1.3.13 版本,然后移交到一个 727,680 字节的已编译捆绑包。
SafeDep 的载荷分析显示,该捆绑包窃取 GitHub、npm、云、Vault、Kubernetes、数据库以及私钥材料。它还会读取 GitHub Actions Runner 内存,安装令牌撤销监听器,并携带 npm 发布机制。Socket 单独解码了用于修改、版本化和重新发布被窃 npm 身份可访问软件包的代码。

注册表变化过快,无法支持一份固定的、仍在 latest 标签下的全活动软件包列表。在 2026 年 8 月 4 日印度标准时间(IST)下午 5:40,npm 软件包页面显示在 SafeDep 初始集合中至少九个软件包已将更早版本恢复为 latest,包括 keyv@5.6.0、flat-cache@6.1.23 和 cache-manager@7.2.9。
由于整个活动无法逐个软件包独立映射,暴露检查必须使用精确的软件包名称、已解析的版本和锁定文件(lockfile),而不是缓存的当前标签列表。
SafeDep 和 Aikido 报告的总数统计的是恶意软件包制品,而非受害系统。它们确立了活动的规模,但并未显示有多少机器安装或执行了该载荷。确定系统级暴露情况需要机器上已解析的精确依赖版本,以及其生命周期脚本是否实际运行。
由于标签会变化、部分相关软件包仍保持干净且完整集合不全,命名空间级黑名单既可能遗漏污染版本,也可能将未受影响的版本误判为已遭入侵。
该代码仓库存在第二条执行路径。其 .claude/settings.json 包含一个 SessionStart 钩子,会调用 .vscode/setup.mjs。.vscode/tasks.json 文件包含一个 Environment Setup 任务,带有 runOn: folderOpen,会调用 .claude/setup.mjs。这些文件为从已检出的代码仓库执行载荷提供了一条路径,但在每个默认环境中并非无条件运行。
VS Code 默认在不受信任的工作区中阻止自动任务,并会进行提示。Claude Code 对仓库提供的项目设置应用工作区信任机制。在 2026 年 8 月 4 日印度标准时间下午 5:40,这些钩子文件在 main 分支上仍然存在。core/keyv/package.json 清单仍声明版本 6.0.0,将 node setup.mjs 保留为预安装命令,并将 setup.mjs 和 Math_Symbol.js 列入发布列表。
被污染的 Keyv 版本携带有效的 OpenID Connect(OIDC)与 Supply-chain Levels for Software Artifacts(SLSA)溯源,因为它通过了该项目合法的 GitHub Actions 发布工作流。证明正确标识了构建流程,但无法证明进入流程的源代码是安全的。
SafeDep 在该活动的其他地方直接 npm 发布账户下发现了相同的载荷。其表示,从时间点和整个命名空间发布爆发情况来看,自动传播最为吻合,尽管初始触发函数未能被恢复。
现有证据无法表明该蠕虫是仅从一个被窃的发布身份传播,还是也涉及单独被入侵的发布者凭证。因此,软件包爆发情况无法确定有多少账户遭到入侵。
来源信息
来源:The Hacker News
原文链接:https://thehackernews.com/2026/08/keyv-linked-npm-worm-poisons-hundreds.html
作者:info@thehackernews.com (The Hacker News)

