导语:卡内基梅隆大学博士研究生Jacob Ginesin发现,GitHub的”Verified”徽章存在根本性缺陷:给定任意已签名提交,攻击者无需持有签名密钥,即可生成第二个内容完全一致的提交——相同的树、相同的时间戳、仍然有效的签名、仍然显示绿色Verified徽章,唯一不同的是commit哈希。目前GitHub尚未修复此问题,所有依赖commit哈希做内容去重或依赖pinning的系统均受影响。
一、漏洞概述
该漏洞由卡内基梅隆大学博士研究生Jacob Ginesin(同时是Cure53密码审计师)发现,论文发表于arXiv(编号2607.02820,2026年7月2日),并配套发布开源工具git-chain-malleator。
核心问题在于:GitHub将”Verified”徽章解释为”提交由可信作者签名”,但忽略了第二个承诺——commit哈希作为内容的唯一指纹。任何能修改签名字节而保持签名有效的攻击者,都能产生一个新的有效 Verified 提交。
这不是哈希碰撞。SHA-1/SHA-256本身未被攻破,而是签名格式本身具有可塑性,导致同一份代码可以有多份字节不同的”有效表达”。
二、技术分析
2.1 三条签名 malleation 路径
研究披露了三种可使签名发生合法变形的路径,覆盖GitHub支持的所有GPG方案:
ECDSA签名:代数变形(s → n−s)
椭圆曲线代数的基本特性:ECDSA签名由(r, s)值对组成,将s替换为n-s(群阶)后,签名仍完全有效。这一变形既通过本地git verify-commit验证,也通过GitHub的服务器端验证,获得Verified徽章。
RSA和EdDSA签名:OpenPGP子包注入
在签名的”未哈希”区域(签名故意不覆盖的部分,RFC4880 5.2.3)插入额外的OpenPGP子包。签名校验仍通过,但提交字节改变,导致哈希改变。本地和GitHub均接受。
S/MIME(X.509)签名:DER长度非规范重编码
在CMS envelope内的DER编码长度字段(X.690 10.1)中,将长度字段改写为更长但等价的非标准形式。严格的本地gpgsm验证会拒绝,但GitHub仍然标记为Verified。
2.2 根本原因:GitHub不规范化签名
GitHub在验证前不规范化签名字节,接受所有合法的签名变形形式。GitHub对每个commit哈希单独记录Verified状态,不做去重或交叉验证。
推送原始提交和变形版本到两个分支,GitHub的比较视图会显示”1 commit ahead, 1 commit behind”,内容却完全相同。
2.3 哈希链连锁效应
Git的每个提交通过父提交哈希指向前序。由于变形后的提交父指针哈希也变了,所有后代提交的哈希都会被级联更新——即使内容一字未改。工具自动重写整条链并推进分支指针。
三、影响范围
以下系统依赖commit哈希作为内容的唯一句柄,直接受影响:
| 受影响系统 | 风险描述 |
|---|---|
| Nixpkgs | 依赖哈希的包管理,使用commit哈希做内容去重 |
| Go modules | go.sum和依赖pinning信任commit哈希为不可变键 |
| GitHub Actions | workflow中pin commit获取特定版本代码 |
| Docker/OCI refs | 镜像层引用commit哈希 |
| Reproducible builds | 记录体系依赖哈希作为内容地址主键 |
| 供应商安全封锁列表 | 通过commit哈希屏蔽恶意代码 |
攻击场景示例:安全团队发现恶意提交,将其commit哈希加入封锁列表。攻击者利用malleability,用同一份代码生成一个全新的、仍然Verified的提交,轻松绕过封锁。
注意:这不是向代码中注入恶意代码的手段——签名仍然绑定原始作者,文件内容完全相同,文件的哈希仍然是那个哈希(如果内容本身未被修改)。但commit哈希作为”内容不可变标识”的信任模型被彻底打破。
四、修复现状
- 无CVE编号
- 无GitHub官方修复方案
- 无厂商安全公告
Ginesin在论文中标注:该漏洞属于Git托管平台(Git Forge)层面,设计缺陷,修复应由GitHub等平台承担。
五、临时缓解措施
- 在commit哈希之上叠加内容哈希(tree对象哈希或文件内容哈希)作为去重依据
- 下游系统在验证签名后,不将commit哈希作为唯一信任锚点
- CI/CD流水线中加入commit内容一致性校验
- S/MIME用户:本地
gpgsm严格验证可部分拦截DER重编码攻击,但无法防御ECDSA代数变形
六、结论
GitHub的”Verified”徽章不等于”唯一”。签名 malleability 使得同一份代码可以有多个有效的Verified commit哈希。这不是Git的bug,也不是哈希算法的弱点,而是GitHub在”验证签名”与”记录唯一性”之间的逻辑缺失。
在供应链安全日益重要的当下,任何依赖commit哈希作为内容不变标识的系统,都应当重新审视自己的信任模型。
论文原文:https://arxiv.org/abs/2607.02820 POC工具:https://github.com/JakeGinesin/git-chain-malleator














暂无评论内容