Skip to main content

pyenv CVE-2026-68939

| EUVDEUVD-2026-60955 LOW
OS Command Injection (CWE-78)
2026-08-18 security-advisories@github.com
2.0
CVSS 4.0 · Vendor: github
View

Attack ChainAIDerived

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

  1. Access
    Write glob metacharacters to .python-version
  2. Delivery
    Place matching filename in working directory
  3. Exploit
    Developer runs any pyenv command
  4. Execution
    Shell expands unquoted PYENV_VERSION via pathname glob
  5. Persist
    pyenv silently selects unintended Python interpreter
  6. Impact
    Build or runtime uses wrong interpreter version

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization OS command sanitization, avoid shell exec
MITRE ATT&CK

2 techniques across 1 tactic: Execution

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Exploitation requires three simultaneous local conditions: (1) the attacker must control the content of a .python-version file or the PYENV_VERSION environment variable and be able to insert shell glob metacharacters (*, ?, [, ]) into the version string; (2) a file matching that glob pattern must exist in the current working directory at the time any affected pyenv command runs; (3) pyenv must be running a version earlier than 2.8.0. The attack is limited to local access only (AV:L) - remote unauthenticated exploitation is not possible. Exploitation further requires that a matching installed Python version actually exists under PYENV_ROOT/versions, or the glob expansion resolves to a string that happens to match one. The silent-selection behavior is the hazard; if no installed version matches the expanded string, pyenv will error out visibly rather than silently misbehave.

Impact

The CVSS 4.0 score of 2.0 with vector AV:L/AC:L/AT:P/PR:L/UI:N/VC:L/VI:L/VA:L accurately represents a low-severity finding. The AT:P (Attack Requirements: Present) metric captures the critical constraint: the attack requires both a .python-version or PYENV_VERSION value containing glob metacharacters AND a matching file to exist in the current working directory - a coincidence unlikely in most environments unless specifically arranged by an attacker. There is no CISA KEV entry and no public exploit code identified at time of analysis. The CIA impact is uniformly Low: an attacker can at most redirect pyenv to select a different already-installed Python interpreter, which could affect build reproducibility or subtly alter which packages are available, but cannot directly execute code or achieve privilege escalation through this vulnerability alone. This is a real correctness and supply-chain hygiene issue for CI/CD pipelines and shared developer environments where untrusted .python-version files might be committed, but it is not a priority remediation for typical production deployments. EPSS data was not provided in the input.

Exploit ScenarioDerived

A developer clones a repository that contains a maliciously crafted .python-version file with the value [1-9].?* and a committed file named 1.1 in the project root. When pyenv resolves the Python version for any pyenv command, the shell glob expands [1-9].?* against the working directory, matches the file 1.1, and silently selects Python 1.1 - or whichever installed interpreter corresponds to the expanded string - instead of the intended version. In a CI/CD context where the build environment has multiple Python versions installed and the repository is untrusted, this could redirect the build to use an interpreter with a different set of installed packages.

Monitor Track and reassess. Why: LOW severity (CVSS 0.1-3.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 18, 2026

Pyenv's version-selection shell scripts silently redirect Python interpreter selection to an unintended installed version when the PYENV_VERSION or .python-version value contains shell glob metacharacters and a matching file exists in the working directory. All seven libexec scripts (pyenv-version-name, pyenv-which, pyenv-prefix, pyenv-local, pyenv-global, pyenv-version, pyenv-versions) expand the version string without disabling glob expansion via set -f, allowing pathname expansion against the current directory's contents. The fix in v2.8.0 adds set -f/set +f guards around all affected expansions. No public exploit identified at time of analysis; the CVSS 4.0 score of 2.0 with AT:P reflects the constrained exploitation conditions.

RemediationAI

Upgrade pyenv to version 2.8.0 or later, which is the vendor-confirmed patched release available at https://github.com/pyenv/pyenv/releases/tag/v2.8.0. The fix is confirmed in commit 95df7dbc7b34595b47c9b922de198547effda819. Operators who cannot immediately upgrade should audit all .python-version files in version-controlled repositories for glob metacharacters (*, ?, [) and ensure that PYENV_VERSION is never set from untrusted external input in CI/CD pipelines. As a compensating control, restricting write access to .python-version files in shared environments limits the attacker's ability to plant the malicious version string, though this does not address the PYENV_VERSION environment variable vector. There are no significant side effects to upgrading - the set -f/set +f guards are narrowly scoped around array assignments and do not alter other pyenv behavior.

Affected VersionsENISA

pyenv < 2.8.0

Affected Packages

euvd pyenv fix: 2.8.0

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in euvd

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

Technical ContextAI · show details

Pyenv is a shell-based Python version manager that stores the selected Python version as a plain string in .python-version files or in the PYENV_VERSION environment variable. The vulnerability (CWE-78: OS Command Injection - specifically unintended shell metacharacter processing) arises because bash arrays populated via VAR=($unquoted_value) perform IFS-splitting and then pathname/glob expansion on the resulting tokens before assignment. Without set -f to disable globbing, a value like [1-9].?* stored in a .python-version file will be expanded by the shell against the current directory's filesystem entries rather than treated as a literal version string. If a file named 1.1 exists in the working directory, the glob matches and pyenv silently resolves the version as 1.1 instead of the literal glob pattern. The fix confirmed in commit 95df7dbc adds set -f before and set +f after all affected array assignments across the seven impacted scripts.

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 (github) PRIMARY 2.0 LOW
CVSS:4.0/AV:L/AC:L/AT:P/PR:L/UI:N/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N
vuln.today AI 3.6 LOW

Local vector with high complexity because exploitation requires both a glob-containing version string and a matching file in the working directory simultaneously; low privileges to write .python-version; no availability impact.

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

Primary rating from Vendor (github).

CVSS VectorVendor: github

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

Lifecycle Timeline

1
Patch available
Aug 18, 2026 - 16:17 EUVD

DescriptionCVE.org

Pyenv provides simple Python version management. Prior to 2.8.0, is_version_safe() in libexec/pyenv-version-file-read accepts shell glob metacharacters in .python-version values, and unquoted PYENV_VERSION expansion in libexec/pyenv-version-name, libexec/pyenv-which, libexec/pyenv-prefix, libexec/pyenv-local, libexec/pyenv-global, libexec/pyenv-version, and libexec/pyenv-versions pathname-expands the value against the current directory, allowing a matching attacker-controlled file to silently select a different installed interpreter or version. This issue is fixed in version 2.8.0.

Threat Intelligence Overview

EPSS Score
0.2%
Top 94% exploitable
Prevalence
Medium
popular Python developer toolchain, less common in production servers
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 LOW
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
LOW severity (CVSS 0.1-3.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
Poc
System Exposure· derived
Small
Automatable
No
Human Impact· derived
Low
Technical Impact
Partial

Priority Score

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

Attack Technique

OS command injection occurs when an application passes unsanitized user input directly into system shell commands.

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

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