← 中文资源

简体中文版本

在 PR 阶段阻断有漏洞的依赖变更

在每次 Pull Request 上运行 GitHub 依赖审查,当新增依赖带来已知漏洞或被禁止的许可证时直接失败,避免合并后才暴露。

阅读英文原文

概述

依赖事故大多来自很小的改动:一次版本升级、一个新加入的开发工具,或被间接引入的传递依赖。对整棵依赖树做全量审查既慢又吵,而审查本次 diff 既快又能直接行动。GitHub 依赖审查会比较 base 与 head 的依赖图,把新增的漏洞包与许可证变化直接评论在 Pull Request 中,作者无需跳转页面就能看到问题。

步骤

  1. 配置依赖审查动作与严重级别、许可证策略:
permissions:
  contents: read
  pull-requests: write
steps:
  - uses: actions/checkout@v4
  - uses: actions/dependency-review-action@v4
    with:
      fail-on-severity: high
      deny-licenses: GPL-3.0, AGPL-3.0
  1. 在临时分支上安装一个已知存在漏洞的版本,验证门禁会失败:
npm install [email protected]
git commit -am 'test dependency gate'
git push
  1. 验证只改锁文件的更新也会被审查:
npm update --package-lock-only
git commit -am 'refresh lockfile'
git push
  1. 在分支保护中把该检查设为必需,确保合并必须等待它通过。

验证

预期 Pull Request 检查失败,并评论出问题包、advisory 编号与修复版本;只更新锁文件时同样会产生差异报告,若引入新的漏洞版本也会失败。分支保护生效后,合并按钮应保持禁用直到检查通过。若检查完全没有出现在 PR 上,先确认仓库已启用依赖图,以及工作流拥有 pull-requests: write 权限。

注意事项

  • 只审查本次 PR 引入的变化,历史遗留的漏洞依赖仍需要单独的升级计划。
  • 覆盖范围取决于 GitHub 的 advisory 数据库,可能落后于上游披露。
  • 需要接受的风险应记录为带到期时间的例外,而不是把门禁改为 warn-only。
  • 不支持的清单格式不会产生差异,这类生态需要额外的扫描任务。
  • Fork 与 Dependabot 触发的运行权限受限,需要单独确认行为。