Skip to content
返回维护与 LTS

供应链安全

防御恶意包、域名抢注、账户接管和 npm install 的自伤。

为什么

每次 npm install 以你的权限运行任意 postinstall 脚本 — 被攻陷的包可偷 env 变量、外泄源码或挖矿。2021-2024 的供应链攻击(ua-parser-js、event-stream、coa、rc)表明这不是理论:维护者账户被钓鱼,新版本带恶意软件,数小时内数千 CI 流水线运行它。你无法消除此风险但可大幅缩小:锁文件钉死安装内容、允许列表阻止未知包、出处(SLSA)验证制品匹配源、禁用脚本移除执行向量。纵深防御是唯一 sane 姿态。

何时使用

持续 — 做成 CI 门控而非季度检查。每次加新依赖时 revisit。

如何做

1. 提交锁文件(钉确切版本 + 完整性哈希 — npm ci 不装被篡改的 tarball)
2. 默认禁用安装脚本:npm config set ignore-scripts true;仅允许列表中的可信包
3. 用允许/拒绝列表:npm config set @scope:registry 或 socket.dev / npm-audit-resolver 等工具
4. 验证出处:优先有 SLSA 出处的包(npm v9+ 显示 "provenance" 徽章)
5. 每 PR 扫描:CI 中 OSV-Scanner 或 Snyk,high/critical 失败
6. 优先维护者 npm 账户开 2FA、活跃维护、所有者清晰的包
7. 高价值依赖:钉确切版本 + 完整性哈希,生产绝不用浮动范围

示例

# .npmrc — 禁用脚本,允许列表可信
ignore-scripts=true
# 仅对可信包重新启用脚本:
enable-scripts-for=@trusted-scope/*

# CI 供应链门控(GitHub Actions)
- name: OSV-Scanner
  run: npx @google/osv-scanner --lockfile package-lock.json
- name: Socket
  run: npx socket-security  # 对安装脚本、网络访问、eval 告警

# 验证出处(npm v9+)
npm install lodash --provenance
# 检查:npm view [email protected] dist.attestations

# 在 package.json 中钉死高价值依赖 + 完整性哈希
"dependencies": {
  "express": "4.18.2"  # 钉确切,非 ^4.18.2
}
# 锁文件加:"integrity": "sha512-..." 使 npm ci
# 拒绝安装不匹配哈希的 tarball。

常见问题

  • ⚠生产依赖用 ^ 或 ~ 范围 — 传递升级可不改你任何东西拉入被攻陷版本。
  • ⚠忽视安装脚本风险 — 包的 postinstall 可运行任何东西;多数团队从不审计哪些包有。
  • ⚠因周下载 1000 万而信任包 — 流行使其成更大目标而非更安全。

最佳实践

  • ✓生产钉确切版本并依赖锁文件完整性哈希 — npm ci 拒绝任何被篡改 tarball。
  • ✓全局禁用安装脚本,仅允许列表中确实需要的少数可信包。
  • ✓每 PR 跑 OSV-Scanner 或 Snyk 作 CI 门控 — 供应链防御必须持续而非季度。