在 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 验证发布者:
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-sandbox 或 vm2 隔离:
const { VM } = require('vm2');
const vm = new VM({ sandbox: { process: fakeProcess }, timeout: 10000 });
vm.runInNewContext(postinstallCode);
- 落地清单:
- CI/CD 钩子:GitHub Actions 前置
npm install --dry-run --sandbox。
- 监控:Prometheus + Falco,规则
proc.name=trufflehog and npm。
- 回滚:
npm ci --force + git clean -fdx。
- Postman 集成:
newman run 前 deps-scan。
- 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.