← 文章 / 开源项目
Hacker News 7小时前 · 2026-08-05 12:22:49 · 0 阅读

Shai-Hulud 供应链攻击活跃,Keyv 等多个 npm 包遭入侵

博客漏洞与威胁Keyv 等多个包在活跃的 Shai-Hulud 供应链攻击中遭入侵

Keyv 等多个包在活跃的 Shai-Hulud 供应链攻击中遭入侵

作者:Ilyas Makari发布于:2026 年 8 月 4 日

2026 年 8 月 4 日,攻击者入侵了 keyv(一个每周 npm 下载量约 1.27 亿次的键值存储库)维护者的 GitHub 账号,并借此在整个包系列中注入了窃取凭据的蠕虫。同一位维护者还维护着 cacheable(月下载量 2900 万)、flat-cache(月下载量 5.65 亿)、file-entry-cache(月下载量 5.57 亿)以及其他多个广泛使用的缓存工具,全部在同一次攻击中受到波及。

攻击者直接将恶意文件推送到 main 分支,并立刻发布新版本,这意味着被投毒的版本连同由 GitHub Actions 签名的合法 provenance 一起被推送到了 npm。

受影响的包包括:

  • keyv 6.0.0(6.04 亿/月)
  • flat-cache 6.1.24(5.80 亿/月)
  • 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 CEST:该蠕虫已入侵至少 434 个包(涵盖 1381 个版本),受影响包的月度安装量合计超过 20 亿次

事件经过

该系列下的每个包都被新增了两个文件 —— setup.mjsMath_Symbol.js,同时每个 package.json 中都加入了一条 "preinstall": "node setup.mjs" 配置。任何人在受影响的版本上执行 npm installsetup.mjs 都会在安装完成前自动执行。

setup.mjs 是一个高度混淆的加载器,它唯一的任务是从 github[.]com/oven-sh/bun/releases/download/bun-v1.3.13/ 静默下载 Bun JavaScript 运行时,然后用它来执行真正的载荷 Math_Symbol.js

execFileSync(<bun binary>, ['<script_dir>/Math_Symbol.js'], {
  stdio: 'inherit',
  cwd: <script_dir>
})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 runner 上,载荷还会执行一条 shell 命令,直接读取 runner 进程的内存,完整导出其中的密钥存储。它读取 ACTIONS_ID_TOKEN_REQUEST_TOKENACTIONS_ID_TOKEN_REQUEST_URL,窃取用于 npm 发布的 OIDC 令牌。

AWS 凭据

  • ~/.aws/credentials~/.aws/config,解析其中所有命名的 profile
  • 环境变量 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN
  • EC2 实例元数据服务 169.254.169.254,优先尝试 IMDSv2,失败时回退到 IMDSv1
  • ECS 容器元数据端点 169.254.170.2
  • AWS Secrets Manager:在多个区域调用 secretsmanager:ListSecrets,枚举并外泄其中存储的所有密钥

Kubernetes 密钥

/var/run/secrets/kubernetes.io/serviceaccount/ 读取 service account 令牌、CA 证书和命名空间。利用该 service account 令牌直接查询 Kubernetes API,获取该命名空间下的所有密钥。此外还会瞄准 KUBECONFIG~/.kube/config

HashiCorp Vault 令牌

按优先级依次检查六个来源:VAULT_TOKEN 环境变量、~/.vault-token、GitHub Actions runner 路径 /home/runner/.vault-token、若干常见容器路径、利用窃取到的 service account 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_rsaid_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 模式。

数据外传

凭据被收集后,载荷会先将整个数据包加密,然后再向外发送。只有持有对应 RSA 私钥的攻击者才能解密上传内容。这意味着被盗数据虽然明文存放在公开基础设施上,但其他人无法读取。

主要的外传目标是 GitHub 上的公开仓库,其描述中包含字符串 "Shai-Hulud: Here We Go Again"。在撰写本文时,GitHub 上大约有 1,300 个公开仓库匹配该字符串,每个仓库都充当受害者加密凭据包的投放点。

如果 GitHub 上传失败,载荷会回退到 https://npm-cache[.]com:443/router,该域名注册于 2026-05-22,看起来没有任何合法用途。此域名通过以太坊智能合约 0xE1f2395ee43e45A1556EC6438a88c31B83493103 动态获取,使攻击者无需修改载荷就能随时轮换基础设施。

自我复制的蠕虫

除了窃取凭据外,载荷还会主动利用这些凭据将恶意软件传播到其他维护者和仓库。它有两个不同的感染途径。

npm 包体感染

