供应链问题
现代 JavaScript 应用程序提供了数以万计的传递依赖项。每一个都是潜在的攻击媒介。 event-stream 事件(2018 年)将恶意程序包注入到流行的依赖项中,这表明漏洞可能来自树中的任何位置。在这种规模下,仅依靠人工审核是不可能的。
自动化工具是唯一实用的防御措施。
新项目管理审计
内置 npm audit 命令将您的依赖关系树与已知漏洞的精选数据库进行比较。
npm audit
输出按严重性(严重、高、中、低)分组,包括易受攻击的路径、修补版本和 CVE 参考。
┌───────────────┬────────────────────────────────────┐
│ critical │ Prototype Pollution in lodash │
├───────────────┼────────────────────────────────────┤
│ package │ lodash │
│ patched in │ >=4.17.21 │
│ dependency │ root → express → ... → lodash │
└───────────────┴────────────────────────────────────┘
npm audit fix # auto-update to safe versions
npm audit fix --force # allow breaking changes
在应用之前使用 --dry-run 预览更改。
局限性
npm audit仅涵盖 npm 注册表咨询数据库。它不会扫描所有 CVE 条目,只会扫描 npm 报告和接受的条目。- 对于那些从未在您的上下文中执行易受攻击的代码路径的框架,误报很常见。
- 该命令需要通过网络访问注册表。离线审计需要本地咨询镜像。
Snyk:更深层次的选择
Snyk 不仅扫描 npm,还扫描 package-lock.json、yarn.lock、pnpm-lock.yaml、Docker 镜像和 IaC 模板。它提供了更丰富的 CLI 和 GitHub/GitLab 集成。
npm install -g snyk
cd my-project
snyk auth
snyk test
斯尼克提供:
- 修复 PR — 自动创建更新易受攻击的依赖项的拉取请求
- 许可证合规性 — 标记 GPL/AGPL 软件包以供法律审查
- 容器扫描 — 检测 Docker 镜像中易受攻击的操作系统包
- 可访问的漏洞分析 - 过滤掉您的应用程序从未使用的代码路径中的漏洞
GitHub 依赖机器人
GitHub 的原生 Dependabot 会监视您的存储库中是否有过时且不安全的依赖项。
# .github/dependabot.yml
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 10
Dependabot 自动打开带有版本升级的 PR。每个 PR 都包含变更日志、发行说明和严重性摘要。
CI/CD 管道集成
审计必须自动化。典型的 GitHub Actions 工作流程:
name: Dependency audit
on: [push, pull_request]
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- run: npm ci
- run: npm audit --audit-level=high
将 --audit-level=high 设置为仅在高漏洞或严重漏洞上使构建失败,从而避免低严重性问题的嘈杂失败。
锁文件安全
package-lock.json 文件固定每个传递依赖项的确切版本。如果没有它,npm install 会在安装时解析版本,可能会引入受损的补丁。
- 始终将
package-lock.json提交到版本控制 - 在 CI 中使用
npm ci(而不是npm install)进行确定性安装 - 在审核工作流程中启用锁定文件验证
比较工具
| 工具 | 范围 | 修复机制 | CI 集成 |
|---|---|---|---|
| npm 审计 | npm 注册表建议 | 占位符_0 | 占位符_1 |
| 斯尼克 | npm、Docker、IaC、许可证 | 修复 PR,snyk fix | GitHub 操作、CLI |
| 依赖机器人 | npm、pip、Docker 等 | 汽车公关 | 原生 GitHub |
| 装修 | npm、Docker、自定义 | 自动 PR,可配置的时间表 | GitHub 应用程序 |
概括
对于生产项目来说,依赖性审计不是可选的。从本地工作流程中的 npm audit 开始,在 GitHub 上启用 Dependabot 以实现自动化 PR,并将 npm audit --audit-level=high 集成到 CI 管道中。如需更深入的覆盖,请添加 Snyk 以捕获容器和许可证问题。分层方法可确保传递依赖项中的漏洞在到达生产环境之前被捕获。

