Vulnerabilities

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

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.

  1. 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

  2. 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

  3. Oct 22, 2026 · PyPA Advisory Database

    Fix available

    gitpython fixed in 3.2.1

  4. Oct 22, 2026 · PyPA Advisory Database

    Fix available

    gitpython fixed in 3.2.1

  5. 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