Keyv 及关联库在活跃的 Shai-Hulud 供应链攻击中遭到入侵
摘要
攻击者入侵了 keyv 及相关 npm 缓存库维护者的 GitHub 账户,在多个每月合计安装量超过 20 亿次的包中植入了窃取凭据的蠕虫。
暂无内容
查看缓存全文
缓存时间: 2026/08/04 13:45
# Keyv 及同系列包在活跃的 Shai-Hulud 供应链攻击中遭到入侵
来源:https://www.aikido.dev/blog/keyv-and-friends-compromised-in-npm-supply-chain-attack
2026 年 8 月 4 日,攻击者入侵了 `keyv` 维护者的 GitHub 账户——`keyv` 是一个键值存储库,每周 npm 下载量约 1.27 亿次——并利用该访问权限在整个包系列中注入了一个窃取凭证的蠕虫。同一维护者还拥有 `cacheable`(每月下载量 2900 万)、`flat-cache`(每月下载量 5.65 亿)、`file-entry-cache`(每月下载量 5.57 亿)以及其他多个广泛使用的缓存工具,所有这些包都在同一攻击中被波及。此次入侵方式是直接将恶意文件推送到 `main` 分支,然后立即发布新版本,这意味着被投毒的版本以 GitHub Actions 签名的有效来源证明发布到了 npm。
**受影响的包包括:**
- `keyv` 6.0.0(每月下载量 6.04 亿)
- `flat-cache` 6.1.24(每月下载量 5.8 亿)
- `file-entry-cache` 11.1.6(每月下载量 5.71 亿)
- `cacheable-request` 13.0.20(每月下载量 1.37 亿)
- `cacheable` 2.5.1(每月下载量 3000 万)
- `@cacheable/memory` 2.2.1(每月下载量 2800 万)
- `cache-manager` 7.2.10(每月下载量 1600 万)
- `@cacheable/node-cache` 3.1.2(每月下载量 600 万)
- `@cacheable/utils` 2.5.1(每月下载量 3400 万)
- `@cacheable/net` 2.1.1(每月下载量 3700)
- `ecto` 5.0.1(每月下载量 4500)
我们还看到这种供应链蠕虫在社区中非常活跃地传播到其他维护者和包,包括一些大型组织:
- `@deliveroo/reevent` 1.0.1
- `@or-sdk/invitations` 1.4.9
- `@picsart/ai-sdk` 3.32.2
- `@qlik/embed-runtime` 1.6.4
- `picasso.js` 2.11.6
**更新 — 2026 年 8 月 4 日,欧洲中部夏令时 13:37:** 该蠕虫已至少入侵 868 个包(涉及 1381 个版本),在撰写本文时这些包的总月下载量超过 **20 亿次**。
## 发生了什么
该系列中的每个包都收到了两个新文件 `setup.mjs` 和 `Math_Symbol.js`,并且在每个 `package.json` 中添加了一个 `"preinstall": "node setup.mjs"` 条目。任何针对受影响版本运行 `npm install` 的人,都会在安装完成前自动执行 `setup.mjs`。
`setup.mjs` 是一个高度混淆的投放器。它唯一的任务是静默地从 github[.]com/oven-sh/bun/releases/download/bun-v1.3.13/ 下载 Bun JavaScript 运行时,并用它来执行真正的有效载荷 `Math_Symbol.js`:
```
execFileSync(, ['/Math_Symbol.js'], { stdio: 'inherit', cwd: })
```
`Math_Symbol.js` 是一个高度混淆的 728 KB JavaScript 文件,其中包含凭证窃取程序,会从受害者的环境中收集机密信息,加密后外传到描述为“**Shai-Hulud: Here We Go Again**”的公共 GitHub 仓库。该有效载荷还包含类似蠕虫的传播功能,用于感染安装了其中一个受影响包的其他维护者的包。
## 它窃取什么
`Math_Symbol.js` 文件实现了一组凭证提取器,每个针对受害机器上的不同机密存储。
**npm 令牌**
读取 `~/.npmrc` 并扫描文件系统中其他所有 `.npmrc` 文件。提取 `authToken` 值以及任何 `//registry.*:_authToken=...` 条目。在外传之前,会针对 `registry.npmjs[.]org/-/whoami` 实时验证每个令牌。
**GitHub 令牌**
针对三种令牌格式:经典 PAT(`ghp_...`)和 OAuth 令牌(`gho_...`)、GitHub App 服务器到服务器令牌(`ghs_...`)以及 JWT OIDC 令牌。来源包括 `~/.config/gh/hosts.yml`、环境变量以及文件系统扫描。在 GitHub Actions 运行器上,有效载荷还会执行一个 shell 命令,直接读取运行器进程内存以转储整个机密存储。它会读取 `ACTIONS_ID_TOKEN_REQUEST_TOKEN` 和 `ACTIONS_ID_TOKEN_REQUEST_URL` 以窃取用于 npm 发布的 OIDC 令牌。
**AWS 凭证**
- `~/.aws/credentials` 和 `~/.aws/config`,解析所有命名配置文件
- `AWS_ACCESS_KEY_ID`、`AWS_SECRET_ACCESS_KEY` 和 `AWS_SESSION_TOKEN` 环境变量
- 位于 `169.254.169.254` 的 EC2 Instance Metadata Service,先尝试 IMDSv2,再回退到 IMDSv1
- 位于 `169.254.170.2` 的 ECS 容器元数据端点
- AWS Secrets Manager,跨多个区域调用 `secretsmanager:ListSecrets` 以枚举并外传存储在那里的所有机密信息
**Kubernetes 机密信息**
从 `/var/run/secrets/kubernetes.io/serviceaccount/` 读取服务账户令牌、CA 证书和命名空间。使用服务账户令牌直接查询 Kubernetes API,并检索命名空间中的所有机密信息。同时针对 `KUBECONFIG` 和 `~/.kube/config`。
**HashiCorp Vault 令牌**
按优先级顺序检查六个来源:`VAULT_TOKEN` 环境变量、`~/.vault-token`、GitHub Actions 运行器路径 `/home/runner/.vault-token`、多个常见容器路径、使用窃取的服务账户 JWT 进行 Kubernetes 认证登录,以及使用窃取的 AWS 凭证访问 Vault 的 AWS IAM 认证端点。获取令牌后,它会通过 `/v1/sys/mounts` 枚举所有 KV 存储,并从 KV v1 和 v2 路径读取每个机密信息。
**Stripe 和 Slack 令牌**
扫描文件系统扫描器触及的所有文件,查找 Stripe API 密钥(测试和正式密钥,前缀为 `sk_` 和 `pk_`)以及 Slack 令牌(`xox[baprs]-...`)。
**通用文件系统扫描**
一个平台感知型扫描器(macOS 与 Linux)会在文件系统上运行约 200 个 glob 模式,目标包括:
- `.env`、`.env.*` 和 `.envrc` 文件
- 私钥文件(`*.pem`、`*.key`、`*.p12`、`*.pfx`、`*.jks`)
- SSH 密钥和配置(`id_rsa`、`id_ed25519`、`.ssh/config`)
- Terraform 状态文件和 `.tfvars`
- Docker 注册表凭证文件(`docker/config.json`)
- KeePass 数据库(`*.kdbx`)
- VPN 配置(`*.ovpn`)
- IDE 配置文件,包括 `.vscode/tasks.json` 和 `.claude/settings.json`
超过 5 MB 的文件会被跳过。最多使用 64 个并发读取。还会应用一个通用正则表达式引擎处理所有扫描到的文件,标记 PEM 私钥、SSH 公钥、Azure 存储密钥、包含内嵌凭证的数据库连接字符串,以及匹配常见机密字段名的通用 `key=value` 模式。
## Aikido 如何检测此攻击
如果你是 Aikido 用户,请查看你的中央信息流并筛选恶意软件问题。这将显示为 100/100 的关键问题。Aikido 每晚重新扫描,但我们建议立即触发手动重新扫描。
如果你还不是 Aikido 用户,你可以[创建账户](https://app.aikido.dev/login)并连接你的代码仓库。我们的恶意软件覆盖包含在免费计划中,无需信用卡。
为了在整个团队范围内获得更全面的覆盖,Aikido 的 [Device Protection](https://www.aikido.dev/protect/device-protection) 可以让你直观查看并控制团队设备上安装的软件包。它涵盖浏览器扩展、代码库、IDE 插件和构建依赖,全部集中在一个地方。在恶意软件被安装之前阻止它。
为了未来的保护,可以考虑 [Aikido Safe Chain](https://github.com/AikidoSec/safe-chain)(开源)。Safe Chain 位于你现有的工作流程中,拦截 npm、npx、yarn、pnpm 和 pnpx 命令,并在安装前对照 [Aikido Intel](https://intel.aikido.dev/) 检查包。
相似文章
Mini Shai-Hulud再次来袭:314个npm包遭入侵
npm账户'atool'被入侵,导致317个包中发布了637个恶意版本。该载荷窃取凭据,通过AI编码工具和系统服务建立持久化,并通过GitHub外泄数据。
数十个Red Hat软件包通过其官方NPM渠道被植入后门
数十个Red Hat软件包通过该公司官方NPM渠道被植入后门,攻击者利用Shai-Hulud蠕虫通过GitHub Actions OIDC入侵了Red Hat的CI/CD管道。Red Hat已移除恶意软件包,并声明它们仅用于内部,但此次攻击凸显了日益升级的供应链风险。
数周内第二次,微软软件包被植入凭据窃取器
数周内第二次,微软已验证的开源软件包被植入了凭据窃取恶意软件,影响GitHub上的73个软件包。该攻击与威胁行为者TeamPCP有关,利用被盗的OIDC令牌,并通过云基础设施横向传播。
@tan_stack: 安全公告 —— TanStack npm 包遭遇供应链攻击,影响 42 个 @tanstack/* 包(共 84 个版本……
一次高危供应链攻击影响了 42 个 TanStack npm 包,导致云凭证和 SSH 密钥被窃取。建议用户在攻击时间窗口内安装过相关包的,立即轮换凭证并从干净的 lockfile 重新安装。
@altryne: 公开提醒:如果你尚未了解最新的供应链攻击,或者知道但无动于衷且未采取任何措施,尤其是……
一则关于通过 npm 和 PyPI 针对 AI 开发者工具(Hermes、OpenClaw)的供应链攻击的公开提醒,特别是名为“Mini-Shai Hulud”的蠕虫病毒,它能自我复制并窃取凭据、API 密钥和浏览器会话。文章建议使用沙盒执行并限制软件包年龄以降低风险。