Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessPublish untrusted repo with crafted symlink
-
ExploitVictim app initializes and moves submodule
-
ExecutionSubmodule.move() validates destination only lexically
-
ImpactCheckout 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. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – 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
Affected Packages
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
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
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.
Primary rating from Vendor (vulncheck).
CVSS VectorVendor: vulncheck
Lifecycle Timeline
1DescriptionCVE.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- 21 pypi packages depend on gitpython (12 direct, 9 indirect)
Ecosystem-wide dependent count for version 3.2.0.
Threat Intelligence Overview
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.
What every action level means
SSVC AssessmentENISA
Priority Score
Wazuh SIEM platform versions 4.4.0 through 4.9.0 contain an unsafe deserialization vulnerability in the DistributedAPI t
BentoML version 1.4.2 and earlier contains an unauthenticated remote code execution vulnerability through insecure deser
pgAdmin 4 contains critical remote code execution vulnerabilities in the Query Tool download and Cloud Deployment endpoi
The renderLocalView function in render/views.py in graphite-web in Graphite 0.9.5 through 0.9.10 uses the pickle Python
BentoML is a Python library for building online serving systems optimized for AI apps and model inference. Rated critica
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
pyLoad download manager version prior to 0.5.0b3.dev77 exposes the Flask SECRET_KEY through an unauthenticated endpoint.
Langflow (a visual LLM pipeline builder) contains a critical unauthenticated code execution vulnerability (CVE-2026-3301
In Mercurial before 4.1.3, "hg serve --stdio" allows remote authenticated users to launch the Python debugger, and conse
Unauthenticated remote code execution affects Kestra OSS (the open-source event-driven orchestration platform) prior to
Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/
pyLoad is the free and open-source Download Manager written in pure Python. Rated medium severity (CVSS 5.3), this vulne
EUVD-2026-101743
GHSA-cfp4-478m-4f52
NVD
CVE.org
EPSS
Exploit-DB