Featured image of post 审核 NPM 依赖关系:Snyk 和自动化补丁管理Featured image of post 审核 NPM 依赖关系:Snyk 和自动化补丁管理

审核 NPM 依赖关系:Snyk 和自动化补丁管理

使用审核检查器扫描嵌套 npm 有效负载中的漏洞并集成 Github 自动安全警报。

供应链问题

现代 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 fixGitHub 操作、CLI
依赖机器人npm、pip、Docker 等汽车公关原生 GitHub
装修npm、Docker、自定义自动 PR,可配置的时间表GitHub 应用程序

概括

对于生产项目来说,依赖性审计不是可选的。从本地工作流程中的 npm audit 开始,在 GitHub 上启用 Dependabot 以实现自动化 PR,并将 npm audit --audit-level=high 集成到 CI 管道中。如需更深入的覆盖,请添加 Snyk 以捕获容器和许可证问题。分层方法可确保传递依赖项中的漏洞在到达生产环境之前被捕获。