Cloudanix VulnDB

CVE-2026-113714

None

CVSS

—

EPSS

0.2%

Published

Oct 20, 2026

CISA due date

—

Cloudanix analysis

Next patch cycle SSVC: Track

A bug in a popular Python environment tool could let a malicious package source slip bad files into a shared storage area that later gets used without checking, potentially installing the wrong software during normal development work.

Exploitation
Requires User Interaction
Attacker needs
User Interaction
Complexity
High
Impact
Data Tampering
Component
Library
Class
Improper Input Validation
Remediation
Upgrade
Effort
Medium
Patch risk
Low

What it actually does

virtualenv's download_wheel writes unverified wheel downloads from a package index into the reusable cache before selecting and hashing a verification target; a forged Saved line injected via data-requires-python on a discarded link (or direct control of downloaded data) causes the wrong path to be hashed while leaving a rejected archive in the cache for later unverified use.

Why it matters to the business

Organizations using virtualenv to create Python environments may inadvertently install tampered or unverified packages from a malicious index, leading to supply-chain compromise of development and deployment pipelines until the tool is updated.

How an attack unfolds

An attacker who controls a custom package index supplies a link whose data-requires-python attribute injects a forged Saved line into pip output; when virtualenv later parses that output it selects the attacker's path for hashing, accepts the mismatch, and retains the malicious wheel in the cache for subsequent unverified selection and installation.

How to fix it

Upgrade virtualenv to version 21.14.9 or later on all systems that create Python environments; after upgrade, clear existing wheel caches (typically ~/.cache/pip or the location indicated by pip cache dir) and re-create environments from trusted indexes only.

How to confirm the fix worked

Confirm virtualenv --version reports 21.14.9 or newer; inspect wheel cache directories for files whose timestamps pre-date the upgrade and verify their contents against known-good hashes from PyPI; run virtualenv creation commands against a test index that returns non-PyPI links and verify no unverified wheels are retained.

Typical attack path

  1. Attacker hosts a controlled package index that returns links with crafted data-requires-python attributes
  2. Victim runs virtualenv against the malicious index, triggering download_wheel
  3. download_wheel writes the unverified archive into the wheel cache
  4. Forged Saved line causes virtualenv to hash an attacker-chosen path instead of the genuine wheel
  5. Digest mismatch rejects the archive yet leaves it cached; later operations select the cached malicious wheel without verification

How to detect it

Search pip and virtualenv cache directories for wheel files whose names or contents do not match recorded hashes from trusted indexes; review logs from virtualenv or pip invocations that reference non-PyPI indexes for Saved lines containing unexpected absolute paths; correlate process execution of virtualenv with network connections to untrusted indexes around the time of cache writes.

What your security team should do

  • Immediately inventory all build agents, CI pipelines, and developer workstations for virtualenv versions older than 21.14.9
  • Enforce upgrade to 21.14.9 via package managers or container base-image rebuilds within the next sprint
  • Restrict virtualenv usage to explicit allow-listed indexes and disable default-index digest comparison until patched
  • Add virtualenv version checks to pre-commit hooks and CI gates

The record

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.

Affected packages

Ecosystem Package Introduced Fixed

Related vulnerabilities