GitHub Actions SHA Pinning 的安全隐患

security supply-chain github-actions ★★★★☆ · 2026-03-27

核心发现

GitHub Actions 的 SHA pinning 并不像看起来那么安全。研究发现,通过 fork 和特定的 PR,攻击者可以在保持相同 SHA 引用的情况下,用恶意代码替换受信任的 action。

关键问题:GitHub Actions 不验证 SHA 是否属于你指定的仓库。fork 可以共享 commit 对象,使得攻击者可以用自己的 fork 中的 commit 来替换被引用的 action。

攻击原理

  • 攻击者 fork 目标 action 仓库
  • 在 fork 中添加恶意代码
  • 创建 PR,声称只是更新 SHA
  • PR 中的 SHA 实际上指向攻击者 fork 中的 commit
  • 审查者只看到 SHA 变化,无法发现实际来源已改变

为什么这很危险

  • SHA 是内容寻址的,但解析范围不受限于指定仓库
  • 标签是有作用域的(owner/repo),但 commit SHA 不是
  • SHA 不像标签那样人类友好,审查时容易忽略来源验证
  • GitHub 不验证 commit SHA 是否属于你引用的仓库

缓解建议

  • 引入 provenance 检查,验证 SHA 确实来自正确的仓库
  • 使用 tags 并确保仓库启用 "Make tags immutable"
  • 代码审查时不仅检查 SHA 变化,还要验证来源
  • 考虑自托管 runner 以获得更好的控制

相关背景

2026年3月,Trivy 遭遇 typosquatting 攻击,再次提醒我们软件供应链的脆弱性。业界长期以来推荐使用 SHA 代替标签来避免标签可变性风险,但现在看来这个建议本身也存在漏洞。


原文链接