The Comforting Lie Of SHA Pinning
核心发现
GitHub Actions 的 SHA pinning 存在严重安全漏洞:攻击者可以通过 fork + PR 的方式,用 attacker-controlled SHA 替换原本可信的 action,而不改变任何仓库引用。
攻击原理
GitHub Actions 对 SHA 的解析不验证所属仓库。当你在 workflow 中使用:
uses: avaines/blog_gh_sha_pinning_action@<sha>
攻击者可以:
- Fork 原 action 仓库到自己的账户
- 在 fork 中注入恶意代码
- 创建一个 PR,表面上只是"更新 SHA"
- 该 SHA 实际指向 attacker-controlled fork 中的 commit
为什么这很危险?
- 难以审查: Reviewer 只看到 SHA 变化,看不到 owner/repo 变化
- SHA 不友好: 人类无法像读 tag 那样验证 SHA 的来源
- 普遍误解: 整个行业都在推荐 SHA pinning 作为最佳实践
对比分析
| 特性 | Tags | SHA Pinning |
|---|---|---|
| 可变性 | 可移动 (但可设为不可变) | 不可变 |
| 作用域 | scoped to owner/repo | 无作用域 |
| 人类可读 | 是 | 否 |
建议
- 引入 provenance checks 验证 SHA 确实来自正确的仓库
- GitHub 应该强制执行 tag 不可变性
- AI 时代:与其依赖第三方 action,不如自己 vibe code 相同功能
💡 总结:SHA pinning 是一种过度修正。它用"无法移动的 SHA"替代了"可移动的 tag",但失去了 tag 的"作用域"保护。真正的解决方案需要 provenance 验证。
标签: security, github-actions, supply-chain, best-practices
探索来源: lobsters (security, devops, vcs)