GitHub 调整了 Dependabot Version Updates 的默认节奏:新版本发布后,不再立即创建升级 Pull Request,而是等待三天。这个“冷静期”给包仓库、维护者和安全社区留出观察窗口,让恶意版本更有机会在进入项目之前被识别和下架。
三天等待解决的是什么问题
自动依赖更新通常遵循一条很直接的链路:上游发布版本,Dependabot 检测到更新,创建 PR,CI 通过后由团队或自动合并策略完成升级。
这条链路追求速度,但也可能把风险一起加速。攻击者一旦窃取维护者账号、接管废弃软件包或向发布流程植入恶意代码,自动化程度较高的项目可能在数小时内拉取问题版本。单元测试和类型检查主要验证功能是否正常,未必能发现安装脚本、数据外传或针对 CI 环境的恶意行为。
默认等待三天,相当于在“版本发布”和“项目开始采用”之间增加一道时间隔离。窗口期内可能发生这些事情:
- 软件包维护者撤回或修复异常版本;
- 包仓库封禁恶意发布;
- 安全研究人员披露可疑行为;
- 依赖扫描工具更新检测规则;
- 其他早期采用者报告回归或供应链风险。
冷静期不能证明一个版本安全,但能降低项目成为第一批受影响者的概率。
它改变的是更新速度,不是安全责任
三天默认等待适合大量常规版本更新,尤其适合启用了自动合并的仓库。不过,团队不能把“已经等待三天”等同于“已经完成安全审查”。恶意代码可能潜伏更久,也可能只在特定操作系统、环境变量或部署阶段触发。
评估这项策略时,需要把几类依赖分开处理:
- 普通功能升级可以接受数天延迟,以换取更大的观察窗口;
- 紧急漏洞修复更看重修复速度,不应机械地等待;
- 核心运行时、构建插件和发布工具具有更高权限,通常值得更长观察时间;
- 内部软件包或可信度较高的固定供应链,可以按团队风险模型调整策略。
还要检查仓库现有的自动合并规则。冷静期只是延后 Dependabot 创建建议的时间;PR 出现之后,如果流水线只跑几分钟测试就自动合并,供应链审查仍然很薄弱。
可以这样配置 Dependabot
默认三天通常不要求仓库修改配置。若需要按项目风险调整等待时间,可以在 .github/dependabot.yml 中显式设置冷静期。下面是一个可改造的 npm 示例,将常规依赖更新的等待时间设为五天,并对不同语义化版本级别使用不同窗口:
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
cooldown:
default-days: 5
semver-major-days: 7
semver-minor-days: 5
semver-patch-days: 3
open-pull-requests-limit: 10
使用前应根据仓库实际情况修改 package-ecosystem、directory 和更新周期。例如,Python 项目可将生态改为 pip,Go Modules 项目可改为 gomod。配置字段是否可用还取决于仓库当前获得的 Dependabot 功能版本,应通过 GitHub 的配置校验结果确认。
提交配置后,可以使用 GitHub CLI 检查 Dependabot PR 的创建时间、目标版本和合并状态:
gh pr list \
--author "app/dependabot" \
--state all \
--limit 20 \
--json number,title,createdAt,mergedAt,url \
--jq '.[] | [.number, .createdAt, (.mergedAt // "not merged"), .title, .url] | @tsv'
运行前需要安装 gh 并执行 gh auth login。这条命令适合用来抽查策略是否生效,也能帮助团队识别“PR 一创建就自动合并”的高风险路径。
把等待时间接入完整的依赖治理
更稳妥的采用方式,是把三天冷静期作为供应链防护的一层,而不是唯一一层。落地时可以检查以下项目:
- 确认哪些仓库启用了 Dependabot Version Updates;
- 盘点 Dependabot PR 的自动合并规则和审批豁免;
- 对构建工具、CI 插件和可执行安装脚本采用更严格策略;
- 在 CI 中保留依赖审查、锁文件检查和安全扫描;
- 为紧急安全修复保留人工快速通道;
- 定期统计更新延迟、失败率和回滚次数,验证等待窗口是否合适。
默认三天是一个偏保守但成本较低的基线。对多数团队而言,它用少量更新延迟换取了更大的外部发现窗口;对高风险系统而言,还应结合更长冷静期、人工审批和依赖来源控制。真正需要优化的不是“越快升级越好”或“越晚升级越安全”,而是让不同类型的依赖按照明确的风险等级进入代码库。