← 最新论文
💻 computer science

Git Hash Chain Malleability

本文表明 Git 提交哈希值是可篡改的,通过利用 ECDSA 的代数反转、未哈希的 OpenPGP 子数据包插入以及非规范的 DER 长度重编码,攻击者能够生成具有相同内容、有效签名和“已验证”徽章的不同提交,从而破坏了基于哈希的依赖锁定和可重现构建的安全假设。

原作者: Jacob Ginesin

发布于 2026-08-07
📖 1 分钟阅读☕ 轻松阅读

原作者: Jacob Ginesin

原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明

想象一下,互联网是一个巨大的、全球性的图书馆,每一本书、每一份食谱、每一本说明书都存储在一个数字保险库中。为了保持这个图书馆井然有序,每一件物品都会获得一张由特殊代码制成的唯一身份卡。在软件开发的世界里,这个系统被称为 Git。把“提交”(commit)想象成项目在特定时刻的一个快照——就像为你刚刚搭建好的乐高城堡拍一张照片。为了确保没有人偷偷溜进来把一块积木换成塑料块,开发者可以用数字印章为他们的照片“签名”,就像在信件上盖上蜡封一样。这个印章证明了:“是的,这是我建造的,而且没有人改动过它。”

这个系统背后的核心理念是通过唯一性建立信任。如果你拥有照片的唯一 ID 代码,你就应该能够找到那张完全相同的照片,并知道它未被篡改。这就像是在说:“如果 ID 卡上写着‘城堡 A’,那么世界上只有‘城堡 A’符合这个描述。”这种信任非常强大,以至于计算机使用这些 ID 代码来自动检查软件是否安全,以锁定特定的代码版本防止其损坏,并证明究竟是谁构建了什么。如果 ID 代码是唯一且不可更改的,整个系统就会像一台运转良好的机器一样高效。但如果有人能拿走一张完美的、带有签名的照片,只需稍微修改一下蜡封,就能得到一个全新的 ID 卡,而这张新卡依然能证明照片是真的,那会发生什么呢?这正是本文所探讨的问题。


数字身份的大调包

在这篇论文中,研究员 Jacob Ginesin 发现了一个诡计,它打破了 Git 中“一图一码”的规则。他展示了攻击者无需窃取秘密签名密钥,也无需破解数字印章背后的数学原理,就能为同一份软件创建第二个、完全不同的 ID 卡

这就是这个魔术技巧:攻击者拿走一个已签名的提交(一张带有蜡封的照片),并对印章进行微调,使其在计算机眼中看起来不同,但在人类看来意思完全一样。这就像是改变了蜡封的形状,或者在同一张纸上用不同的字体书写同样的信息。照片的内容完全没有改变——乐高城堡依然是原封不动。印章依然证明了作者的身份。但由于印章的“外观”发生了变化,计算机便为它生成了一个全新的 ID 卡。

可怕之处在于:检查这些 ID 的系统(如 GitHub)会说:“嘿,这个印章是有效的!这是一个经过验证的提交!”并给它贴上一个闪亮的绿色“已验证”(Verified)徽章。现在,你拥有了两个不同 ID 卡的同一个乐高城堡。一个叫“城堡 A”,另一个叫“城堡 B”。两者都由同一个人签名,且都被标记为“已验证”。

戏弄系统的三种方式

论文解释了根据使用的数字印章类型,进行这种戏弄的三种不同方式:

  1. 数学翻转(针对 ECDSA): 想象一条数轴,你有一个数字,比如 5。在这种特定的数学游戏中,数字 5 和“总数减去 5”实际上是同一个东西。攻击者只需翻转印章上的数字。它看起来不同,但在数学上它仍然是一个有效的签名。
  2. 隐藏便条(针对 RSA 和 EdDSA): 想象一封密封的信件。印章覆盖了主信息,但在背面有一个没被密封的小口袋。攻击者在那个口袋里塞进了一张微小的、无害的便条。主信息未受影响,印章依然有效,但信件现在的重量和形状略有变化,从而改变了 ID 卡。
  3. 花式字体(针对 S/MIME): 想象写下一个数字,比如“32”。你可以写成“32”,也可以写成“0x20”。两者意思相同,但一个是“标准”写法,另一个是“花式”写法。检查信件的计算机(GitHub)比较宽容,接受这种花式写法;但一个更严格的计算机(你的本地笔记本电脑)可能会感到困惑,并说:“等等,那不是标准写法!”

为什么这很重要:“幽灵”问题

你可能会想:“那又怎样?既然城堡是一样的,谁在乎 ID 卡是否不同呢?”但在数字世界里,ID 卡本身就是城堡。

  • 保镖问题: 想象一个俱乐部的保镖手里有一份黑名单 ID。如果你被禁入了,你就进不去。但如果攻击者为同一个人创建了一个不在黑名单上的“幽灵 ID”,保镖就会放行。攻击者可以通过更改 ID 卡,让恶意代码绕过安全过滤器。
  • 镜像问题: 想象两面相对的镜子。一面显示真实的城堡;另一面显示一个名为“幽灵城堡”的副本,它看起来一模一样但名字不同。如果你看向错误的镜子,你可能以为自己看到的是原始版本,但实际上你看到的是攻击者控制的副本。
  • 断裂的链条: 因为在链条中的每一个新乐高城堡都是建立在之前那个城堡之上的,所以改变一个城堡的 ID 会改变之后所有建筑的 ID。这创造了一个历史的“分叉”。你会得到两条平行的时间线:一条拥有原始 ID,另一条拥有幽灵 ID。两者看起来都是真实的,也都经过了签名,但它们是不同的。

结论

论文证明了提交哈希值上的“已验证”徽章并不能作为内容的唯一保证。这就像是在护照上盖了一个“已验证”印章,它并不保证你就是那张脸的唯一拥有者,它只保证印章是真的。

作者开发了一个工具,可以对任何已签名的提交执行这个技巧。他在 GitHub 上进行了测试,该网站欣然接受了这些“幽灵”提交,并为它们颁发了自己的“已验证”徽章。这意味着依赖这些 ID 卡来拦截坏人、锁定软件版本或证明构建者身份的系统是脆弱的。解决办法不是停止签名,而是要确保检查印章的计算机足够严格,能够说出:“不,那不是我们之前看到的那个完全相同的印章”,并且要检查实际的内容,而不只是检查 ID 卡。

简而言之,一个已签名的提交是一个承诺,但论文表明,这个承诺可以被以一种创造出其“幽灵”版本的方式来书写,从而欺骗那些旨在保护我们的系统。

您所在领域的论文太多了?

获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。

试用 Digest →