IPBUF安全漏洞报告
English
CVE-2026-42284 CVSS 8.1 高危

CVE-2026-42284 GitPython参数注入导致远程代码执行漏洞

披露日期: 2026-05-07

漏洞信息

漏洞编号
CVE-2026-42284
漏洞类型
远程代码执行
CVSS评分
8.1 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
GitPython

相关标签

RCEGitPython参数注入代码执行CVE-2026-42284

漏洞概述

GitPython是一个用于与Git仓库交互的Python库。在3.1.47版本之前,`_clone()`方法对`multi_options`参数的验证机制存在逻辑缺陷。攻击者可以利用此缺陷注入恶意的Git配置参数(例如`core.hooksPath`),从而在仓库克隆操作期间触发任意代码执行。该漏洞已在3.1.47版本中修复。

技术细节

该漏洞的根本原因在于GitPython的`_clone()`函数对`multi_options`参数的处理逻辑存在不一致性。验证阶段,代码检查原始列表元素是否以允许的选项(如`--branch`)开头。然而,在执行阶段,代码先将`multi_options`列表通过空格拼接成字符串,随后使用`shlex.split()`进行重新分割。这种处理方式允许攻击者将多个参数注入到一个看似合法的参数字符串中。例如,传入`"--branch main --config core.hooksPath=/x"`,验证时仅检查前缀合法,但在分割后变成了四个独立的参数`["--branch", "main", "--config", "core.hooksPath=/x"]`。随后,Git在执行克隆操作时会解析隐藏的`--config`参数,将`core.hooksPath`指向攻击者控制的路径,进而触发恶意钩子脚本,实现远程代码执行。

攻击链分析

STEP 1
1
攻击者诱导受害者使用受影响版本的GitPython克隆仓库,并传递特制的`multi_options`参数,该参数包含看似合法的前缀和隐藏的恶意配置。
STEP 2
2
GitPython的验证逻辑检查参数列表的前缀(如`--branch`),认为输入合法并通过验证。
STEP 3
3
在执行阶段,GitPython将参数拼接为字符串并使用`shlex.split()`分割,解析出攻击者注入的`--config core.hooksPath=...`参数。
STEP 4
4
底层Git命令执行克隆操作,应用注入的配置,将Git钩子路径指向攻击者控制的目录。
STEP 5
5
Git在克隆过程中自动执行攻击者预设的钩子脚本,导致在受害者系统上执行任意代码。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import git # Scenario: Target repository URL repo_url = "https://github.com/example/target-repo.git" local_path = "./cloned_repo" # Vulnerable payload: It starts with a safe option ('--branch') # but injects a malicious config option via string splitting. # This payload will pass the initial list validation. malicious_options = [ "--branch main --config core.hooksPath=/tmp/evil_hooks" ] try: # In versions < 3.1.47, this triggers the vulnerability print(f"Attempting to clone with multi_options: {malicious_options}") repo = git.Repo.clone_from(repo_url, local_path, multi_options=malicious_options) print("Clone completed. If hooks existed in /tmp/evil_hooks, code was executed.") except Exception as e: print(f"An error occurred: {e}")

影响范围

GitPython < 3.1.47

防御指南

临时缓解措施
如果无法立即升级,应避免使用`multi_options`参数处理未经验证的用户输入。建议在应用层面对传入的参数进行二次校验,确保分割后的参数中不包含`--config`等危险选项,或通过正则表达式匹配拒绝包含空格的复合参数。

参考链接