HackerNews

HackerNews
Keyv 关联的 npm 蠕虫毒化数百个包,植入 Claude Code 和 VS Code 钩子

Keyv 关联的 npm 蠕虫毒化数百个包,植入 Claude Code 和 VS Code 钩子

给文章评分:

一个窃取凭证的 npm 蠕虫首次出现在 keyv@6.0.0 中,并于 2026 年 8 月 4 日从 Keyv 和 Cacheable 命名空间扩散到多个组织的数百个包中。
SafeDep 在 npm 注册表中验证了 79 个包名下的 353 个被毒化版本。其监测将更广泛的覆盖范围定为 353 个包名下的 442 个版本,而 Aikido 后来报告称至少有 868 个包、1,381 个版本。在报告截止时,这两个更广泛的数字均无法从完整的公开列表中独立复现。
该恶意版本使用 preinstall 脚本在开发者和持续集成(CI)环境中运行一个窃取凭证的捆绑包。SafeDep 和 Socket 表示,它可以收集仓库、包注册表、云服务和私钥材料,然后利用可用的 npm 发布权限来毒化更多包。
Keyv 仓库还保留了独立的 Claude Code 和 Visual Studio Code(VS Code)钩子,一旦用户信任工作区或允许项目配置,这些钩子即可执行有效载荷。
Socket 表示,任何执行了受影响版本的工作站或运行器都应被视为凭证已泄露。SafeDep 建议响应者在轮换暴露的令牌和密钥之前,先移除恶意软件中的凭证撤销监视器。
撤销操作正是该监视器的触发条件;先轮换可能会运行攻击者提供的本地处理程序。npm 12 默认阻止未经批准的依赖生命周期脚本,但较早的 npm 客户端以及允许生命周期脚本的其他安装路径仍然暴露在风险中。
第一个被确认的恶意版本是 keyv@6.0.0。它在 preinstall 命令中添加了 node setup.mjs,并在包中包含了 setup.mjs 和 Math_Symbol.js,同时保留了未更改的编译库代码。
第一阶段检查是否存在 Bun,如果需要则从该运行时的官方 GitHub 发布版下载 1.3.13 版本,然后将控制权移交给一个 727,680 字节的编译捆绑包。
SafeDep 的有效载荷分析称,该捆绑包收集 GitHub、npm、云服务、Vault、Kubernetes、数据库和私钥材料。它还会读取 GitHub Actions 运行器内存,安装一个令牌撤销监视器,并携带 npm 发布机制。Socket 单独解码了用于修改、版本控制和重新发布可通过被盗 npm 身份访问的包的代码。
注册表变化太快,无法支持一个固定的、仍标记为 latest 的完整活动包列表。在 2026 年 8 月 4 日印度标准时间(IST)下午 5:40,npm 包页面显示,SafeDep 初始集合中的至少九个包(包括 keyv@5.6.0、flat-cache@6.1.23 和 cache-manager@7.2.9)已将较早版本恢复为 latest。无法逐包独立映射整个活动,因此暴露检查必须使用确切的包名、已解析的版本和 lockfile,而不是当前标签的缓存列表。
SafeDep 和 Aikido 报告的总数统计的是恶意包制品,而非受害系统。它们确定了活动的规模,但并未显示有多少台机器安装或执行了有效载荷。确定系统级暴露需要知道机器上解析的确切依赖版本以及其生命周期脚本是否运行。
由于标签不断变化、某些相关包保持干净且完整集合不完整,基于命名空间的阻止列表既可能遗漏被毒化的版本,也可能将未受影响的版本视为已受损。
该仓库存在第二条执行路径。其 .claude/settings.json 包含一个 SessionStart 钩子,用于调用 .vscode/setup.mjs。.vscode/tasks.json 文件包含一个带有 runOn: folderOpen 的 "Environment Setup" 任务,用于调用 .claude/setup.mjs。这些文件创建了一条从已检出仓库执行有效载荷的路径,但它们不会在每个默认环境中无条件运行。
VS Code 在不受信任的工作区中阻止自动任务,并默认在允许之前提示用户。Claude Code 对仓库提供的项目设置应用工作区信任。在 IST 时间 8 月 4 日下午 5:40,这两个钩子文件仍然存在于 main 分支上。core/keyv/package.json 清单仍声明版本为 6.0.0,保留 node setup.mjs 作为其 preinstall 命令,并将 setup.mjs 和 Math_Symbol.js 列为发布文件。
被毒化的 Keyv 版本携带有效的 OpenID Connect(OIDC)和 SLSA 出处证明,因为它通过了该项目合法的 GitHub Actions 发布工作流。该证明正确标识了构建过程,但无法确定进入该过程的源代码是否安全。
SafeDep 在活动中其他直接通过 npm 发布账户的地方发现了相同的有效载荷。它表示,自动传播最符合时间线和整个命名空间的发布爆发特征,但未恢复初始触发函数。
证据无法表明该蠕虫是仅从一个被盗的发布身份传播,还是涉及了另外被入侵的发布者凭证。因此,包爆发无法确定有多少账户被入侵。
植入了 Claude Code 和 VS Code 钩子的提交带有绿色的 GitHub 已验证徽章,并将 github-actions[bot] 列为作者。已验证徽章表明该提交的签名是有效的,而 SafeDep 表示其作者字段被设置为 github-actions[bot];这两个事实均无法确定谁控制了提交该提交的凭证。
出处证明和提交记录共同验证了构建和签名路径,但无法确定源代码是否安全,也无法确定谁控制了凭证。
并非所有与原始维护者相关的包都被毒化。SafeDep 表示,已发布的 @keyv/* 适配器和 Keyv 5.x 系列是干净的。仓库本身是一个独立的风险:后续的一个提交在所有 19 个工作区包中暂存了有效载荷文件,因此从仍被毒化的树中切出的发布版本将携带这些文件。
Semgrep 记录了在 4 月份 lightning PyPI 包被入侵事件中相同的 Claude Code 和 VS Code 钩子、setup.mjs 文件名以及 Bun 1.3.13 下载。Aikido 将 8 月的活动归入 Shai-Hulud 家族。这种重叠支持恶意软件家族关联的结论。但这并不能确定 8 月活动的操作者是谁;初始访问路径和具名行为者均未知。
在报告截止时,未找到来自维护者、npm 或 GitHub 的公开事件声明。
更新 - 2026 年 8 月 4 日: SafeDep 已将其基于注册表的计数扩大到 9 个组织相关的 420 个包名下的 1,684 个被毒化版本,取代了上述引用的较早快照。该公司表示,该蠕虫每两到七分钟在组织之间移动一次,并在大约半小时内完成了跨组织的发布爆发。Aikido 的单独计数在包名上更高,但在版本数上更低,因此这两个数字不应合并。
SafeDep 表示,被毒化的 Keyv 和 Cacheable 版本此后已被取消发布,但在其更新时,大多数其他受影响包名的 latest 版本仍解析为恶意版本。因此,仅升级可能仍会保留暴露风险。
团队应将 lockfile 和已解析版本与受影响包列表进行比对,禁用不必要的安装脚本,并将执行了受影响版本的环境视为已受损。
研究人员还统计到,8 月 4 日创建的 546 个公共 GitHub 仓库,其描述为 "Shai-Hulud: Here We Go Again" 并包含一个 results/ 目录。这些仓库是潜在的窃取或暂存制品,而非 546 个已确认的受害者。在最新检查中,Keyv 仓库的 main 分支上仍包含 .claude 和 .vscode 目录,包括与上述独立 Claude Code 和 VS Code 执行路径相关的文件。


消息来源:thehackernews.com
本文由 HackerNews.cc 翻译整理,封面来源于网络;
转载请注明“转自 HackerNews.cc”并附上原文
分享到:
hackernews

hackernews

该作者暂无简介