Description
virtualenv is a tool for creating isolated virtual python environments. Prior to 21.14.9, download_wheel() writes package-index downloads directly into the reusable wheel/house cache before selecting a verification target from pip's textual Saved output. With default-index digest comparison enabled, a controlled package index can inject a misleading Saved line through a discarded link's data-requires-python attribute; this forged-line variant also requires knowledge of an absolute path to the genuine bundled wheel. The wrong path can then be hashed, while a digest mismatch leaves the rejected archive in the cache for later selection without verification. A separate rejected-cache-file variant requires control over downloaded data or archive selection but not the forged-line prerequisites. Explicit custom-index exceptions are outside the promised PyPI comparison, and the issue does not independently bypass TLS or establish control of default PyPI. This issue is fixed in version 21.14.9.
Published: 2026-10-20
Score: 2.3 Low
EPSS: < 1% Very Low
KEV: No
Impact: Unverified wheel cache that may lead to malicious code execution during environment creation
Action: Immediate Patch
AI Analysis

Impact

A flaw in virtualenv’s wheel download routine allows a malicious or compromised package index to insert a forged wheel entry into the local wheel cache before the wheel’s integrity is verified; when virtualenv later creates an environment it may select and execute this malicious wheel, compromising the resulting isolated Python environment.

Affected Systems

The vulnerability affects all releases of the pypa:virtualenv tool older than version 21.14.9 and is platform‑agnostic, impacting any operating system that supports virtualenv.

Risk and Exploitability

The CVSS score of 2.3 marks the weakness as low severity, while the EPSS score of “< 1%” indicates a very low probability of public exploitation and the vulnerability is not listed in CISA’s KEV catalog. Exploitation requires an attacker to control or poison a package index and craft a forged wheel entry, a non‑trivial setup; the risk is therefore limited to environments that use untrusted indices or allow custom indexing. Upgrading to virtualenv 21.14.9 or later is the preferred mitigation.

Generated by OpenCVE AI on October 22, 2026 at 20:27 UTC.

Remediation

No solution or workaround provided in the CVE record.

OpenCVE Recommended Actions

  • Upgrade virtualenv to version 21.14.9 or newer
  • If an upgrade is not immediately possible, restrict virtualenv to trusted PyPI indices only, disabling default-index use and supplying explicit trusted‑host entries
  • After upgrading, clear the virtualenv wheel cache to remove any previously cached malicious wheels

Generated by OpenCVE AI on October 22, 2026 at 20:27 UTC.

Tracking

Sign in to view the affected projects.

Advisories
Source ID Title
Github GHSA Github GHSA GHSA-494p-63j8-28p3 virtualenv: Downloaded wheel selection and caching precede verification
History

Tue, 27 Oct 2026 11:30:00 +0000

Type Values Removed Values Added
Metrics ssvc

{'options': {'Automatable': 'no', 'Exploitation': 'poc', 'Technical Impact': 'partial'}, 'version': '2.0.3'}


Wed, 21 Oct 2026 00:30:00 +0000

Type Values Removed Values Added
Weaknesses CWE-494
References
Metrics threat_severity

None

cvssV3_1

{'score': 5.0, 'vector': 'CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:L/A:L'}

threat_severity

Moderate


Tue, 20 Oct 2026 21:00:00 +0000

Type Values Removed Values Added
First Time appeared Pypa
Pypa virtualenv
Vendors & Products Pypa
Pypa virtualenv

Tue, 20 Oct 2026 19:30:00 +0000

Type Values Removed Values Added
Description virtualenv is a tool for creating isolated virtual python environments. From 21.14.8 until 21.14.9, download_wheel() writes package-index downloads directly into the reusable wheel/house cache before selecting a verification target from pip's textual Saved output. With default-index digest comparison enabled, a controlled package index can inject a misleading Saved line through a discarded link's data-requires-python attribute; this forged-line variant also requires knowledge of an absolute path to the genuine bundled wheel. The wrong path can then be hashed, while a digest mismatch leaves the rejected archive in the cache for later selection without verification. A separate rejected-cache-file variant requires control over downloaded data or archive selection but not the forged-line prerequisites. Explicit custom-index exceptions are outside the promised PyPI comparison, and the issue does not independently bypass TLS or establish control of default PyPI. This issue is fixed in version 21.14.9. virtualenv is a tool for creating isolated virtual python environments. Prior to 21.14.9, download_wheel() writes package-index downloads directly into the reusable wheel/house cache before selecting a verification target from pip's textual Saved output. With default-index digest comparison enabled, a controlled package index can inject a misleading Saved line through a discarded link's data-requires-python attribute; this forged-line variant also requires knowledge of an absolute path to the genuine bundled wheel. The wrong path can then be hashed, while a digest mismatch leaves the rejected archive in the cache for later selection without verification. A separate rejected-cache-file variant requires control over downloaded data or archive selection but not the forged-line prerequisites. Explicit custom-index exceptions are outside the promised PyPI comparison, and the issue does not independently bypass TLS or establish control of default PyPI. This issue is fixed in version 21.14.9.

Tue, 20 Oct 2026 19:15:00 +0000

Type Values Removed Values Added
Description virtualenv is a tool for creating isolated virtual python environments. From 21.14.8 until 21.14.9, download_wheel() writes package-index downloads directly into the reusable wheel/house cache before selecting a verification target from pip's textual Saved output. With default-index digest comparison enabled, a controlled package index can inject a misleading Saved line through a discarded link's data-requires-python attribute; this forged-line variant also requires knowledge of an absolute path to the genuine bundled wheel. The wrong path can then be hashed, while a digest mismatch leaves the rejected archive in the cache for later selection without verification. A separate rejected-cache-file variant requires control over downloaded data or archive selection but not the forged-line prerequisites. Explicit custom-index exceptions are outside the promised PyPI comparison, and the issue does not independently bypass TLS or establish control of default PyPI. This issue is fixed in version 21.14.9.
Title virtualenv: Downloaded wheel selection and caching precede verification
Weaknesses CWE-354
References
Metrics cvssV4_0

{'score': 2.3, 'vector': 'CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:P/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N'}


cve-icon MITRE

Status: PUBLISHED

Assigner: GitHub_M

Published:

Updated: 2026-10-27T10:59:22.031Z

Reserved: 2026-10-20T16:03:14.862Z

Link: CVE-2026-113714

cve-icon Vulnrichment

Updated: 2026-10-27T10:59:18.341Z

cve-icon NVD

Status : Awaiting Analysis

Published: 2026-10-20T19:17:34.050

Modified: 2026-10-27T11:17:28.133

Link: CVE-2026-113714

cve-icon Redhat

Severity : Moderate

Publid Date: 2026-10-20T19:09:45Z

Links: CVE-2026-113714 - Bugzilla

cve-icon OpenCVE Enrichment

Updated: 2026-10-22T20:30:12Z

Weaknesses
  • CWE-354

    Improper Validation of Integrity Check Value

  • CWE-494

    Download of Code Without Integrity Check