CVE-2025-8869
NoneCVSS
—
EPSS
0.5%
Published
Sep 24, 2025
CISA due date
—
Cloudanix analysis
A packaging tool could let attackers secretly place harmful files anywhere on a computer when installing certain software packages from the internet.
- Exploitation
- Requires User Interaction
- Attacker needs
- User Interaction
- Complexity
- Moderate
- Impact
- Data Tampering
- Component
- Application
- Class
- Path Traversal
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
The flaw permits path traversal during tar extraction because pip's fallback implementation does not enforce that symbolic links resolve inside the target directory when the Python tarfile module lacks PEP 706 support.
Why it matters to the business
Attackers can overwrite arbitrary files on systems during package installation from untrusted sources, risking system integrity compromise and requiring urgent remediation on affected Debian deployments of crmsh.
How an attack unfolds
An attacker creates a malicious source distribution tar archive containing symbolic links pointing outside the intended extraction directory. When a victim uses pip on a Python version without PEP 706, the fallback code extracts the archive and writes files to arbitrary locations on the filesystem.
How to fix it
Upgrade crmsh to 4.2.1-2 on Debian 11-14; alternatively upgrade pip or migrate to Python versions implementing PEP 706 (>=3.9.17, >=3.10.12, >=3.11.4, >=3.12) so the vulnerable fallback is never used.
How to confirm the fix worked
Confirm Python meets the listed PEP 706 minimum versions or that pip has been updated past the vulnerable fallback; test extraction of a crafted tar containing an escaping symlink to verify containment.
Typical attack path
- Craft a tar archive with malicious symbolic links that escape the extraction root
- Publish the archive as a source distribution
- Trick a user or automated process into installing the package with pip on vulnerable Python
- Trigger extraction that follows the links and overwrites files outside the intended directory
How to detect it
Review pip installation logs and extraction activity for paths that resolve outside expected package directories; correlate with file creation timestamps in system locations that should not be modified during package installs.
What your security team should do
- Apply the crmsh 4.2.1-2 updates on all listed Debian releases immediately
- Enforce deployment of Python versions that implement PEP 706 across build and runtime environments
- Treat source distributions as untrusted and inspect them before installation as a standing practice
The record
When extracting a tar archive pip may not check symbolic links point into the extraction directory if the tarfile module doesn't implement PEP 706. Note that upgrading pip to a "fixed" version for this vulnerability doesn't fix all known vulnerabilities that are remediated by using a Python version that implements PEP 706. Note that this is a vulnerability in pip's fallback implementation of tar extraction for Python versions that don't implement PEP 706 and therefore are not secure to all vulnerabilities in the Python 'tarfile' module. If you're using a Python version that implements PEP 706 then pip doesn't use the "vulnerable" fallback code. Mitigations include upgrading to a version of pip that includes the fix, upgrading to a Python version that implements PEP 706 (Python >=3.9.17, >=3.10.12, >=3.11.4, or >=3.12), applying the linked patch, or inspecting source distributions (sdists) before installation as is already a best-practice.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| PyPI | pip | 0 | No fix |
| PyPI | pip | 0 | 25.3 |
| Bitnami | pip | 0 | 25.3.0 |
| Chainguard | airflow-2 | 0 | 2.11.0-r14 |
| Chainguard | airflow-2-bitnami-compat | 0 | 2.11.0-r14 |
| Chainguard | airflow-2-compat | 0 | 2.11.0-r14 |
| Chainguard | airflow-2-iamguarded-compat | 0 | 2.11.0-r14 |
| Chainguard | airflow-3 | 0 | 3.1.2-r0 |
| Chainguard | airflow-3-compat | 0 | 3.1.2-r0 |
| Chainguard | airflow-3-iamguarded-compat | 0 | 3.1.2-r0 |
| Chainguard | ansible-operator | 0 | 1.41.0-r1 |
| Chainguard | ansible-operator-compat | 0 | 1.41.0-r1 |
| Chainguard | awx | 0 | 24.6.1-r19 |
| Chainguard | dask-gateway | 0 | 2025.4.0-r5 |
| Chainguard | dask-gateway-server | 0 | 2025.4.0-r5 |
| Chainguard | datadog-agent | 0 | 7.71.2-r3 |
| Chainguard | datadog-agent-core-integrations | 0 | 7.72.2-r0 |
| Chainguard | datadog-agent-core-integrations-fips | 0 | 7.72.0-r0 |
| Chainguard | datadog-agent-fakeintake | 0 | 7.72.1-r0 |
| Chainguard | datadog-agent-fakeintake-fips | 0 | 7.72.0-r0 |
| Chainguard | datadog-agent-fips | 0 | 7.72.0-r0 |
| Chainguard | datadog-agent-jmx | 0 | 7.72.1-r0 |
| Chainguard | datadog-agent-jmx-fips | 0 | 7.72.0-r0 |
| Chainguard | datadog-agent-oci-compat | 0 | 7.71.2-r3 |
| Chainguard | datadog-agent-oci-compat-fips | 0 | 7.72.0-r0 |
| Chainguard | datadog-agent-s6-overlay | 0 | 7.71.2-r3 |
| Chainguard | datadog-agent-s6-overlay-fips | 0 | 7.72.0-r0 |
| Chainguard | datadog-cluster-agent | 0 | 7.71.2-r3 |
| Chainguard | datadog-cluster-agent-fips | 0 | 7.72.1-r0 |
| Chainguard | datadog-cluster-agent-oci-compat | 0 | 7.71.2-r3 |
| Chainguard | datadog-cluster-agent-oci-compat-fips | 0 | 7.72.0-r0 |
| Chainguard | dogstatsd | 0 | 7.72.1-r0 |
| Chainguard | graalvm-23 | 0 | 23.0.2-r7 |
| Chainguard | graalvm-23-ce | 0 | 23.0.2-r7 |
| Chainguard | graalvm-23-ce-dbg | 0 | 23.0.2-r7 |
| Chainguard | graalvm-23-ce-default-jdk | 0 | 23.0.2-r7 |
| Chainguard | graalvm-23-ce-jmods | 0 | 23.0.2-r7 |
| Chainguard | graalvm-23-ce-nodejs | 0 | 23.0.2-r7 |
| Chainguard | graalvm-23-ce-nodejs-dbg | 0 | 23.0.2-r7 |
| Chainguard | graalvm-23-ce-nodejs-default-jdk | 0 | 23.0.2-r7 |
| Chainguard | graalvm-23-ce-nodejs-jmods | 0 | 23.0.2-r7 |
| Chainguard | graalvm-23-truffleruby | 0 | 23.0.2-r7 |
| Chainguard | graalvm-24 | 0 | 24.0.2-r6 |
| Chainguard | graalvm-24-ce | 0 | 24.0.2-r6 |
| Chainguard | graalvm-24-ce-dbg | 0 | 24.0.2-r6 |
| Chainguard | graalvm-24-ce-default-jdk | 0 | 24.0.2-r6 |
| Chainguard | graalvm-24-ce-jmods | 0 | 24.0.2-r6 |
| Chainguard | graalvm-24-ce-nodejs | 0 | 24.0.2-r6 |
| Chainguard | graalvm-24-ce-nodejs-dbg | 0 | 24.0.2-r6 |
| Chainguard | graalvm-24-ce-nodejs-default-jdk | 0 | 24.0.2-r6 |
| Chainguard | graalvm-24-ce-nodejs-jmods | 0 | 24.0.2-r6 |
| Chainguard | graalvm-24-truffleruby | 0 | 24.0.2-r6 |
| Chainguard | graalvm-25 | 0 | 25.0.1-r0 |
| Chainguard | graalvm-25-ce | 0 | 25.0.1-r0 |
| Chainguard | graalvm-25-ce-dbg | 0 | 25.0.1-r0 |
| Chainguard | graalvm-25-ce-default-jdk | 0 | 25.0.1-r0 |
| Chainguard | graalvm-25-ce-jmods | 0 | 25.0.1-r0 |
| Chainguard | graalvm-25-ce-nodejs | 0 | 25.0.1-r0 |
| Chainguard | graalvm-25-ce-nodejs-dbg | 0 | 25.0.1-r0 |
| Chainguard | graalvm-25-ce-nodejs-default-jdk | 0 | 25.0.1-r0 |
| Chainguard | graalvm-25-ce-nodejs-jmods | 0 | 25.0.1-r0 |
| Chainguard | graalvm-25-truffleruby | 0 | 25.0.1-r0 |
| Chainguard | katib-controller | 0 | 0.19.0-r0 |
| Chainguard | katib-controller-compat | 0 | 0.19.0-r0 |
| Chainguard | katib-db-manager | 0 | 0.19.0-r0 |
| Chainguard | katib-db-manager-compat | 0 | 0.19.0-r0 |
| Chainguard | katib-earlystopping | 0 | 0.19.0-r0 |
| Chainguard | katib-file-metricscollector | 0 | 0.19.0-r0 |
| Chainguard | katib-file-metricscollector-compat | 0 | 0.19.0-r0 |
| Chainguard | katib-suggestion-goptuna | 0 | 0.19.0-r0 |
| Chainguard | katib-suggestion-goptuna-compat | 0 | 0.19.0-r0 |
| Chainguard | katib-suggestion-hyperband | 0 | 0.19.0-r0 |
| Chainguard | katib-suggestion-hyperopt | 0 | 0.19.0-r0 |
| Chainguard | katib-suggestion-nas-darts | 0 | 0.19.0-r0 |
| Chainguard | katib-suggestion-nas-enas | 0 | 0.19.0-r0 |
| Chainguard | katib-suggestion-optuna-enas | 0 | 0.19.0-r0 |
| Chainguard | katib-suggestion-pbt-enas | 0 | 0.19.0-r0 |
| Chainguard | katib-suggestion-skopt-enas | 0 | 0.19.0-r0 |
| Chainguard | katib-tfevent-metricscollector | 0 | 0.19.0-r0 |
| Chainguard | kubeflow-katib | 0 | 0.19.0-r0 |
| Chainguard | localstack | 0 | 4.10.0-r0 |
| Chainguard | localstack-compat | 0 | 4.10.0-r0 |
| Chainguard | mlflow | 0 | 3.6.0-r0 |
| Chainguard | mlflow-bitnami | 0 | 3.6.0-r0 |
| Chainguard | mlflow-iamguarded-compat | 0 | 3.6.0-r0 |
| Chainguard | nemo | 0 | 2.5.2-r2 |
| Chainguard | nvidia-apex-12.3-wheel | 0 | 24.04.01-r1 |
| Chainguard | pgadmin4 | 0 | 9.9-r1 |
| Chainguard | pgadmin4-oci-entrypoint | 0 | 9.9-r1 |
| Chainguard | py3-cassandra-medusa-compat | 0 | 0.26.0-r0 |
| Chainguard | py3-hashin | 0 | 1.0.5-r4 |
| Chainguard | py3-pip | 0 | 0 |
| Chainguard | py3-pip | 0 | 25.2-r2 |
| Chainguard | py3-pip-wheel | 0 | 0 |
| Chainguard | py3-pip-wheel | 0 | 25.2-r2 |
| Chainguard | py3-pip-wheel-bootstrap | 0 | 25.3-r0 |
| Chainguard | py3-supported-pip | 0 | 0 |
| Chainguard | py3-supported-pip | 0 | 25.2-r2 |
| Chainguard | py3-supported-virtualenv | 0 | 20.35.4-r0 |
| Chainguard | py3-virtualenv | 0 | 20.35.4-r0 |
| Chainguard | py3.10-pip | 0 | 0 |
| Chainguard | py3.10-pip | 0 | 25.2-r2 |
| Chainguard | py3.10-pip-base | 0 | 0 |
| Chainguard | py3.10-pip-base | 0 | 25.2-r2 |
| Chainguard | py3.10-pytorch-cuda-11.8 | 0 | 2.3.1-r12 |
| Chainguard | py3.10-virtualenv | 0 | 20.36.1-r0 |
| Chainguard | py3.10-virtualenv-bin | 0 | 20.35.4-r0 |
| Chainguard | py3.10-wheels-torch-cuda-11.8 | 0 | 2.3.1-r12 |
| Chainguard | py3.10-wheels-torch-cuda-12.3 | 0 | 2.3.1-r12 |
| Chainguard | py3.10-wheels-torchvision-cuda-12.3 | 0 | 0.18.1-r12 |
| Chainguard | py3.11-pip | 0 | 0 |
| Chainguard | py3.11-pip | 0 | 25.2-r2 |
| Chainguard | py3.11-pip-base | 0 | 0 |
| Chainguard | py3.11-pip-base | 0 | 25.2-r2 |
| Chainguard | py3.11-virtualenv | 0 | 20.36.1-r0 |
| Chainguard | py3.11-virtualenv-bin | 0 | 20.35.4-r0 |
| Chainguard | py3.11-wheels-torch-cuda-11.8 | 0 | 2.3.1-r11 |
| Chainguard | py3.11-wheels-torch-cuda-12.3 | 0 | 2.3.1-r15 |
| Chainguard | py3.11-wheels-torchaudio-cuda-12.3 | 0 | 2.3.1-r4 |
| Chainguard | py3.11-wheels-torchvision-cuda-12.3 | 0 | 0.18.1-r14 |
| Chainguard | py3.12-pip | 0 | 0 |
| Chainguard | py3.12-pip | 0 | 25.2-r2 |
| Chainguard | py3.12-pip-base | 0 | 0 |
| Chainguard | py3.12-pip-base | 0 | 25.2-r2 |
| Chainguard | py3.12-pytorch-cuda-11.8 | 0 | 2.3.1-r10 |
| Chainguard | py3.12-virtualenv | 0 | 20.36.1-r0 |
| Chainguard | py3.12-virtualenv-bin | 0 | 20.35.4-r0 |
| Chainguard | py3.12-wheels-torch-cuda-11.8 | 0 | 2.3.1-r10 |
| Chainguard | py3.12-wheels-torch-cuda-12.3 | 0 | 2.3.1-r8 |
| Chainguard | py3.12-wheels-torchvision-cuda-12.3 | 0 | 0.18.1-r6 |
| Chainguard | py3.13-pip | 0 | 0 |
| Chainguard | py3.13-pip | 0 | 25.2-r2 |
| Chainguard | py3.13-pip-base | 0 | 0 |
| Chainguard | py3.13-pip-base | 0 | 25.2-r2 |
| Chainguard | py3.13-virtualenv | 0 | 20.36.1-r0 |
| Chainguard | py3.13-virtualenv-bin | 0 | 20.35.4-r0 |
| Chainguard | py3.14-pip | 0 | 0 |
| Chainguard | py3.14-pip | 0 | 25.2-r2 |
| Chainguard | py3.14-pip-base | 0 | 0 |
| Chainguard | py3.14-pip-base | 0 | 25.2-r2 |
| Chainguard | py3.9-pip | 0 | 0 |
| Chainguard | py3.9-pip | 0 | 25.2-r1 |
| Chainguard | py3.9-wheels-torch-cuda-11.8 | 0 | 2.3.1-r4 |
| Chainguard | py3.9-wheels-torch-cuda-12.3 | 0 | 2.3.1-r7 |
| Chainguard | py3.9-wheels-torchvision-cuda-11.8 | 0 | 0.18.1-r7 |
| Chainguard | py3.9-wheels-torchvision-cuda-12.3 | 0 | 0.18.1-r5 |
| Chainguard | pypy-3.10 | 0 | 7.3.19-r14 |
| Chainguard | pypy-3.10-compat | 0 | 7.3.19-r13 |
| Chainguard | pypy-3.11 | 0 | 7.3.20-r5 |
| Chainguard | pypy-3.11-compat | 0 | 7.3.20-r4 |
| Chainguard | reflex | 0 | 0.8.14-r0 |
| Chainguard | request-1276-compat | 0 | 0.26.0-r0 |
| Chainguard | tensorflow-cpu-jupyter | 0 | 2.20.0-r4 |
| Chainguard | tensorflow-gpu-jupyter | 0 | 2.20.0-r3 |
| Wolfi | airflow-3 | 0 | 3.1.2-r0 |
| Wolfi | airflow-3-compat | 0 | 3.1.2-r0 |
| Wolfi | airflow-3-iamguarded-compat | 0 | 3.1.2-r0 |
| Wolfi | ansible-operator | 0 | 1.41.0-r1 |
| Wolfi | ansible-operator-compat | 0 | 1.41.0-r1 |
| Wolfi | dask-gateway | 0 | 2025.4.0-r5 |
| Wolfi | dask-gateway-server | 0 | 2025.4.0-r5 |
| Wolfi | datadog-agent | 0 | 7.71.2-r3 |
| Wolfi | datadog-agent-core-integrations | 0 | 7.72.2-r0 |
| Wolfi | datadog-agent-fakeintake | 0 | 7.72.1-r0 |
| Wolfi | datadog-agent-jmx | 0 | 7.72.1-r0 |
| Wolfi | datadog-agent-oci-compat | 0 | 7.71.2-r3 |
| Wolfi | datadog-agent-s6-overlay | 0 | 7.71.2-r3 |
| Wolfi | datadog-cluster-agent | 0 | 7.71.2-r3 |
| Wolfi | datadog-cluster-agent-oci-compat | 0 | 7.71.2-r3 |
| Wolfi | dogstatsd | 0 | 7.72.1-r0 |
| Wolfi | katib-controller | 0 | 0.19.0-r0 |
| Wolfi | katib-controller-compat | 0 | 0.19.0-r0 |
| Wolfi | katib-db-manager | 0 | 0.19.0-r0 |
| Wolfi | katib-db-manager-compat | 0 | 0.19.0-r0 |
| Wolfi | katib-earlystopping | 0 | 0.19.0-r0 |
| Wolfi | katib-file-metricscollector | 0 | 0.19.0-r0 |
| Wolfi | katib-file-metricscollector-compat | 0 | 0.19.0-r0 |
| Wolfi | katib-suggestion-goptuna | 0 | 0.19.0-r0 |
| Wolfi | katib-suggestion-goptuna-compat | 0 | 0.19.0-r0 |
| Wolfi | katib-suggestion-hyperband | 0 | 0.19.0-r0 |
| Wolfi | katib-suggestion-hyperopt | 0 | 0.19.0-r0 |
| Wolfi | katib-suggestion-nas-darts | 0 | 0.19.0-r0 |
| Wolfi | katib-suggestion-nas-enas | 0 | 0.19.0-r0 |
| Wolfi | katib-suggestion-optuna-enas | 0 | 0.19.0-r0 |
| Wolfi | katib-suggestion-pbt-enas | 0 | 0.19.0-r0 |
| Wolfi | katib-suggestion-skopt-enas | 0 | 0.19.0-r0 |
| Wolfi | katib-tfevent-metricscollector | 0 | 0.19.0-r0 |
| Wolfi | kubeflow-katib | 0 | 0.19.0-r0 |
| Wolfi | mlflow | 0 | 3.6.0-r0 |
| Wolfi | mlflow-bitnami | 0 | 3.6.0-r0 |
| Wolfi | mlflow-iamguarded-compat | 0 | 3.6.0-r0 |
| Wolfi | py3-cassandra-medusa-compat | 0 | 0.26.0-r0 |
| Wolfi | py3-pip | 0 | 0 |
| Wolfi | py3-pip | 0 | 25.2-r2 |
| Wolfi | py3-pip-wheel | 0 | 0 |
| Wolfi | py3-pip-wheel | 0 | 25.2-r2 |
| Wolfi | py3-pip-wheel-bootstrap | 0 | 25.3-r0 |
| Wolfi | py3-supported-pip | 0 | 0 |
| Wolfi | py3-supported-pip | 0 | 25.2-r2 |
| Wolfi | py3-supported-virtualenv | 0 | 20.35.4-r0 |
Related vulnerabilities
- CVE-2026-1703 When pip is installing and extracting a maliciously crafted wheel archive, files may be… Also affects pip
- CVE-2026-4539 A security flaw has been discovered in pygments up to 2.19.2. Also affects airflow-2
- CVE-2026-30922 pyasn1 is a generic ASN.1 library for Python. Also affects airflow-2
- CVE-2026-27448 pyOpenSSL is a Python wrapper around the OpenSSL library. Also affects airflow-2
- CVE-2026-27459 pyOpenSSL is a Python wrapper around the OpenSSL library. Also affects airflow-2
- CVE-2026-32597 PyJWT is a JSON Web Token implementation in Python. Also affects airflow-2
- CVE-2026-31958 Tornado is a Python web framework and asynchronous networking library. Also affects airflow-2
- CVE-2026-25604 In AWS Auth manager, the origin of the SAML authentication has been used as provided by… Also affects airflow-2