← 返回信息流
AI 资讯Hacker News·4 小时前

Git哈希链存在可塑性漏洞

原标题:Git Hash Chain Malleability

速览

该问题揭示了Git哈希链的可塑性,攻击者可通过构造特定输入产生哈希碰撞,进而篡改提交记录。这威胁到版本控制系统的数据完整性,尤其影响依赖Git的软件供应链安全。开发团队应评估影响并采取缓解措施。

AI 深度解读

背景

Git 提交签名被广泛信任为一种证据,证明一个提交哈希能够唯一且不可篡改地标识一段特定的已签名内容。然而,一篇由计算机科学和密码学领域提交至 arXiv 的论文(提交日期为 2026 年 7 月 2 日)揭示了这一假设并不成立。该论文题为 "Git Hash Chain Malleability"(Git 哈希链可塑性),指出攻击者无需访问签名密钥,也无需破解 SHA2,即可从任何已签名的提交中构造出第二个不同的提交。这个新提交拥有完全相同的树(tree)、元数据、有效签名,并且在 GitHub 等 Git 平台上会显示“Verified”(已验证)徽章,唯一区别在于其提交哈希值不同。这一修改还会级联地改变所有后续依赖提交的哈希值,因此作者引入了“哈希链可塑性”这一术语来描述该现象。

核心内容

论文证明,Git 签名的哈希链存在可塑性,根源在于构成提交的许多数据表示方式本身具有可塑性。具体地,作者展示了三种可行的篡改路径:

  1. 代数反转(用于 ECDSA 签名):通过将 ECDSA 签名的 s 分量替换为 n - s(其中 n 是椭圆曲线的阶),可以在保持签名有效性的同时改变提交哈希。这种操作在本地验证(git verify-commit)中能够通过。

  2. 结构插入未哈希的 OpenPGP 子包(用于 RSA 和 EdDSA 签名):根据 RFC 4880 第 5.2.3 节,OpenPGP 签名数据包中可以包含未参与哈希计算的子包。攻击者可以在这些子包中插入任意数据,从而改变整个签名数据包的哈希值,而签名本身仍然有效。这种方法同样通过了本地验证。

  3. 非规范 DER 长度重编码(用于 S/MIME 签名):在 CMS(Cryptographic Message Syntax)信封中,利用 X.690 10.1 标准允许的非规范 DER(Distinguished Encoding Rules)长度编码方式,可以改变签名数据的二进制表示,进而改变哈希值,而签名依然有效。

这三种方法中,前两种(代数反转和子包插入)在本地 git verify-commit 中均能通过验证。所有三种方法都能在 GitHub 上生成一个持久的、独立的“Verified”记录。论文还提供了概念验证工具,能够自动化执行这三种篡改路径。

关键要点

  • 核心发现:Git 提交签名无法保证提交哈希的唯一性和不可篡改性。攻击者可构造出一个哈希不同但签名验证通过的“克隆”提交。
  • 无需破解 SHA2:攻击不依赖对 SHA-2 哈希函数的碰撞或原像攻击,而是利用签名算法自身实现中的可塑性。
  • 三种可塑性来源
    • ECDSA 签名的 s -> n - s 代数反转。
    • OpenPGP 未哈希子包插入(适用于 RSA 和 EdDSA)。
    • S/MIME 中非规范 DER 长度重编码。
  • 本地与远程验证均可绕过:前两种方法在本地 git verify-commit 中能通过,所有三种方法在 GitHub 上均能获得“Verified”徽章。
  • 级联影响:修改一个已签名提交会改变其哈希,进而导致所有后续依赖该提交的父子关系链中的哈希值均发生变化,即“哈希链可塑性”。
  • 概念验证工具已提供:论文附带了可自动化执行三种攻击的工具代码。

意义与影响

  • 哈希依赖的安全性受挑战:许多依赖于将提交哈希作为内容可寻址主键的系统都将面临风险,例如基于哈希的提交阻断(hash-based commit blocking)、依赖锁定(dependency pinning)——包括 Nixpkgs、Go modules、GitHub Actions 中的做法,以及可重现构建系统(reproducible-build systems)。
  • 对信任模型的冲击:Git 签名本用于提供不可否认性和完整性保证。该发现表明,即使签名验证通过,提交内容也可能被篡改(尽管树和元数据相同,但哈希不同),破坏了哈希作为唯一标识符的信任基础。
  • Git 平台需重新审视验证逻辑:GitHub 等平台上的“Verified”徽章可能被欺骗,用户无法仅凭此标志判断提交是否被恶意修改过。平台可能需要增强验证方式(例如检查哈希是否与签名内容严格一致)。
  • 工业界与开源社区需采取应对措施:相关系统应避免仅依赖提交哈希作为唯一标识,或需要在签名验证之外附加额外的完整性校验(比如对整条提交链进行更严格的哈希绑定)。论文中提到的 Nixpkgs、Go modules 等依赖锁定机制可能需要额外保护。
查看原文 →arxiv.org