GitHub”Verified”签章可被 malleability:同一代码多个有效哈希

导语:卡内基梅隆大学博士研究生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 modulesgo.sum和依赖pinning信任commit哈希为不可变键
GitHub Actionsworkflow中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

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容