Translated message

A translation of this page exists in English.

Git 中的整数截断及溢出漏洞(CVE-2016-2315,CVE-2016-2324)

Red Hat 产品安全团队在 Git 中发现可导致基于堆的缓冲区溢出,并进而造成远程代码执行的漏洞,即整数截断漏洞(CVE-2016-2315)和整数溢出漏洞(CVE-2016-2324)。

概述

Git 使用特殊格式在服务器和客户端之间交换存储库信息,也称 packfile 格式。

攻击者可以生成特制的 packfile,将其发送给有漏洞的服务器或客户端后,处理此文件就可能会触发整数截断或溢出,并最终造成内存崩溃。

背景

Git 是一个使用分散架构的分布式版本控制系统。不同于使用“客户端-服务器”模式的集中版本控制系统,Git 可保证 Git 存储库的每个工作副本都是拥有完整版本记录的精确复制版本(exact copy)。这不仅可以让用户在开发项目或作出贡献时不需要可将更改推入项目官方存储库权限,而且还可让用户在没有网络连接的情况下工作。

受影响的版本

Red Hat 已发布且提供支持的用于 Red Hat Enterprise Linux 及 Red Hat Software Collections 的 Git 版本均会受到影响,后面的《解决方案》部分列出了受影响的产品。另外,版本 2.4.11、2.5.5、2.6.6 及 2.7.4 之前的所有 Git upstream 版本也都会受这个漏洞的影响。

攻击描述及影响

造成这些漏洞的根本原因是 Git 用来处理路径信息的 revision.c源文件中 path_name()函数的整数截断和整数溢出问题。其缺陷是在收到由攻击者发送的包含恶意数据的特制 Git packfile 后,该函数无法在运行前将恶意数据彻底清除,这样就会造成内存崩溃,并可能会执行任意代码。

Git 内置使用 packfile 格式有效交换存储库信息。Git 使用大量帮助程序工具生成 packfile,并在各个 Git 端点间进行发送或接收。攻击者可能生成一个特制 packfile 文件,使其包含长路径名(231 字节,约 2GB)或者路径元素树,这样就会在处理该文件时触发 path_name()函数的这个漏洞。

已有一个类似的 packfile 存在并已公开发布。这个 packfile 可被用来攻击客户端和服务器。

要攻击有漏洞的服务器,攻击者必须作为 Git 客户端向有漏洞的服务器发送特制 packfile,比如在 push 操作过程中。有漏洞的服务器会收到来自恶意 Git 客户端的恶意 packfile,当处理该文件中所包含的路径信息时就会触发 path_name() 函数漏洞。通常此类操作需要认证。攻击者必须成功通过这个认证方可成功进行攻击。

要攻击客户端,攻击者需要在 Git 服务器中设置恶意 Git 存储库,并欺骗不知情用户克隆该存储库。然后当客户端从该服务器下载恶意 packfile 后,就会在尝试处理它时触发该漏洞。

虽然大路径数据要求原始的未压缩 packfile 大小在 2GB 左右,但这并不意味着攻击者必须通过网络发送几个 GB 的数据。因为 packfile 格式内部使用压缩形式以及根据不同传输机制采用的进一步压缩(比如 SSH),当网络传输数据总量达到 200MB 后就可能攻击该漏洞。

解决方案

建议 Git 用户升级以便使用这些更新的软件包,这些软件包中包含的后端补丁可纠正这些问题。应用此更新前,请确定在系统中已应用之前发布的所有相关勘误。

产品 软件包 公告
Red Hat Enterprise Linux 6 git RHSA-2016-0496
Red Hat Enterprise Linux 7 git RHSA-2016-0496
Red Hat Software Collections git19-git RHSA-2016-0497

常见问题

我有一个 Git 服务器,受这个漏洞影响的可能性有多大?

如果攻击者可以将恶意数据推送到托管的 Git 存储库,您就会受影响。如果这个操作需要认证,则攻击者必须能够成功通过这个认证方可进行攻击。

我有一个 Git 客户端,受这个漏洞影响的可能性有多大?

攻击者可以欺骗您克隆不可信或已损坏的 Git 存储库以便攻击这个漏洞。