Skip to main content

GitPython EUVDEUVD-2026-101743

| CVE-2026-110860 MEDIUM
Improper Link Resolution Before File Access (CWE-59)
2026-10-14 disclosure@vulncheck.com GHSA-cfp4-478m-4f52
6.9
CVSS 4.0 · Vendor: vulncheck
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Publish untrusted repo with crafted symlink
  2. Exploit
    Victim app initializes and moves submodule
  3. Execution
    Submodule.move() validates destination only lexically
  4. Impact
    Checkout relocated outside worktree, index and .gitmodules corrupted

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V5 - File Handling Symlink resolution safety
Exploitation Conditions

Exploitation requires that the victim application use GitPython (3.1.62 up to but not including 3.2.0) and specifically invoke Submodule.move() on an already-initialized submodule within a repository the attacker controls, where the attacker has committed a symbolic link in an intermediate destination path component that resolves outside the worktree. Limiting factors: it is local-only (AV:L) with no network path, demands passive user interaction (UI:P) in that the application must actively perform the move against untrusted content, and affects only the 3.1.62-3.2.0 version band; impact is limited to integrity/corruption of the checkout, index, and .gitmodules with no confidentiality loss. Applications that never call Submodule.move() on untrusted repositories are not exposed.

Impact

This is a moderate-severity integrity flaw, not a high-priority emergency. The provided CVSS 4.0 vector (AV:L/AC:L/AT:N/PR:N/UI:P/VC:N/VI:H/VA:L, base 6.9 MEDIUM) describes a local-vector issue requiring passive user interaction: the victim application must itself perform a Submodule.move() against an attacker-supplied repository. There is no network attack surface and no confidentiality impact (VC:N), which is consistent with CWE-59 (link following) rather than data disclosure. No EPSS score was supplied, the CVE is not on CISA KEV, and no public exploit was referenced, so the signals are internally consistent and all point to low real-world exploitation pressure: no public exploit identified at time of analysis. One cross-source conflict exists - the single input Tag is 'Information Disclosure,' which directly contradicts the CVSS (VC:N, VI:H) and the description; this is an integrity/path-relocation flaw, not information disclosure, so the tag should be treated as mislabeled. Net: a legitimate bug worth patching in CI/automation that processes untrusted repositories, but not an urgent, widely-weaponizable vulnerability.

Exploit ScenarioDerived

An attacker publishes a malicious Git repository whose tree contains a submodule plus a symlink (e.g. a path component named 'vendor') that points outside the worktree. A victim CI pipeline or tool that clones this repository and uses GitPython's Submodule.move() to relocate an initialized submodule follows the symlink lexically, writing the submodule checkout to the attacker-chosen external location and corrupting the repository's index and .gitmodules. No public exploit code was identified in the provided sources.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.1% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 15, 2026

Symlink-following in GitPython 3.1.62 through the 3.1.x line (up to but not including 3.2.0) lets a repository author plant a committed symbolic link - such as a 'vendor' entry resolving outside the worktree - and then have an application that calls Submodule.move() on an already-initialized submodule relocate that checkout outside the repository, corrupting the working tree, the Git index, and .gitmodules. This is a moderate-severity integrity flaw rather than a high-priority emergency: it is local-only, unauthenticated in the CVSS sense (PR:N) but requires user interaction since the victim application must actively perform the move against attacker-controlled content, and there is no confidentiality loss. No public exploit code and no confirmed active exploitation (CISA KEV) were identified at time of analysis; exposure is limited to applications that invoke Submodule.move() on untrusted repositories.

RemediationAI

Vendor-released patch: GitPython 3.2.0 - upgrade off the affected 3.1.62-3.1.x band by pinning gitpython>=3.2.0 in requirements and lockfiles, and confirm the resolved version after install (pip show gitpython / import git; git.__version__), referencing GHSA-gq48-pqfc-9p58 (https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-gq48-pqfc-9p58) for the fixed release. Where an upgrade cannot be applied immediately, apply compensating controls at the call site rather than relying on generic hardening: stop invoking Submodule.move() against repositories whose contents you do not trust, since that single call is the only trigger and avoiding it removes exposure entirely (trade-off: the surrounding workflow must move submodule paths by other means, e.g. a fresh clone or 'git submodule deinit' plus re-add); alternatively, resolve and confine the destination before calling move - compute os.path.realpath() of the destination and verify it is inside the worktree, and refuse to proceed if any intermediate component is a symlink (os.path.islink check per component, or use os.path.commonpath against the repo root), accepting the cost of extra validation code and possible false rejections of legitimate symlinked layouts; running the move inside a disposable, symlink-disabled or namespace-isolated working copy (for example a container or mount with symlink creation blocked) limits the blast radius to a throwaway checkout at the cost of additional sandboxing infrastructure; finally, monitor for corrupted index/.gitmodules as a detection signal, but do not treat monitoring as mitigation.

Affected VersionsENISA

GitPython 3.1.62 <3.2.0

Affected Packages

pypi gitpython fix: 3.2.0

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in pypi

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

