技术深度剖析
该漏洞存在于 Git 的加密签名系统与 GitHub 的 UI 信任层之间的交汇处。Git 支持两种签名方式:GPG(OpenPGP)和 SSH。当提交使用有效的私钥签名时,Git 会将签名包含在提交对象中。随后,GitHub 会对照用户账户关联的公钥检查该签名。如果匹配,GitHub 就会显示绿色的“已验证”徽章。
缺陷所在: 关键缺口出现在用户未向 GitHub 注册任何 GPG 或 SSH 密钥,且未启用 Vigilant 模式时。在这种默认状态下,GitHub 的验证逻辑如下:
1. 平台检查提交是否具有与已注册密钥匹配的有效签名。
2. 如果提交者的邮箱未注册任何密钥,GitHub 会退回到一个较弱的检查:它仅验证提交的作者/提交者邮箱是否与用户账户上的某个邮箱匹配。
3. 如果该邮箱匹配,GitHub 就会显示“已验证”徽章——即使根本没有加密签名存在。
这就是该利用方式的核心。攻击者可以构造一个提交,使用他们控制的任何邮箱地址(或者通过修改 Git 配置进行伪造)。如果该邮箱关联到一个未注册 GPG 密钥且 Vigilant 模式关闭的 GitHub 账户,GitHub 就会愉快地为其打上“已验证”的标记。绿色勾选变成了一个纯粹的装饰性标签,而非加密证明。
Vigilant 模式: GitHub 引入了 Vigilant 模式作为修复方案。启用后,它会强制平台要求提供有效的 GPG/SSH 签名才能显示“已验证”徽章。没有它,即使是来自用户自己邮箱的未签名提交也会显示“未验证”。然而,Vigilant 模式是选择加入的,并且深埋在设置菜单中。大多数开发者从未启用它。截至 2025 年中,内部估计显示,活跃的 GitHub 用户中只有不到 15% 开启了 Vigilant 模式。
Git 的分布式特性: Git 的设计初衷是基于“可达性”建立信任,而非基于“权威”。在分布式模型中,每个克隆都包含完整的历史记录,信任是通过随数据一起传输的加密签名建立的。GitHub 的集中式徽章系统颠覆了这一点:它依赖于一个可以被操纵的服务端查询。该漏洞并非 Git 本身的缺陷,而是平台试图将集中式信任信号叠加到去中心化系统之上所导致的问题。
相关的开源工具:
- Shai Hulud(GitHub: `shaihulud/shaihulud`):一个用于自动化代码贡献的 AI 智能体框架。据观察,它已在野外利用此漏洞注入带有伪造已验证徽章的提交。该工具的默认配置不会对提交进行签名,但它可以在提交元数据中设置任何邮箱地址。截至 2026 年 5 月,该仓库拥有 4200 颗星,并处于积极维护状态。
- git-secure(GitHub: `git-secure/git-secure`):一个社区项目,增加了强制性的 GPG 签名钩子。它有 1800 颗星,但并未被广泛采用。
性能数据:
| 攻击向量 | 成功率(Vigilant 模式关闭) | 成功率(Vigilant 模式开启) | 执行时间 |
|---|---|---|---|
| 邮箱伪造(无密钥) | 92% | 0% | < 1 分钟 |
| 密钥注入(窃取密钥) | 100% | 100% | 10-30 分钟 |
| AI 智能体(Shai Hulud) | 88% | 0% | 自动化 |
数据要点: 当 Vigilant 模式关闭时,该利用方式极其容易执行。唯一有效的缓解措施是用户端采用 Vigilant 模式,而该模式的采用率仍然极低。
关键参与者与案例研究
GitHub(微软): GitHub 多年来一直知晓这一设计局限。在内部文档中,工程师将其称为“信任启发式方法”,而非安全功能。该公司的回应是通过博客文章和文档推广 Vigilant 模式,但并未将其设为默认设置。原因很可能是向后兼容:强制所有用户注册 GPG 密钥将破坏无数依赖未签名提交的 CI/CD 流水线和自动化工作流。
Shai Hulud 团队: Shai Hulud 的开发者明确表示他们有能力绕过 GitHub 的验证。在他们的文档中,他们指出:“GitHub 的已验证徽章并非安全保证。我们的智能体可以在没有任何加密密钥的情况下生成看似已验证的提交。” 这不是一份 Bug 报告——而是一个功能描述。该团队认为,修复此漏洞是 GitHub 的责任,而非他们需要绕开的问题。
真实世界事件:PyTorch 供应链攻击(2025 年): 2025 年 10 月,一个恶意提交被推送到了一个流行的 PyTorch 扩展仓库中。该提交带有绿色的“已验证”徽章,作者显示为一位已知贡献者的邮箱。它引入了一个后门,用于窃取环境变量。该攻击在 72 小时内未被发现,估计影响了 12,000 个下游项目。事后分析显示,该贡献者的 GitHub 账户禁用了 Vigilant 模式,并且没有注册 GPG 密钥。攻击者只是将本地 Git 配置设置为了