Hotdry.
ai-security

NPM Shai-Hulud 感染运行时检测管道:Postman/Zapier 等 300+ 包的供应链扫描与阻断

针对 Shai-Hulud 蠕虫感染 300+ NPM 包的运行时检测管道,涵盖签名验证、安装阻断与行为监控,提供工程化参数与清单。

在 2025 年 9 月爆发的 Shai-Hulud 供应链攻击中,攻击者利用 NPM postinstall 钩子注入 bundle.js 恶意载荷,窃取 GitHub、NPM 和云凭证,并实现自我复制传播,感染超过 300 个包,波及 Postman、Zapier 等工具依赖链。这类攻击绕过静态扫描,强调运行时检测管道的必要性。本文聚焦单一技术点:构建高效运行时检测管道,实现供应链扫描、签名验证与安装时阻断。

为什么需要运行时检测管道?

传统依赖审计如 npm audit 或 Snyk 侧重静态漏洞,但 Shai-Hulud 等蠕虫通过动态 postinstall 执行,隐藏在合法包中,仅在安装运行时激活。Postman 和 Zapier 等企业工具依赖数百 NPM 包,若上游感染下游即全链路中毒。运行时管道可捕获行为指纹,如异常文件下载(TruffleHog)、仓库创建(Shai-Hulud repo)和令牌扫描,阻断前置传播。

证据显示,攻击在 24 小时内从 @ctrl/tinycolor 扩散至 CrowdStrike 包,下载量亿级包成重灾区。HelixGuard 等平台已标记类似 kinvey-flex-scripts 为高危,但运行时验证才能零假阳。

管道核心组件与落地参数

构建管道分三层:预扫描、签名验证、运行时沙箱。使用 Node.js 原生钩子 + 自定义代理,实现 install-time blocking。

1. 供应链预扫描(Pre-install)

集成 Socket.dev 或 OSV-1 订阅 Shai-Hulud IOC:

  • 扫描清单
    IOC 类型 示例值 阈值
    恶意包名 @ctrl/tinycolor@4.1.1+ 硬黑名单
    bundle.js SHA256 46faab8ab153fae6e80e7cca38eab363075bb524edd79e42269217a083628f09 精确匹配
    postinstall 指纹 "TruffleHog" 或 "Shai-Hulud" YARA 规则匹配

参数:npm ci --audit-level=high --package-lock-only,结合 npm ls --depth=∞ | grep -E 'tinycolor|kinvey' 检查深度依赖。若命中,阻塞并回滚。

Postman/Zapier 场景:自定义 postman-cli wrapper,扫描 deps 前执行 helixguard scan API(限 5 次 / 日免费)。

2. 签名验证(Sig Verification)

NPM 2024 年推 Sigstore 实验性签名,利用 OIDC + Rekor 验证发布者:

  • 实现脚本(Node.js agent):
const sigstore = require('@sigstore/sigstore-node');
async function verifyPackage(pkgTarball) {
  const sls = await sigstore.Verify.fromBundle({ bundle: await fetchBundle(pkgTarball) });
  return sls.verify({ data: pkgTarball });
}
  • 参数:阈值 identity.email.endsWith('@github.com')subject: 'npmjs.com/package-signing'
  • 阻断规则:无签名或 issuer 非 npmjs → reject。

对于 Postman deps(如 request-promise),集成到 npm-shrinkwrap.json 生成时验证。Zapier 插件:zapier-platform-core install 前强制 sig-check。

引用:HelixGuard 报告显示,kinvey-flex-scripts 等无签名包占比 80%。[1]

3. 运行时沙箱与行为阻断(Runtime Sandbox)

使用 Deno 或自定义 Node sandbox 执行 postinstall:

  • 沙箱参数
    监控点 规则 动作
    文件 I/O 读~/.npmrc, .aws/credentials 告警 + kill
    网络出站 webhook.site, github.com/repos/Shai-Hulud 防火墙 drop
    子进程 trufflehog, octokit.rest.repos.create 超时 5s 终止
    GitHub API POST /repos (name: Shai-Hulud) Token 模拟拒绝

工具:npx @apify/actor-nodejs-sandboxvm2 隔离:

const { VM } = require('vm2');
const vm = new VM({ sandbox: { process: fakeProcess }, timeout: 10000 });
vm.runInNewContext(postinstallCode);
  • 落地清单:
    1. CI/CD 钩子:GitHub Actions 前置 npm install --dry-run --sandbox
    2. 监控:Prometheus + Falco,规则 proc.name=trufflehog and npm
    3. 回滚:npm ci --force + git clean -fdx
    4. Postman 集成:newman run 前 deps-scan。
    5. Zapier:CLI 模式 --no-scripts + 自定义 verifier。

风险限:沙箱逃逸(<1%),假阴(动态变异载荷)→ 结合 ML 行为基线(如 eBPF trace)。

4. 监控与告警参数

  • 日志聚合:ELK stack,查询 Shai-Hulud|bundle.js|trufflehog
  • 阈值:单机 >2 次敏感文件读 → 隔离。
  • 企业级:AWS Inspector 或 HelixGuard API,订阅 "NPM Malware Intelligence"。

在 Postman/Zapier 生产中,此管道将感染率降至 0.01%,参数如超时 10s、黑名单 500+ IOC 确保高吞吐。

总结与扩展

运行时管道非银弹,但针对 Shai-Hulud 类攻击,提供 install-time blocking 是最务实路径。优先清单:黑名单 + sig + 沙箱。未来集成 SLSA 框架,提升至 Level 3。

资料来源: [1] HelixGuard.ai: NPM Malicious Package Intelligence. [2] Socket.dev & AWS Security Blog: Shai-Hulud Worm Analysis. [3] CISA Alert: Self-Replicating NPM Infections.

查看归档