Skip to main content

GitPython CVE-2026-78678

| EUVDEUVD-2026-65224 HIGH
Improper Neutralization of Argument Delimiters in a Command ('Argument Injection') (CWE-88)
2026-08-25 VulnCheck GHSA-5xxx-qhh7-9287 GHSA-89ff-m8wv-p99r PYSEC-2026-3788
7.1
CVSS 4.0 · Vendor: VulnCheck
View

Attack ChainAIDerived

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

  1. Access
    Obtain low-privilege application access
  2. Delivery
    Identify endpoint invoking Repo.blame() with user-supplied revision
  3. Exploit
    Craft revision string --contents=/etc/passwd
  4. Execution
    Submit request bypassing incomplete denylist
  5. Persist
    Git reads target file via option injection
  6. Impact
    Exfiltrate file contents from blame response

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Argument sanitization
Exploitation Conditions

Exploitation requires three concurrent conditions: (1) the target application uses GitPython's Repo.blame() method, (2) user-controlled input is passed as the revision argument without independent sanitization - specifically, the application does not validate that the revision matches a safe format before calling GitPython, and (3) the attacker holds at least low-privilege access to invoke the blame functionality (confirmed by PR:L in the CVSS 4.0 vector). The attacker must be able to supply a string beginning with --contents=<filepath> or -S <filepath> as the revision value. Exploitation is strictly bounded by the PR:L requirement: unauthenticated external attackers cannot exploit this without first obtaining application-level access. Confidentiality impact is high but scoped to files readable by the process user; there is no integrity (VI:N) or availability (VA:N) impact per the CVSS vector. Deployments that do not expose Repo.blame() to user-controlled revision input, or that independently validate revision format, are not exploitable.

Impact

The CVSS 4.0 base score of 7.1 (AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N) reflects a realistic and constrained threat: network-accessible, low-complexity exploitation requiring only low-privilege application access, yielding high confidentiality impact. The PR:L requirement is the most meaningful limiting factor - an unauthenticated attacker cannot reach Repo.blame() without first obtaining application-level credentials or a session. The vulnerability is not listed in CISA KEV and no public exploit code has been identified, reducing urgency compared to actively-exploited issues. EPSS score data was absent from the provided intelligence, so probability-of-exploitation cannot be precisely quantified. However, the denylist gap is structurally simple to abuse - --contents and -S are standard documented git options that were merely overlooked - meaning that once an attacker has the necessary access, no specialized knowledge or tooling is required. Web applications and CI/CD services that expose git blame to user-supplied revision input represent the highest-risk deployment pattern and should treat this as an upgrade priority rather than a deferred backlog item.

Exploit ScenarioDerived

An attacker with authenticated access to a web application that internally calls Repo.blame() with a user-supplied revision string submits a request where the revision is set to --contents=/etc/passwd. GitPython passes this string unsanitized to git blame, which interprets it as an option rather than a commit reference and reads /etc/passwd, returning its contents embedded in the blame output to the application - and ultimately to the attacker. No public exploit code has been identified, but the attack requires only a standard HTTP request with a crafted parameter value.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.2% exploitation probability (EPSS)

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

Alert me

AnalysisAIv1 – Aug 25, 2026

Arbitrary file read in GitPython versions before 3.1.59 exposes sensitive filesystem content to low-privileged network attackers through an incomplete argument-injection guard. The unsafe_git_revision_options denylist in Repo.blame() omits the --contents and -S git options, allowing attackers to supply revision values such as --contents=/etc/passwd and receive the target file's contents embedded in the blame output. No public exploit has been identified at time of analysis, but the bypass is conceptually trivial - a crafted string is all that is required once access to the blame API is established.

RemediationAI