The flaw is CWE-59 (Improper Link Resolution Before File Access, i.e. 'link following'). GitPython is a Python library that implements Git porcelain and plumbing on top of the git CLI and its own object model; Submodule.move() renames a submodule within its superproject, rewriting .gitmodules and the index accordingly. The vulnerable implementation in 3.1.62 validates the destination path only lexically - comparing path strings/components without resolving them - so it never rejects symbolic links embedded in intermediate destination components. Because a symlink committed by the repository author is materialized into the worktree when the submodule tree is checked out, a destination such as 'vendor/sub' traverses the attacker-controlled link and resolves to a location outside the worktree; the move then writes the checkout, index entries, and .gitmodules rewrite there, producing external relocation and metadata corruption. Note that the supplied tags classify this as 'Information Disclosure', but the assessed impact profile is integrity-focused (I:H/A:L, C:N): the primitive is a path-traversal/link-following write-and-move effect, not a read of secret data. No CPE strings were supplied with the intelligence, so version pinning must rely on the advisory ranges (3.1.62 <= version < 3.2.0).

Know when Python gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (vulncheck) PRIMARY 6.9 MEDIUM
CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:N/VI:H/VA:L/SC:N/SI:N/SA:N
vuln.today AI 6.1 MEDIUM

Local because the flaw triggers only when the app processes an untrusted repo on-host (AV:L); UI:R as the app must perform the move; PR:N since no auth is needed; C:N, I:H, A:L for file corruption without disclosure.

3.1 AV:L/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:L
4.0 AV:L/AC:L/AT:N/PR:N/UI:P/VC:N/VI:H/VA:L/SC:N/SI:N/SA:N
Red Hat 6.1 MEDIUM

Primary rating from Vendor (vulncheck).

CVSS VectorVendor: vulncheck

Attack Vector
Local
Attack Complexity
Low
Attack Requirements
None
Privileges Required
None
User Interaction
Passive
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
High
Vulnerable system: Availability
Low
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

1
Patch available
Oct 15, 2026 - 02:16 EUVD

DescriptionCVE.org

GitPython from 3.1.62 before 3.2.0 contains a symlink-following flaw in Submodule.move(), which checks the destination only lexically and does not reject symbolic links in intermediate path components. An untrusted repository can commit a symlink such as vendor pointing outside the worktree, so an application moving an initialized submodule beneath it relocates the checkout externally and corrupts the index and .gitmodules.

Blast Radius

ecosystem impact
† from your stack dependencies † transitive graph · vuln.today resolves 4-path depth
  • 21 pypi packages depend on gitpython (12 direct, 9 indirect)

Ecosystem-wide dependent count for version 3.2.0.

Threat Intelligence Overview

EPSS Score
0.1%
Top 98% exploitable
Prevalence
Medium
popular Python git library common in CI and developer tooling, not universal
Data Quality
6 sources
Confidence: High

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.1%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Defer
Exploitation· derived
None
System Exposure· derived
Small
Automatable· derived
No
Human Impact· derived
Medium

Priority Score

34
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +34
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

More in Python

View all
CVE-2025-24016 CRITICAL POC
9.9 Feb 10

Wazuh SIEM platform versions 4.4.0 through 4.9.0 contain an unsafe deserialization vulnerability in the DistributedAPI t

CVE-2025-27520 CRITICAL POC
9.8 Apr 04

BentoML version 1.4.2 and earlier contains an unauthenticated remote code execution vulnerability through insecure deser

CVE-2025-2945 CRITICAL POC
9.9 Apr 03

pgAdmin 4 contains critical remote code execution vulnerabilities in the Query Tool download and Cloud Deployment endpoi

CVE-2013-5093 MEDIUM POC
6.8 Sep 27

The renderLocalView function in render/views.py in graphite-web in Graphite 0.9.5 through 0.9.10 uses the pickle Python

CVE-2025-32375 CRITICAL POC
9.8 Apr 09

BentoML is a Python library for building online serving systems optimized for AI apps and model inference. Rated critica

CVE-2014-0224 HIGH POC
7.4 Jun 05

OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h does not properly restrict processing of ChangeCiph

CVE-2024-21644 HIGH POC
7.5 Jan 08

pyLoad download manager version prior to 0.5.0b3.dev77 exposes the Flask SECRET_KEY through an unauthenticated endpoint.

CVE-2026-33017 CRITICAL POC
9.3 Mar 17

Langflow (a visual LLM pipeline builder) contains a critical unauthenticated code execution vulnerability (CVE-2026-3301

CVE-2017-9462 HIGH POC
8.8 Jun 06

In Mercurial before 4.1.3, "hg serve --stdio" allows remote authenticated users to launch the Python debugger, and conse

CVE-2026-49869 CRITICAL POC
10.0 Jun 26

Unauthenticated remote code execution affects Kestra OSS (the open-source event-driven orchestration platform) prior to

CVE-2026-39987 CRITICAL POC
9.3 Apr 08

Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/

CVE-2024-21645 MEDIUM POC
5.3 Jan 08

pyLoad is the free and open-source Download Manager written in pure Python. Rated medium severity (CVSS 5.3), this vulne

Vendor StatusVendor

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy