Security fix · CVE-2026-114145
GitPython is a python library used to interact with Git repositories.
Published Oct 21, 2026 · catalog updated Oct 22, 2026 · GitPython is a python
Last checked Nov 5, 2026. A connected source was read within the last 7 days.
Check if you run it
No confirmed exploitation is on record for CVE-2026-114145. EPSS is 0.42%. Act only if a listed version of GitPython is a python is installed.
Gaps on this record
- The stored product name is a package slug. The name on this page is taken from the title (GitPython is a python).
- No vendor fix or required action is stored. Compare the linked advisory before you change production.
- Severity
- High7.5
- Known exploitation
- Not in CISA/VulnCheck KEV
- EPSS
- 0.42%
- Remediation
- Version ranges on file
- Affected products
- PyPI gitpython · pip Gitpython · pypi gitpython
### Summary clones a submodule into the repo's own directory before it rejects the path. A of ".git/hooks" is accepted by the pre-clone check, so the submodule is cloned straight into the live hooks directory, and a file named in the submodule becomes an executable . On 3.2.0+ the later index check does raise , but only after the clone already wrote to disk, and it does not remove the planted hook; on 3.1.x there is no such check and the call succeeds silently. Either way the hook runs on the next git operation (e.g. checkout), giving code execution. ### Details The checkout path is validated too late, after the clone has already mutated disk. This breaks the "validate before mutation" invariant that commit 43a43cd8 ("Validate submodule checkout and metadata paths before mutation") set out to enforce. Submodule.add() calls the permissive path check before cloning, and the strict check only reaches the ".git" alias at index time, after _clone_repo has written to disk: git/objects/submodule/base.py (Submodule.add) 599: path = cls._to_relative_path(repo, path) # accepts ".git/hooks" 673: mrepo = cls._clone_repo(repo, url, path, name, ...) # clones into /.git/hooks 714: index.add([sm], write=True) # strict check only triggers here git/index/base.py (IndexFile._preprocess_add_items) 732: _validate_repo_path(entry.path) # rejects ".git", too late _to_relative_path only blocks /absolute/out-of-tree paths; aliases are rejected only by _validate_repo_path, which was added in 3.2.0 (commit a75aedf3) and runs at the index boundary. The ValueError it raises at line 732 does not roll back what _clone_repo already wrote. Version-dependent behavior: - 3.2.0 .. tip bda18e08: _validate_repo_path raises ValueError at index.add, but the hook is already on disk and is not removed (incorrect order of validation vs. clone). - 3.1.x (e.g. 3.1.59): _validate_repo_path does not exist and _to_relative_path does not reject ; create_submodule(path=".git/hooks", ...) returns with no error at al
Are you affected?
Enter the version you run. The result uses only the ranges stored on this record.
The check returns affected, not affected, or incomplete. It does not guess a version that is missing from the record.
- PyPI gitpython0 → 3.2.1
- pip Gitpython<= 3.2.0
- pypi gitpythonversion unspecified
How to fix CVE-2026-114145
Upgrade
CVE-2026-114145 lists a fix boundary at 3.2.1. Compare the installed build with that boundary before you change production.
Version check
Affected <= 3.2.0
Advisory
Open the cve_org record and follow its fix.
Official advisories
What to do
Three questions, each answered from this record only. Confirm the vendor advisory before you patch.
Should you patch?
No confirmed exploitation is on record for CVE-2026-114145. EPSS is 0.42%. Act only if a listed version of GitPython is a python is installed.
Which versions are affected?
Compare what you have installed with Gitpython <= 3.2.0. Compare the installed version with the linked vendor advisory before you change production.
What should an analyst verify?
CWE-696. EPSS 0.42%. There is no CISA KEV listing. No Exploit-DB or Metasploit reference is linked. Use the source links for the original advisory.
Code
The project this record applies to. Exploit listings stay in References.
Timeline
Detection, updates, and resolution for this record.
Oct 21, 2026 · NIST NVD
Detected
GitPython is a python library used to interact with Git repositories. Prior to 3.2.1, create_submodule() in git/objects/submodule/base.py accepts an attacker-influenced submodule path such as .git/hooks and invokes _clone_repo() before safely rejecting the destination. In 3.1.x, _validate_repo_path() does not exist and the call succeeds silently, while in 3.2.0 and later affected revisions the che
Oct 22, 2026 · GitHub Advisory Database
Updated
### Summary clones a submodule into the repo's own directory before it rejects the path. A of ".git/hooks" is accepted by the pre-clone check, so the submodule is cloned straight into the live hooks directory, and a file named in the submodule becomes an executable . On 3.2.0+ the later index check does raise , but only after the clone already wrote to disk, and it does not remove the planted hook
Oct 22, 2026 · PyPA Advisory Database
Fix available
gitpython fixed in 3.2.1
Oct 22, 2026 · PyPA Advisory Database
Fix available
gitpython fixed in 3.2.1
Oct 22, 2026 · PyPA Advisory Database
Updated
### Summary clones a submodule into the repo's own directory before it rejects the path. A of ".git/hooks" is accepted by the pre-clone check, so the submodule is cloned straight into the live hooks directory, and a file named in the submodule becomes an executable . On 3.2.0+ the later index check does raise , but only after the clone already wrote to disk, and it does not remove the planted hook
Sources
- CVE.orgVulnerability recordCVE-2026-114145
Official CVE identifier
cve.org - FIRST EPSSExploitation probabilityCVE-2026-114145
30-day exploitation probability 0.42%
first.org - GitHub Advisory DatabasePackage advisoryGHSA-83vg-56qc-22m7
GitPython validates a submodule's ".git" path only after cloning into it (RCE)
github.com - GitLab Advisory DatabasePackage advisoryCVE-2026-114145
create_submodule(name, path, url) clones a submodule into the repo's own .git directory before it rejects the path. A path of ".git/hooks" is accepted by the pre-clone check, so the submodule is cloned straight into the live hooks directory, and a file named post-checkout in the submodule becomes an executable .git/hooks/post-checkout. On 3.2.0+ the later index check does raise ValueError, but onl
advisories.gitlab.com - NIST NVDVulnerability recordCVE-2026-114145
GitPython is a python library used to interact with Git repositories. Prior to 3.2.1, create_submodule() in git/objects/submodule/base.py accepts an attacker-influenced submodule path such as .git/hooks and invokes _clone_repo() before safely rejecting the destination. In 3.1.x,
nvd.nist.gov - PyPA Advisory DatabasePackage advisoryGHSA-83vg-56qc-22m7
GitPython validates a submodule's ".git" path only after cloning into it (RCE)
osv.dev
References
Freshness
Last verified in this catalog Nov 5, 2026. Significant claims (KEV, EPSS, CVSS, affected ranges) come from the source rows above — open the original publisher for the authoritative advisory.
- FIRST EPSSNov 5, 2026
- GitHub Advisory DatabaseOct 23, 2026
- PyPA Advisory DatabaseOct 23, 2026
- GitLab Advisory DatabaseOct 23, 2026
- CVE.orgOct 22, 2026
- NIST NVDOct 22, 2026