拿到窃取的 npm token 后,payload 会请求 https://registry.npmjs[.]org/-/npm/v1/tokens,列出该 token 有发布权限的所有包,然后逐一拉取并解压当前版本的 tarball。在重新发布之前,它会做以下修改:

  • 将补丁版本号加一(例如 1.2.3 变为 1.2.4
  • 在包脚本中添加 "preinstall": "node setup.mjs"
  • 向包中注入 setup.mjsmath_init.js(与 Math_Symbol.js 功能完全一致)

随后将修改后的 tarball 重新打包并发布到 registry。

这就是蠕虫突破原始维护者范围进行传播的方式。在最初攻陷 keyv 维护者之后,我们观察到超过 400 个包通过社区传播被感染。这些第二代感染可以通过使用 math_init.js 而非 Math_Symbol.js 来识别,因为它们是由 npm tarball 注入蠕虫传播的。

GitHub 仓库感染

当 payload 发现 ghs_ token 时,它会向所有能访问的分支提交恶意代码,每个仓库最多处理 50 个分支,优先选择最近活跃的分支,并跳过 dependabotcopilot 分支。它会向 .claude/settings.json.vscode/tasks.json 添加恶意钩子,这样下次任何开发者在 VS Code 中打开该仓库或在其中启动 Claude Code 会话时,payload 就会自动执行,无需执行 npm install。这些提交的作者署名 claude,邮箱为 claude@users.noreply.github[.]com,提交信息为 chore: update config,与正常提交难以区分。

Aikido 如何检测此类攻击

如果你是 Aikido 用户,请查看你的中央信息流并按恶意软件问题筛选。检测结果会以 100/100 的严重问题呈现。Aikido 每晚会重新扫描,但建议你立即触发一次手动扫描。

如果你还不是 Aikido 用户,可以创建账号并关联你的仓库。我们的恶意软件检测能力包含在免费版中,无需信用卡。

如果需要覆盖整个团队, Aikido 的设备防护可以让你全面掌握团队设备上安装的软件包,并对其进行统一管控。它涵盖浏览器扩展、代码库、IDE 插件以及构建依赖,一站式搞定。在恶意软件安装之前就将其拦截。

如果想要面向未来做好防护,可以考虑使用Aikido Safe Chain(开源)。Safe Chain 无需改变你现有的工作流,它会拦截 npm、npx、yarn、pnpm 和 pnpx 命令,在安装前对照 Aikido Intel 对相关软件包进行检查。

入侵指标(IOCs)

文件

  • setup.mjs
    • SHA-256 54dc7ea54a1317cca0e890a2770630cf7fa6c97813e0cb9d2caa93012b350668
  • setup.mjs(社区传播版本)
    • SHA-256 fd3ca4007b225fdf8de7af4345a19179d5efa8c4bb9205f88cda806e5684b1eb
  • Math_Symbol.jsmath_init.js
    • SHA-256 9fc2570b7cef51c1b8df116d144d11ff4096357be7d2c4c6367cfc2509cf1bcc

网络

  • https://npm-cache[.]com:443/router — 数据外传端点
  • 包含 0xE1f2395ee43e45A1556EC6438a88c31B83493103eth-mainnet.nodereal[.]io 请求

其他

  • 任何描述中包含 "Shai-Hulud: Here We Go Again" 的公开 GitHub 仓库——这些是攻击者控制的、用于窃取凭据的仓库。

分享:

https://www.aikido.dev/blog/keyv-and-friends-compromised-in-npm-supply-chain-attack

文本链接

扫描恶意软件

免费开始4.7/5受够了误报?
和 10 万用户一起使用 Aikido。立即开始获取个性化操作引导

受到 10 万+ 团队的信赖

立即预约扫描你的应用,查找 IDOR 和真实攻击路径

受到 10 万+ 团队的信赖

开始扫描看看 AI 如何对你的应用进行渗透测试

受到 10 万+ 团队的信赖

开始测试立即开始相关文章查看全部2026 年 7 月 31 日·漏洞与威胁

Anthropic 的噩梦:偷走真实密钥的 Claude 包

Anthropic 披露了一个向 PyPI 推送真实恶意软件的智能体。我们找到了这个包,里面的每个错误都指向 AI 本身。

#AI#AI 安全#恶意软件2026 年 7 月 22 日·漏洞与威胁

六小时内发现 NodeBB 的八个高危漏洞

我们的 AI 渗透测试在六小时内发现了 NodeBB 的八个高危漏洞。完整技术解析,涵盖 XSS 攻击链、认证绕过以及帖子劫持。

#AI 渗透测试#漏洞2026 年 7 月 19 日·漏洞与威胁

SleeperGem:RubyGems 供应链攻击瞄准休眠维护者账号

SleeperGem:两个休眠的 RubyGems 维护者账号被劫持,向受信任的 gem 中注入恶意软件,其中一个的总下载量超过 50 万次。

#恶意软件

立即保障安全

在一个统一平台中保护你的代码、云环境和运行时。
自动快速地发现并修复漏洞。

开始扫描预约演示无需信用卡 | 32 秒内出扫描结果。
原始来源: Hacker News

评论 (0)