
今天,Git 项目发布了新版本,以修复六个安全漏洞。这些漏洞包括在递归克隆恶意仓库时执行任意代码、写入非预期文件,以及处理合并或二进制补丁时的内存损坏。
这些修复包含在 Git 2.56.1 中,并已回溯移植到 Git 2.55.1、2.54.1、2.53.1、2.52.1、2.51.3 和 2.50.2。我们建议升级到 Git 2.56.1 或你所使用维护系列中对应的修复版本,并更新任何捆绑了 Git 的应用程序。
Git 中的漏洞
CVE-2026-111760:递归克隆期间的代码执行
Git 在将文件写入工作树之前会检查路径,包括拒绝会覆盖其自身仓库元数据的路径。然而,Git 索引处理中的整数截断可能导致一个极长的路径以一个名称通过校验,随后却以更短的名称被写入。
攻击者可以利用这一差异,将子模块的 .git 文件替换为一个指向包含恶意配置或钩子的目录的符号链接。当 Git 随后使用该目录时,就可能在递归克隆期间执行攻击者控制的代码。
该修复会在极长的索引条目路径的长度被截断之前将其拒绝。
CVE-2026-113408:通过服务器通告的 HEAD 进行路径穿越
当使用 Git 协议 v2 克隆一个空仓库时,服务器可以通告一个指向未出生分支(尚无提交的分支)的 HEAD symref。Git 此前在本地存储该 symref 之前并未校验其目标。
恶意服务器可以提供包含路径穿越组件的名称。在使用 files 引用后端的情况下,后续更新该分支的操作可能会写入预期引用目录之外的位置。
Git 现在会在接受通告的目标之前对其进行校验。该版本还会校验通过协议 v2 接收的其他引用名称和符号引用目标。
CVE-2026-114467:移除签名时的栈损坏
在从消息中剥离 GPG 签名时,Git 假设最多只有两个签名。一条包含两个以上签名的特制消息可能导致 Git 写入超出固定大小栈数组的末尾。
通过合并一个包含两个以上签名的标签即可触发此问题,造成内存损坏并可能导致拒绝服务。代表用户执行此类合并的托管服务也可能受到影响。
该修复移除了固定大小的数组,并能处理带有任意数量签名的消息。
CVE-2026-114469:应用二进制补丁时的越界读取
Git 会拒绝大于约 1 GiB 的补丁,因为其补丁应用代码无法安全处理更大的输入。然而,此检查仅考虑了所提供的补丁大小。
二进制补丁经过压缩和编码,因此一个相对较小的补丁可能扩展到超过该限制。一个特制补丁可以绕过输入大小检查并导致越界读取,使 Git 崩溃。
Git 现在还会在处理二进制补丁之前检查声明的未压缩大小。
CVE-2026-105437:大型合并期间的堆损坏
Git 的合并机制会在写入输出之前计算合并结果所需的内存量。当结果非常大时,该计算可能溢出,包括在大量冲突与较大的 conflict-marker-size 属性相结合时。
溢出可能导致 Git 分配过小的缓冲区,然后写入其边界之外,破坏堆内存。这会影响使用 Git 合并不可信内容的应用程序和托管服务,以及本地合并。
该修复使用大小合适的类型和带检查的算术运算,拒绝输出大小无法安全表示的合并。
CVE-2026-114466:通过 fast-import 流访问文件系统
git fast-import 读取命令流来构建仓库。某些命令可以访问仓库外的文件,因此当它们出现在不受信任的输入流中时,Git 已经会限制它们。
另外三个功能缺乏该保护。rewrite-submodules-from 和 rewrite-submodules-to 功能可以读取任意文件,可能通过错误消息暴露其内容。export-pack-edges 选项可以创建文件或向现有文件追加数据。
现在,除非调用方显式启用 --allow-unsafe-features,否则通过输入流提供这些功能时会被拒绝。仅当你信任生成该流的程序时,才启用该选项。
额外加固
除了这些修复之外,该版本还在检出和树处理期间为相关索引条目分配添加了溢出检查。这些检查补充了上述路径长度限制,防止在 Git 将路径复制到内存之前,分配大小被截断或溢出。
保护 GitHub 用户
- 我们已在 github.com、GitHub Enterprise Cloud 以及带数据驻留的 GitHub Enterprise Cloud 上部署了针对这些漏洞的修复。
- GitHub Enterprise Server 的更新已在 3.19.15、3.20.11、3.21.9 和 3.22.4 版本中提供。我们建议管理员尽快升级。
- 我们正在协调发布 GitHub Desktop 和 GitHub Copilot 应用,它们包含已修补的 Git 版本。
- GitHub Codespaces 和 GitHub Actions 也将获得修补后的 Git 版本。
更新 Git
更新是防范这些漏洞最有效的方式。请从你的操作系统或 Git 发行方安装修补后的版本,并更新自带 Git 副本的应用程序。管理员还应更新自动化和服务所使用的 Git 安装,这些自动化和服务代表用户处理仓库。
如果你无法立即更新,请仅从受信任的服务器克隆,并避免递归克隆不受信任的仓库。避免合并不受信任的内容或标签,或处理来自不受信任来源的二进制补丁或 fast-import 流。这些预防措施不能替代安装修复程序。
获取更新版本的 Git >
标签:
作者
Elijah Newren 是 GitHub 的一名 Staff 软件工程师。他是 merge-ort 的设计者和实现者,自 2.34 起 merge-ort 成为 Git 的默认合并策略;他还是 git-filter-repo 的作者——Git 项目官方推荐的历史重写工具——并且是 sparse-checkout 的重要推动者。