Cloudanix VulnDB

CVE-2026-24049

High · 7.1

CVSS

7.1

EPSS

0.4%

Published

Jan 22, 2026

CISA due date

—

Cloudanix analysis

Next patch cycle SSVC: Track

A malicious Python package file could trick vulnerable tooling into loosening permissions on important files, potentially letting an attacker alter systems or build outputs.

Chainable
Exploitation
Requires User Interaction
Attacker needs
User Interaction
Complexity
Low
Impact
Privilege Gain
Component
Library
Class
Path Traversal
Remediation
Upgrade
Effort
Medium
Patch risk
Low

What it actually does

The vulnerable wheel unpack logic in versions 0.40.0 through 0.46.1 can apply file permissions to a path taken directly from a wheel archive header after extraction path sanitization has already occurred. A crafted wheel can therefore cause chmod-style permission changes on files outside the intended extraction directory if the unpacking process has sufficient filesystem rights. The primary technical risk is unauthorized permission modification of sensitive files, which can enable privilege escalation, tampering with scripts or configuration, weakening SSH key protections, or preparing files for later arbitrary code execution. The issue requires a user, automation job, or build process to unpack a malicious wheel file locally; it is not a direct unauthenticated network exploit.

Why it matters to the business

Organizations that unpack third-party, untrusted, or externally supplied Python wheel files in developer workstations, CI/CD systems, build containers, packaging pipelines, or appliance images could have critical files made writable or executable by an attacker. If the unpacking process runs with elevated privileges, the impact can include compromised build infrastructure, modified software artifacts, local privilege escalation, service disruption, or persistent unauthorized access. The current EPSS is low and the issue is not listed in CISA KEV or known ransomware use, but the flaw is 200 days old and affects common Python packaging workflows, so remediation should be prioritized where automated unpacking of untrusted wheels occurs.

How an attack unfolds

An attacker creates a malicious Python wheel whose archive metadata contains a filename or path intended to reference a sensitive location outside the extraction directory, along with permission bits that make the target file more permissive. The attacker then gets a victim, developer tool, dependency review process, CI job, package mirror, or build pipeline to run wheel unpack against that file. During extraction, the file placement may be sanitized into the intended output directory, but the subsequent permission-setting operation uses the original archive header path instead of the sanitized extraction path. If the process has access to the referenced target, permissions on that outside file can be changed. The attacker can then take advantage of the weakened permissions by modifying sensitive configuration, writable scripts, startup files, SSH-related files, or other files that influence execution or access. In high-privilege build or container contexts, this can become local privilege escalation, build tampering, or arbitrary code execution through later execution of modified files.

How to fix it

Upgrade wheel to version 0.46.2 or later wherever wheel files are unpacked or processed. For the listed affected packages, update prometheus-fips-3.7 on MinimOS to 3.7.3-r0 or later, and update pypa/wheel to a version containing commit eba4036ccaca4e2d0c5b5bf3e3be59b2b2877d6b or the released 0.46.2 fix. Rebuild base images, CI runner images, developer containers, and packaging tools that vendor or pin vulnerable wheel versions. As compensating controls, do not unpack untrusted wheels as root or with broad filesystem permissions, run package inspection in disposable sandboxes or containers with read-only mounts, restrict write access to sensitive host paths, and scan incoming wheel archives for absolute paths, parent-directory traversal segments, and suspicious permission modes before processing. Treat any previously processed untrusted wheel as potentially unsafe until the processing environment and file permissions have been reviewed.

How to confirm the fix worked

Confirm the installed version with commands such as python -m wheel version, wheel version, pip show wheel, pip freeze, package manager inventory, SBOM output, and container image scans; vulnerable versions are 0.40.0 through 0.46.1, and fixed versions are 0.46.2 or later. Validate operating-system packages against vendor advisories, including prometheus-fips-3.7 fixed in 3.7.3-r0. Check CI runner images, build containers, virtual environments, developer toolchains, and vendored dependencies rather than only system Python packages. In an isolated non-production sandbox, process a benign test wheel designed to exercise unsafe path handling and verify that permission changes are confined to the intended extraction directory and never affect files outside it. Compare permissions on sensitive files before and after testing, and confirm that automation no longer processes untrusted wheels with elevated privileges.

