8 月 5 日,安全公司 StepSecurity 披露,热门 JavaScript 键值存储套件 keyv 的维护者 Jared Wray 的 GitHub 账号遭到入侵,攻击者利用该账号权限向 11 个 npm 包中植入窃取凭证的恶意蠕虫,并在不到 4 小时内扩散至 444 个软件包,共产生 2,212 个恶意版本,影响超过 14 个组织。
被入侵的账号属于 keyv 维护者 Jared Wray。攻击者控制账号后,在 keyv、cacheable 和 ecto 三个 GitHub 项目中植入恶意文件,并创建新版本,借助项目原有的 GitHub Actions 自动构建和发布流程,将包含蠕虫程序的 11 个恶意包上传至 npm 官方仓库,这些包成为后续大规模扩散的起点。
受感染的 11 个软件包包括 keyv、flat-cache、file-entry-cache、cacheable-request、cacheable 以及 cache-manager 等。其中 keyv 是一款键值存储工具,每周下载量超过 1.5 亿次;flat-cache 和 file-entry-cache 的每周下载量也接近 1.5 亿次,并被 ESLint 等常用开发工具间接使用。

恶意软件包会在安装前执行名为 setup.mjs 的程序。该程序先下载合法的 Bun JavaScript 运行环境,随后启动凭据窃取模块,搜索 NPM、GitHub、AWS、Azure、Google Cloud、Kubernetes 以及 HashiCorp Vault 等平台的访问凭证,同时窃取 SSH 密钥、数据库连接信息,以及 Claude、Codex、Cursor 等 AI 开发工具的登录数据。
如果在安装恶意软件包的开发者或企业构建环境中存有 npm 发布凭据,蠕虫便会自动查询该账号拥有管理权限的全部项目,下载已有版本代码,植入自身恶意程序后重新发布恶意版本。这一自动传播机制导致蠕虫进一步扩散至其他 433 个软件包,影响 Deliveroo、Picsart、Qlik 和 ServiceTitan 等组织。由于部分软件包存在多个历史版本,蠕虫针对历史版本打包出大量污染版本,最终共出现 2,212 个恶意版本。
StepSecurity 在披露中建议,开源项目维护者应使用 Passkey 或实体安全密钥保护账号,降低 GitHub Token 权限范围,启用主分支保护和强制代码审查机制。企业端可针对新发布的软件包版本设置 3 至 7 天冷却期,在 CI/CD 环境中限制软件包安装命令和外部网络访问,同时监控新版本中突然出现的可执行文件及安装脚本。
