Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessWrite glob metacharacters to .python-version
-
DeliveryPlace matching filename in working directory
-
ExploitDeveloper runs any pyenv command
-
ExecutionShell expands unquoted PYENV_VERSION via pathname glob
-
Persistpyenv silently selects unintended Python interpreter
-
ImpactBuild 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. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – 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
Affected Packages
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
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
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.
Primary rating from Vendor (github).
CVSS VectorVendor: github
Lifecycle Timeline
1DescriptionCVE.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
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
Attack Technique
OS command injection occurs when an application passes unsanitized user input directly into system shell commands.
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-60955
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB