GitHub 发布了工作流锁定文件,旨在缓解供应链攻击——即攻击者将先前安全的版本标签移动到恶意提交上的风险。这一新功能允许开发者在配置文件中保留版本标签(如 `v7.0.1`)的可读性,同时系统会自动强制执行在锁定时与该标签关联的精确提交 SHA。

可变标签的风险

在标准 GitHub Actions 配置中,开发者经常使用标签来引用 Action。然而,由于标签是可变的,如果攻击者将受信任的标签指向新的恶意提交,就可能发生供应链攻击。为了防止这种情况,之前的最佳实践是直接将 Action 固定到完整的 SHA,但这不如人类可读,且手动管理起来更困难。

“锁定文件让您在工作流中保留可读的标签和分支引用,同时运行您锁定的精确提交,即使这些引用发生了变动。”

— GitHub Actions workflow lockfiles are generally available - GitHub Changelog

锁定文件机制的工作原理

新的锁定文件系统弥补了可读性与安全性之间的差距。通过使用 `gh actions-lock` 扩展,开发者可以运行一条命令来扫描工作流并生成机器可读的 `.github/workflows/actions.lock` 文件。此文件将 YAML 文件中使用的易读标签映射到它们所代表的特定提交哈希。

一个显示 gh actions-lock 命令输出的终端窗口,用于固定依赖项。
gh actions-lock CLI 扩展生成机器可读的锁定文件,将易读标签映射到特定的提交哈希。github.blog

这张图片展示了机制部分提到的 gh actions-lock 工具的实际应用。

当工作流执行时,GitHub Actions 会检查锁定文件。如果列出了依赖项,运行器将执行记录的提交,而不是当前标签所指向的任何内容。这确保了正在执行的代码正是锁定过程中经过验证的代码。

自动化与验证

为了随着时间的推移维护这些锁定,GitHub 集成了对 Renovate 和 Dependabot 的支持。当这些工具提交拉取请求以更新版本时,它们会自动重新生成锁定文件中的相应条目。这允许在不破坏锁定安全保证的情况下进行自动化的依赖更新。

GitHub 还建议在 CI 流水线中验证锁定文件。开发者可以使用专用任务运行 `gh actions-lock --verify`,这可确保锁定文件与工作流配置保持同步,且未被损坏或手动篡改。

当前限制与权衡

虽然锁定文件提供了重要的安全层,但它们并不能判断一个依赖项是否本质上是“安全”的;它们仅确保依赖项自锁定以来未发生变化。用户仍被鼓励在将其提交到锁定文件之前审查依赖项。

目前在复杂工作流方面存在技术限制。锁定文件不支持直接锁定可重用工作流或复合操作。复合操作仅通过其调用点进行传递锁定,这意味着单个调用者保持安全,但复合操作本身对于其他潜在调用者仍处于未锁定状态。

Hacker News 读者的反应

  • 技术补充: 一位相关项目的维护者评论指出,当前的锁定文件实现存在局限性,例如不能直接锁定可重用工作流或复合操作。 评论 ↗
  • 质疑: 几位评论者表示担忧,如果 Action 的内部逻辑拉取外部依赖或执行任意 shell 命令,锁定文件可能无法防止恶意行为。 评论 ↗
  • 替代方案: 一位用户建议,与其导入外部 Action,开发者可以把必要的脚本直接复制并粘贴到配置中,以保持完全控制。 评论 ↗

以上为 Hacker News 讨论中观点的摘要,并非经过核实的事实。 阅读完整讨论 ↗