Upgrade GitPython to version 3.1.59 or later, which corrects the incomplete denylist by adding --contents and -S to the blocked revision options in the unsafe_git_revision_options guard. Full details are in the maintainer advisory at https://github.com/gitpython-developers/GitPython/security/advisories/GHSA-5xxx-qhh7-9287. If an immediate upgrade is not feasible, implement application-layer input validation before any user-controlled data reaches Repo.blame(): adopt an explicit allowlist restricting revision arguments to known-safe formats (full 40-character commit SHAs, alphanumeric branch or tag names, and refs/ prefixes) rather than relying on a secondary denylist, which is the approach that introduced this vulnerability. This allowlist approach carries a trade-off - unusually formatted but legitimate ref names could be rejected - so testing against the application's real revision input patterns before deployment is advised. The upgrade path is low-cost and should be preferred.

Affected VersionsENISA

GitPython 0 <3.1.59

Affected Packages

pypi gitpython fix: 3.1.59

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

GitPython (CPE: cpe:2.3:a:gitpython-developers:gitpython:*:*:*:*:*:*:*:*) is a Python library that wraps Git subprocess calls to provide repository interaction. The vulnerability class is CWE-88 (Argument Injection or Modification): user-controlled data is incorporated into subprocess arguments without exhaustive sanitization. The affected guard, unsafe_git_revision_options, maintains a denylist of dangerous git options, but omits --contents and -S. In git-blame, --contents instructs git to treat the specified file path as the working-tree content source, and -S supplies a revs file - both cause git to read arbitrary filesystem paths, with the output surfaced through the Python blame result returned to the caller. Any application that forwards user input as the revision parameter to Repo.blame() without independent validation is directly exposed.

Know when Gitpython 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 7.1 HIGH
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N
vuln.today AI 6.5 MEDIUM

Network-reachable via application layer; low privilege required to invoke blame; pure confidentiality impact via arbitrary file read with no integrity or availability effect.

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

Primary rating from Vendor (VulnCheck).

CVSS VectorVendor: VulnCheck

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

Lifecycle Timeline

2
Patch available
Aug 25, 2026 - 03:16 EUVD
CVE Published
Aug 25, 2026 - 01:30 cve.org
HIGH 7.1

DescriptionCVE.org

GitPython versions before 3.1.59 contain an incomplete denylist in the unsafe_git_revision_options guard that omits --contents and -S options, allowing attackers to read arbitrary files by passing these options to Repo.blame(). Attackers can supply revision values like --contents=/etc/passwd to leak file contents through the blame result returned to the caller.

Blast Radius

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

Ecosystem-wide dependent count for version 3.1.59.

Executive ViewAI

Why It Matters

GitPython before version 3.1.59 contains an arbitrary file read vulnerability that allows attackers with access to the blame API to extract sensitive filesystem contents, such as credentials and configuration files. No public exploit identified at time of analysis, though the bypass is conceptually straightforward. Organizations relying on GitPython for version control operations face significant risk of sensitive data exposure on affected systems.

Business Impact: High
Compensating Controls

No vendor-released patch identified at time of analysis. Interim mitigations: (1) Restrict network access to GitPython-dependent systems to only authorized users; (2) Disable Repo.blame() functionality if not required for operations; (3) Implement input validation on any user-supplied data passed to blame API calls; (4) Enable detailed audit logging of all blame API access for threat detection.

Threat Intelligence Overview

EPSS Score
0.2%
Top 87% exploitable
Prevalence
Medium
widely-used Python Git interface library in developer and CI/CD tooling
Threat Intel
1
1 source
Exploit
POC
Public exploit code exists
Data Quality
7 sources
Confidence: High
EUVD 🇯🇵JVN NVD CVE.org EPSS Vulnrichment GHSA Vendor GitHub

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 HIGH
CISA KEV No
Public POC Yes
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.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
Scheduled
Exploitation
Poc
System Exposure· derived
Open
Automatable
No
Human Impact
High
Technical Impact
Partial

Priority Score

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

Attack Technique

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

Vendor StatusVendor

SUSE

Severity: Moderate
Product Status
openSUSE Tumbleweed Fixed
SUSE Linux Enterprise High Performance Computing 15 SP4-ESPOS Affected
SUSE Linux Enterprise High Performance Computing 15 SP4-LTSS Affected
SUSE Linux Enterprise High Performance Computing 15 SP5-ESPOS Affected
SUSE Linux Enterprise High Performance Computing 15 SP5-LTSS Affected

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