Typical attack path

  1. Identify a workflow where Python wheel files are unpacked, inspected, converted, or processed using vulnerable wheel versions 0.40.0 through 0.46.1.
  2. Craft or supply a malicious .whl archive containing archive header paths that reference files outside the intended unpack directory and permission bits that weaken those files.
  3. Deliver the wheel through a dependency submission, package review process, source repository, artifact store, build input, email attachment, or other supply-chain path.
  4. Cause a user or automated process to run wheel unpack or an equivalent unpack operation against the malicious wheel.
  5. Rely on the vulnerable chmod operation to apply permissions to the attacker-controlled header path rather than only to the sanitized extracted file path.
  6. Use the newly permissive target file to modify scripts, configuration, credentials-related files, or execution paths.
  7. Trigger execution, authentication, service restart, or another follow-on action that makes the permission change useful for privilege escalation, persistence, tampering, or disruption.

How to detect it

To determine whether exploitation already occurred, review endpoint telemetry, shell history, CI/CD logs, build job logs, package inspection logs, artifact repository records, and Linux audit logs for wheel unpack operations against untrusted or unusual .whl files. Correlate those events with file permission changes, especially chmod, fchmod, chown-adjacent activity, or mode changes affecting sensitive files outside the wheel extraction directory. On Linux systems, inspect auditd records for chmod/fchmod/fchmodat syscalls by python, python3, wheel, pip-related wrappers, build tools, or CI runner users shortly after a wheel unpack command. Review filesystem metadata and backups for unexpected mode changes on /etc/passwd, /etc/shadow, /etc/sudoers, SSH authorized_keys files, private keys, service unit files, cron files, shell startup scripts, application configuration, and build scripts. Examine suspicious wheel artifacts with archive listing tools and look for member names containing absolute paths, ../ traversal, or permission modes that grant group/world write access or unexpected execute bits. If available, compare current file permissions against known-good baselines from configuration management, package verification tools, or host integrity monitoring. There are no public threat actors or ransomware campaigns associated with this issue in the provided data, so detection should focus on behavioral evidence: vulnerable wheel unpack execution followed by unexpected permission changes outside the extraction path.

  • wheel unpack
  • python -m wheel unpack
  • python3 -m wheel unpack
  • .whl
  • ../
  • ../../
  • ../../../
  • /etc/passwd
  • /etc/shadow
  • /etc/sudoers
  • /root/.ssh/authorized_keys
  • /.ssh/authorized_keys
  • /.ssh/id_rsa
  • /etc/cron.d/
  • /etc/crontab
  • /etc/systemd/system/
  • chmod 777
  • chmod 666
  • mode=0777
  • mode=0666
  • fchmodat
  • SYSCALL=chmod
  • SYSCALL=fchmod
  • SYSCALL=fchmodat

What your security team should do

  • Inventory all locations where Python wheel files are unpacked, inspected, mirrored, converted, or processed, with priority on CI/CD, build systems, package review workflows, and container image builds.
  • Upgrade wheel to 0.46.2 or later and update affected downstream packages, including prometheus-fips-3.7 to 3.7.3-r0 or later where applicable.
  • Rebuild and redeploy golden images, build runner images, developer containers, and virtual environments that may contain vulnerable wheel versions.
  • Block or quarantine untrusted .whl files containing absolute paths, parent-directory traversal sequences, or suspicious permission modes until they are reviewed in a sandbox.
  • Ensure wheel unpacking and dependency inspection jobs run as non-root users inside isolated containers with read-only mounts for host-sensitive paths.
  • Review historical CI logs, shell histories, artifact processing records, and audit logs for wheel unpack activity involving untrusted or externally supplied wheels.
  • Perform targeted permission audits on sensitive files in environments where vulnerable wheel versions processed untrusted input.
  • Add detections for wheel unpack command execution followed by chmod or permission changes to sensitive paths such as /etc, SSH directories, service files, shell startup files, and build scripts.
  • Treat this as supply-chain relevant even though it is not currently in KEV and has low EPSS, because exploitation depends on workflow exposure rather than internet-facing reachability.

The record

wheel is a command line tool for manipulating Python wheel files, as defined in PEP 427. In versions 0.40.0 through 0.46.1, the unpack function is vulnerable to file permission modification through mishandling of file permissions after extraction. The logic blindly trusts the filename from the archive header for the chmod operation, even though the extraction process itself might have sanitized the path. Attackers can craft a malicious wheel file that, when unpacked, changes the permissions of critical system files (e.g., /etc/passwd, SSH keys, config files), allowing for Privilege Escalation or arbitrary code execution by modifying now-writable scripts. This issue has been fixed in version 0.46.2.

Affected packages

Ecosystem Package Introduced Fixed
PyPI wheel 0.40.0 0.46.2
Chainguard airflow-2 0 2.11.0-r25
Chainguard airflow-3 0 3.1.6-r2
Chainguard ansible-operator 0 1.42.0-r6
Chainguard ansible-operator-fips 0 1.42.0-r4
Chainguard apache-beam-python-3.11-sdk 0 2.71.0-r0
Chainguard authentik 0 2025.12.1-r2
Chainguard authentik-fips 0 2025.12.1-r2
Chainguard aws-cli-2 0 2.33.1-r0
Chainguard awx 0 24.6.1-r26
Chainguard dask-kubernetes 0 2025.7.0-r8
Chainguard datadog-agent-7.71 0 7.71.2-r9
Chainguard datadog-agent-7.72 0 7.72.4-r7
Chainguard datadog-agent-7.73 0 7.73.3-r4
Chainguard datadog-agent-7.74 0 7.74.1-r5
Chainguard datadog-agent-7.75-core-integrations 0 7.75.4-r2
Chainguard datadog-agent-fips-7.71 0 7.71.2-r6
Chainguard datadog-agent-fips-7.72 0 7.72.4-r4
Chainguard datadog-agent-fips-7.73 0 7.73.3-r3
Chainguard datadog-agent-fips-7.74 0 7.74.1-r4
Chainguard datadog-agent-fips-7.75-core-integrations 0 7.75.4-r1
Chainguard katib-earlystopping 0 0.19.0-r5
Chainguard katib-suggestion-hyperband 0 0.19.0-r5
Chainguard katib-suggestion-hyperopt 0 0.19.0-r5
Chainguard katib-suggestion-nas-darts 0 0.19.0-r5
Chainguard katib-suggestion-optuna-enas 0 0.19.0-r5
Chainguard katib-suggestion-pbt-enas 0 0.19.0-r5
Chainguard katib-suggestion-skopt-enas 0 0.19.0-r5
Chainguard kserve-storage-controller 0 0.16.0-r11
Chainguard kubeflow-jupyter-web-app 0 1.10.0-r11
Chainguard label-studio 0 1.22.0-r3
Chainguard mlflow 0 3.8.1-r3
Chainguard mlflow-iamguarded-compat 0 3.8.1-r3
Chainguard nemo 0 2.6.1-r2
Chainguard opal 0 0.9.3-r1
Chainguard open-webui 0 0.8.3-r0
Chainguard pip-zipapp 0 26.0.1-r0
Chainguard py3-semgrep 0 1.150.0-r0
Chainguard py3.10-ambassador 0 3.10.0-r19
Chainguard py3.10-duplicity 0 3.0.7-r2
Chainguard py3.10-setuptools 0 80.10.2-r0
Chainguard py3.11-ambassador 0 3.10.0-r19
Chainguard py3.11-azure-functions-worker 0 4.42.0-r0
Chainguard py3.11-duplicity 0 3.0.7-r2
Chainguard py3.11-setuptools 0 80.10.2-r0
Chainguard py3.11-text-generation-inference 0 3.3.7-r6
Chainguard py3.12-ambassador 0 3.10.0-r19
Chainguard py3.12-azure-functions-worker 0 4.42.0-r0
Chainguard py3.12-duplicity 0 3.0.7-r2
Chainguard py3.12-setuptools 0 80.10.2-r0
Chainguard py3.13-ambassador 0 3.10.0-r19
Chainguard py3.13-azure-functions-worker 0 4.42.0-r0
Chainguard py3.13-duplicity 0 3.0.7-r2
Chainguard py3.13-setuptools 0 80.10.2-r0
Chainguard py3.14-setuptools 0 80.10.2-r0
Chainguard py3.9-setuptools 0 80.10.2-r0
Chainguard pypy-3.10 0 7.3.19-r14
Chainguard pypy-3.11 0 7.3.20-r5
Chainguard spamcheck 0 3.5.3-r6
Chainguard superset-5.0 0 5.0.0-r14
Chainguard superset-6.0 0 6.0.0-r1
Chainguard tensorflow-cpu-jupyter 0 2.20.0-r9
Chainguard tensorflow-gpu-jupyter 0 2.20.0-r8
Chainguard tritonserver-backend-vllm-cuda-12.9 0 25.9.0_git20251112-r6
SUSE:Linux Enterprise High Performance Computing 15 SP4-ESPOS python-wheel 0 0.40.0-150400.13.10.1
SUSE:Linux Enterprise High Performance Computing 15 SP4-LTSS python-wheel 0 0.40.0-150400.13.10.1
SUSE:Linux Enterprise High Performance Computing 15 SP5-ESPOS python-wheel 0 0.40.0-150400.13.10.1
SUSE:Linux Enterprise High Performance Computing 15 SP5-LTSS python-wheel 0 0.40.0-150400.13.10.1
SUSE:Linux Enterprise Module for Public Cloud 15 SP4 python-wheel 0 0.40.0-150400.13.10.1
SUSE:Linux Enterprise Module for Python 3 15 SP7 python-wheel 0 0.42.0-150600.3.3.1
SUSE:Linux Enterprise Server 15 SP4-LTSS python-wheel 0 0.40.0-150400.13.10.1
SUSE:Linux Enterprise Server 15 SP5-LTSS python-wheel 0 0.40.0-150400.13.10.1
SUSE:Linux Enterprise Server 15 SP6-LTSS python-wheel 0 0.42.0-150600.3.3.1
SUSE:Linux Enterprise Server for SAP Applications 15 SP4 python-wheel 0 0.40.0-150400.13.10.1
SUSE:Linux Enterprise Server for SAP Applications 15 SP5 python-wheel 0 0.40.0-150400.13.10.1
SUSE:Linux Enterprise Server for SAP Applications 15 SP6 python-wheel 0 0.42.0-150600.3.3.1
Wolfi airflow-3 0 3.1.6-r2
Wolfi ansible-operator 0 1.42.0-r6
Wolfi aws-cli-2 0 2.33.1-r0
Wolfi dask-kubernetes 0 2025.7.0-r8
Wolfi datadog-agent-7.72 0 7.72.4-r7
Wolfi datadog-agent-7.73 0 7.73.3-r4
Wolfi datadog-agent-7.74 0 7.74.1-r5
Wolfi datadog-agent-7.75-core-integrations 0 7.75.4-r2
Wolfi katib-earlystopping 0 0.19.0-r5
Wolfi katib-suggestion-hyperband 0 0.19.0-r5
Wolfi katib-suggestion-hyperopt 0 0.19.0-r5
Wolfi katib-suggestion-nas-darts 0 0.19.0-r5
Wolfi katib-suggestion-optuna-enas 0 0.19.0-r5
Wolfi katib-suggestion-pbt-enas 0 0.19.0-r5
Wolfi katib-suggestion-skopt-enas 0 0.19.0-r5
Wolfi kserve-storage-controller 0 0.16.0-r11
Wolfi kubeflow-jupyter-web-app 0 1.10.0-r11
Wolfi mlflow 0 3.8.1-r3
Wolfi mlflow-iamguarded-compat 0 3.8.1-r3
Wolfi open-webui 0 0.8.3-r0
Wolfi pip-zipapp 0 26.0.1-r0
Wolfi py3-semgrep 0 1.150.0-r0
Wolfi py3.10-ambassador 0 3.10.0-r19
Wolfi py3.10-setuptools 0 80.10.2-r0
Wolfi py3.11-ambassador 0 3.10.0-r19
Wolfi py3.11-setuptools 0 80.10.2-r0
Wolfi py3.12-ambassador 0 3.10.0-r19
Wolfi py3.12-setuptools 0 80.10.2-r0
Wolfi py3.13-ambassador 0 3.10.0-r19
Wolfi py3.13-setuptools 0 80.10.2-r0
Wolfi py3.14-setuptools 0 80.10.2-r0
Wolfi pypy-3.10 0 7.3.19-r14
Wolfi pypy-3.11 0 7.3.20-r5
Wolfi superset-5.0 0 5.0.0-r14
Wolfi superset-6.0 0 6.0.0-r1
Wolfi tensorflow-cpu-jupyter 0 2.20.0-r9
openSUSE:Leap 15.6 python-wheel 0 0.42.0-150600.3.3.1
openSUSE:Leap 15.6 python-wheel 0 0.40.0-150400.13.10.1
openSUSE:Leap 16.0 python-wheel 0 0.45.1-160000.3.1
openSUSE:Tumbleweed python-wheel 0 0.46.3-1.1
pypi wheel 0.40.0 No fix

Related vulnerabilities