CVE-2024-39689
High · 7.5CVSS
7.5
EPSS
1.0%
Published
Jul 5, 2024
CISA due date
—
Cloudanix analysis
A core software component for securing communications mistakenly trusts an unreliable authority, allowing attackers to potentially impersonate legitimate websites and intercept sensitive data.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Moderate
- Impact
- Data Tampering
- Component
- Library
- Class
- Cryptographic Weakness
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
The certifi library, a core component for TLS certificate validation in the Python ecosystem, includes root certificates from the 'GLOBALTRUST' Certificate Authority (CA). This CA has been deemed untrustworthy due to unresolved compliance issues, leading to its removal from major trust stores. Applications using vulnerable versions of certifi will incorrectly trust TLS certificates issued by this CA, enabling an attacker with such a certificate to successfully impersonate a legitimate server, thereby breaking the integrity and authenticity of the TLS connection.
Why it matters to the business
Applications relying on outdated versions of this library are susceptible to Man-in-the-Middle (MitM) attacks, where attackers can impersonate legitimate services to intercept, read, or alter sensitive data in transit. This could lead to the theft of customer data, financial credentials, or internal secrets, resulting in significant financial loss, regulatory fines, and severe reputational damage. Given that certifi is a foundational dependency for countless other libraries (e.g., 'requests'), the vulnerability's reach is extensive, potentially affecting a wide array of web clients, APIs, and internal tools.
How an attack unfolds
An attacker first obtains a TLS certificate from the now-distrusted 'GLOBALTRUST' CA. They then position themselves between a client application and a legitimate server, typically through techniques like DNS poisoning or by controlling a network segment (e.g., public Wi-Fi). When the client, using a vulnerable version of certifi, attempts to connect to the legitimate service, the attacker intercepts the request and presents their malicious server secured with the 'GLOBALTRUST' certificate. The client's certifi library, trusting the 'GLOBALTRUST' root, validates the certificate and establishes a supposedly secure connection with the attacker. The attacker now has full control over the communication channel, allowing them to decrypt traffic, steal credentials, or inject malicious content.
How to fix it
Update the 'certifi' package to version 2024.07.04 or later. This can be accomplished using the standard Python package manager with the command: `pip install --upgrade certifi`. Ensure that all Python environments, virtual environments, container images, and serverless function dependencies are updated. After updating, redeploy any applications that bundle or depend on the certifi library.
How to confirm the fix worked
To verify that the vulnerability has been remediated, check the installed version of the certifi package in your environment. Run `pip show certifi` or `pip list | grep certifi` and confirm that the version is 2024.07.04 or newer. As a functional test, you can inspect the library's certificate bundle (typically `cacert.pem`) to confirm that certificates with 'GLOBALTRUST' in their issuer name have been removed.
Typical attack path
- Attacker obtains a TLS certificate chaining up to a distrusted 'GLOBALTRUST' root.
- Attacker gains a Man-in-the-Middle (MitM) position on the network between a victim client and a target server.
- The victim's application, using a vulnerable version of the certifi library, initiates a connection to the target server.
- The attacker intercepts the TLS handshake and presents their malicious certificate.
- The vulnerable client library validates and trusts the attacker's certificate, establishing a connection to the attacker's server.
- The attacker intercepts and manipulates the communication, potentially stealing sensitive data like credentials or session tokens.
How to detect it
Detecting past exploitation is challenging as it would appear as valid TLS traffic. Focus on analyzing historical network data. Review TLS inspection logs, proxy logs, or network flow data for successful connections where the server certificate's issuer chain contains 'GLOBALTRUST'. Correlate these connections with sensitive endpoints to assess potential data exposure. Proactively, monitor Certificate Transparency (CT) logs for any new certificates being issued by 'GLOBALTRUST' that target your domains.
- TLS certificate issuer containing the string 'GLOBALTRUST'
What your security team should do
- Immediately use a Software Composition Analysis (SCA) tool to identify all instances of the 'certifi' library, including as a transitive dependency, across all codebases and deployed applications.
- Prioritize patching all affected systems by upgrading 'certifi' to version 2024.07.04 or later, focusing first on production and internet-facing applications.
- Update base container images and CI/CD pipeline configurations to ensure all future builds and deployments use the patched version of the library by default.
The record
Certifi is a curated collection of Root Certificates for validating the trustworthiness of SSL certificates while verifying the identity of TLS hosts. Certifi starting in 2021.05.30 and prior to 2024.07.4 recognized root certificates from `GLOBALTRUST`. Certifi 2024.07.04 removes root certificates from `GLOBALTRUST` from the root store. These are in the process of being removed from Mozilla's trust store. `GLOBALTRUST`'s root certificates are being removed pursuant to an investigation which identified "long-running and unresolved compliance issues."
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| PyPI | certifi | 2021.05.30 | 2024.07.04 |
| PyPI | certifi | 2021.5.30 | 2024.7.4 |
| Chainguard | airflow | 0 | 2.9.2-r2 |
| Chainguard | airflow-bitnami-compat | 0 | 2.9.2-r2 |
| Chainguard | airflow-compat | 0 | 2.9.2-r2 |
| Chainguard | az | 0 | 2.61.0-r2 |
| Chainguard | az-iamguarded-compat | 0 | 2.61.0-r2 |
| Chainguard | barman | 0 | 3.10.1-r2 |
| Chainguard | barman-cloudnative-pg | 0 | 3.10.1-r2 |
| Chainguard | checkov | 0 | 3.0.34-r1 |
| Chainguard | confluent-docker-utils | 0 | 0.0.82-r1 |
| Chainguard | dask-gateway | 0 | 2024.1.0-r8 |
| Chainguard | dask-gateway-server | 0 | 2024.1.0-r8 |
| Chainguard | datadog-agent | 0 | 7.55.2-r0 |
| Chainguard | datadog-agent-core-integrations | 0 | 7.55.2-r0 |
| Chainguard | datadog-agent-core-integrations-fips | 0 | 7.72.0-r0 |
| Chainguard | datadog-agent-fakeintake | 0 | 7.55.2-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.55.2-r0 |
| Chainguard | datadog-agent-jmx-fips | 0 | 7.72.0-r0 |
| Chainguard | datadog-agent-oci-compat | 0 | 7.55.2-r0 |
| Chainguard | datadog-agent-oci-compat-fips | 0 | 7.72.0-r0 |
| Chainguard | datadog-agent-s6-overlay | 0 | 7.55.2-r0 |
| Chainguard | datadog-agent-s6-overlay-fips | 0 | 7.72.0-r0 |
| Chainguard | datadog-cluster-agent | 0 | 7.55.2-r0 |
| Chainguard | datadog-cluster-agent-fips | 0 | 7.72.1-r0 |
| Chainguard | datadog-cluster-agent-oci-compat | 0 | 7.55.2-r0 |
| Chainguard | datadog-cluster-agent-oci-compat-fips | 0 | 7.72.0-r0 |
| Chainguard | dogstatsd | 0 | 7.55.2-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-graalpy | 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-graalpy | 0 | 24.0.2-r6 |
| Chainguard | graalvm-24-truffleruby | 0 | 24.0.2-r6 |
| Chainguard | jwt-tool | 0 | 2.2.7-r1 |
| Chainguard | k8s-sidecar | 0 | 1.27.4-r2 |
| Chainguard | k8s-sidecar-1.22 | 0 | 1.22.4-r2 |
| Chainguard | katib-cert-generator | 0 | 0.18.0-r0 |
| Chainguard | katib-cert-generator-compat | 0 | 0.18.0-r0 |
| Chainguard | katib-controller | 0 | 0.18.0-r0 |
| Chainguard | katib-controller-compat | 0 | 0.18.0-r0 |
| Chainguard | katib-db-manager | 0 | 0.18.0-r0 |
| Chainguard | katib-db-manager-compat | 0 | 0.18.0-r0 |
| Chainguard | katib-earlystopping | 0 | 0.18.0-r0 |
| Chainguard | katib-file-metricscollector | 0 | 0.18.0-r0 |
| Chainguard | katib-file-metricscollector-compat | 0 | 0.18.0-r0 |
| Chainguard | katib-suggestion-goptuna | 0 | 0.18.0-r0 |
| Chainguard | katib-suggestion-goptuna-compat | 0 | 0.18.0-r0 |
| Chainguard | katib-suggestion-hyperband | 0 | 0.18.0-r0 |
| Chainguard | katib-suggestion-hyperopt | 0 | 0.18.0-r0 |
| Chainguard | katib-suggestion-nas-darts | 0 | 0.18.0-r0 |
| Chainguard | katib-suggestion-nas-enas | 0 | 0.18.0-r0 |
| Chainguard | katib-suggestion-optuna-enas | 0 | 0.18.0-r0 |
| Chainguard | katib-suggestion-pbt-enas | 0 | 0.18.0-r0 |
| Chainguard | katib-suggestion-skopt-enas | 0 | 0.18.0-r0 |
| Chainguard | katib-tfevent-metricscollector | 0 | 0.18.0-r0 |
| Chainguard | kubeflow-jupyter-web-app | 0 | 1.8.0-r10 |
| Chainguard | kubeflow-katib | 0 | 0.18.0-r0 |
| Chainguard | kubeflow-pipelines | 0 | 2.2.0-r6 |
| Chainguard | kubeflow-pipelines-apiserver | 0 | 2.2.0-r6 |
| Chainguard | kubeflow-pipelines-cache-deployer | 0 | 2.2.0-r6 |
| Chainguard | kubeflow-pipelines-cache-deployer-compat | 0 | 2.2.0-r6 |
| Chainguard | kubeflow-pipelines-cache_server | 0 | 2.2.0-r6 |
| Chainguard | kubeflow-pipelines-frontend | 0 | 2.2.0-r6 |
| Chainguard | kubeflow-pipelines-metadata-envoy-config | 0 | 2.2.0-r6 |
| Chainguard | kubeflow-pipelines-metadata-writer | 0 | 2.2.0-r6 |
| Chainguard | kubeflow-pipelines-metadata-writer-compat | 0 | 2.2.0-r6 |
| Chainguard | kubeflow-pipelines-persistence_agent | 0 | 2.2.0-r6 |
| Chainguard | kubeflow-pipelines-scheduledworkflow | 0 | 2.2.0-r6 |
| Chainguard | kubeflow-pipelines-viewer-crd-controller | 0 | 2.2.0-r6 |
| Chainguard | kubeflow-pipelines-visualization-server | 0 | 2.3.0-r1 |
| Chainguard | kubeflow-volumes-web-app | 0 | 1.8.0-r8 |
| Chainguard | mlflow | 0 | 2.14.2-r0 |
| Chainguard | mlflow-bitnami | 0 | 2.14.2-r0 |
| Chainguard | mlflow-iamguarded-compat | 0 | 2.14.2-r0 |
| Chainguard | nvidia-apex-12.3-wheel | 0 | 24.04.01-r1 |
| Chainguard | patroni | 0 | 3.3.2-r0 |
| Chainguard | py3-cassandra-medusa | 0 | 0.21.0-r5 |
| Chainguard | py3-cassandra-medusa | 0 | 0.23.0-r30 |
| Chainguard | py3-cassandra-medusa-compat | 0 | 0.21.0-r5 |
| Chainguard | py3-cassandra-medusa-compat | 0 | 0.23.0-r30 |
| Chainguard | py3-certifi | 0 | 2024.07.04-r0 |
| Chainguard | py3-pipenv | 0 | 2024.4.1-r0 |
| Chainguard | py3-supported-certifi | 0 | 2024.07.04-r0 |
| Chainguard | py3-supported-pipenv | 0 | 2024.4.1-r0 |
| Chainguard | py3.10-certifi | 0 | 2024.07.04-r0 |
| Chainguard | py3.10-pipenv | 0 | 2024.4.1-r0 |
| Chainguard | py3.10-pipenv-bin | 0 | 2024.4.1-r0 |
| Chainguard | py3.10-pytorch-cuda-11.8 | 0 | 2.3.1-r2 |
| Chainguard | py3.10-pytorch-cuda-12.3 | 0 | 2.3.1-r2 |
| Chainguard | py3.10-torchvision-cuda-11.8 | 0 | 0.18.1-r3 |
| Chainguard | py3.10-torchvision-cuda-12.3 | 0 | 0.18.1-r4 |
| Chainguard | py3.10-wheels-torch-cuda-11.8 | 0 | 2.3.1-r2 |
| Chainguard | py3.10-wheels-torch-cuda-12.3 | 0 | 2.3.1-r2 |
| Chainguard | py3.10-wheels-torchvision-cuda-11.8 | 0 | 0.18.1-r3 |
| Chainguard | py3.10-wheels-torchvision-cuda-12.3 | 0 | 0.18.1-r4 |
| Chainguard | py3.11-certifi | 0 | 2024.07.04-r0 |
| Chainguard | py3.11-pipenv | 0 | 2024.4.1-r0 |
| Chainguard | py3.11-pipenv-bin | 0 | 2024.4.1-r0 |
| Chainguard | py3.11-pytorch-cuda-12.3 | 0 | 2.3.1-r6 |
| Chainguard | py3.11-torchaudio-cuda-12.3 | 0 | 2.3.1-r1 |
| Chainguard | py3.11-torchvision-cuda-11.8 | 0 | 0.18.1-r3 |
| Chainguard | py3.11-torchvision-cuda-12.3 | 0 | 0.18.1-r5 |
| Chainguard | py3.11-wheels-torch-cuda-12.3 | 0 | 2.3.1-r6 |
| Chainguard | py3.11-wheels-torchaudio-cuda-12.3 | 0 | 2.3.1-r1 |
| Chainguard | py3.11-wheels-torchvision-cuda-11.8 | 0 | 0.18.1-r3 |
| Chainguard | py3.11-wheels-torchvision-cuda-12.3 | 0 | 0.18.1-r5 |
| Chainguard | py3.12-certifi | 0 | 2024.07.04-r0 |
| Chainguard | py3.12-pipenv | 0 | 2024.4.1-r0 |
| Chainguard | py3.12-pipenv-bin | 0 | 2024.4.1-r0 |
| Chainguard | py3.12-pytorch-cuda-11.8 | 0 | 2.3.1-r1 |
| Chainguard | py3.12-pytorch-cuda-12.3 | 0 | 2.3.1-r1 |
| Chainguard | py3.12-torchvision-cuda-12.3 | 0 | 0.18.1-r2 |
| Chainguard | py3.12-wheels-torch-cuda-11.8 | 0 | 2.3.1-r1 |
| Chainguard | py3.12-wheels-torch-cuda-12.3 | 0 | 2.3.1-r1 |
| Chainguard | py3.12-wheels-torchvision-cuda-11.8 | 0 | 0.18.1-r2 |
| Chainguard | py3.12-wheels-torchvision-cuda-12.3 | 0 | 0.18.1-r2 |
| Chainguard | py3.13-certifi | 0 | 2024.07.04-r0 |
| Chainguard | py3.13-pipenv | 0 | 2024.4.1-r0 |
| Chainguard | py3.13-pipenv-bin | 0 | 2024.4.1-r0 |
| Chainguard | reflex | 0 | 0.5.6-r0 |
| Chainguard | request-1276 | 0 | 0.21.0-r4 |
| Chainguard | request-1276 | 0 | 0.23.0-r0 |
| Chainguard | request-1276-compat | 0 | 0.21.0-r4 |
| Chainguard | request-1276-compat | 0 | 0.23.0-r0 |
| Chainguard | superset | 0 | 4.0.2-r1 |
| Chainguard | superset-ci | 0 | 4.0.2-r1 |
| Chainguard | superset-entrypoint | 0 | 4.0.2-r1 |
| Chainguard | superset-iamguarded-compat | 0 | 4.0.2-r1 |
| Debian:11 | python-certifi | 0 | No fix |
| Debian:12 | python-certifi | 0 | No fix |
| Debian:13 | python-certifi | 0 | No fix |
| Ubuntu:20.04:LTS | python-certifi | 0 | No fix |
| Ubuntu:20.04:LTS | python-pip | 0 | No fix |
| Ubuntu:22.04:LTS | python-certifi | 0 | No fix |
| Ubuntu:22.04:LTS | python-pip | 0 | No fix |
| Ubuntu:24.04:LTS | python-certifi | 0 | No fix |
| Ubuntu:24.04:LTS | python-pip | 0 | No fix |
| Ubuntu:Pro:14.04:LTS | python-pip | 0 | No fix |
| Ubuntu:Pro:16.04:LTS | python-certifi | 0 | No fix |
| Ubuntu:Pro:16.04:LTS | python-pip | 0 | No fix |
| Ubuntu:Pro:18.04:LTS | python-certifi | 0 | No fix |
| Ubuntu:Pro:18.04:LTS | python-pip | 0 | No fix |
| Ubuntu:Pro:20.04:LTS | python-certifi | 0 | No fix |
| Ubuntu:Pro:20.04:LTS | python-pip | 0 | No fix |
| Ubuntu:Pro:22.04:LTS | python-pip | 0 | No fix |
| Ubuntu:Pro:24.04:LTS | python-pip | 0 | No fix |
| Wolfi | airflow | 0 | 2.9.2-r2 |
| Wolfi | airflow-bitnami-compat | 0 | 2.9.2-r2 |
| Wolfi | airflow-compat | 0 | 2.9.2-r2 |
| Wolfi | az | 0 | 2.61.0-r2 |
| Wolfi | az-iamguarded-compat | 0 | 2.61.0-r2 |
| Wolfi | checkov | 0 | 3.0.34-r1 |
| Wolfi | confluent-docker-utils | 0 | 0.0.82-r1 |
| Wolfi | dask-gateway | 0 | 2024.1.0-r8 |
| Wolfi | dask-gateway-server | 0 | 2024.1.0-r8 |
| Wolfi | datadog-agent | 0 | 7.55.2-r0 |
| Wolfi | datadog-agent-core-integrations | 0 | 7.55.2-r0 |
| Wolfi | datadog-agent-fakeintake | 0 | 7.55.2-r0 |
| Wolfi | datadog-agent-jmx | 0 | 7.55.2-r0 |
| Wolfi | datadog-agent-oci-compat | 0 | 7.55.2-r0 |
| Wolfi | datadog-agent-s6-overlay | 0 | 7.55.2-r0 |
| Wolfi | datadog-cluster-agent | 0 | 7.55.2-r0 |
| Wolfi | datadog-cluster-agent-oci-compat | 0 | 7.55.2-r0 |
| Wolfi | dogstatsd | 0 | 7.55.2-r0 |
| Wolfi | jwt-tool | 0 | 2.2.7-r1 |
| Wolfi | k8s-sidecar | 0 | 1.27.4-r2 |
| Wolfi | katib-cert-generator | 0 | 0.18.0-r0 |
| Wolfi | katib-cert-generator-compat | 0 | 0.18.0-r0 |
| Wolfi | katib-controller | 0 | 0.18.0-r0 |
| Wolfi | katib-controller-compat | 0 | 0.18.0-r0 |
| Wolfi | katib-db-manager | 0 | 0.18.0-r0 |
| Wolfi | katib-db-manager-compat | 0 | 0.18.0-r0 |
| Wolfi | katib-earlystopping | 0 | 0.18.0-r0 |
| Wolfi | katib-file-metricscollector | 0 | 0.18.0-r0 |
| Wolfi | katib-file-metricscollector-compat | 0 | 0.18.0-r0 |
| Wolfi | katib-suggestion-goptuna | 0 | 0.18.0-r0 |
| Wolfi | katib-suggestion-goptuna-compat | 0 | 0.18.0-r0 |
| Wolfi | katib-suggestion-hyperband | 0 | 0.18.0-r0 |
| Wolfi | katib-suggestion-hyperopt | 0 | 0.18.0-r0 |
| Wolfi | katib-suggestion-nas-darts | 0 | 0.18.0-r0 |
| Wolfi | katib-suggestion-nas-enas | 0 | 0.18.0-r0 |
Related vulnerabilities
- CVE-2025-47287 Tornado vulnerable to excessive logging caused by malformed multipart form data Also affects airflow
- CVE-2024-12797 Issue summary: Clients using RFC7250 Raw Public Keys (RPKs) to authenticate a server may… Also affects airflow
- CVE-2024-56201 Jinja has a sandbox breakout through malicious filenames Also affects airflow
- CVE-2024-56326 Jinja has a sandbox breakout through indirect reference to format method Also affects airflow
- CVE-2024-52804 Tornado has an HTTP cookie parsing DoS vulnerability Also affects airflow
- CVE-2024-52304 aiohttp is an asynchronous HTTP client/server framework for asyncio and Python. Also affects airflow
- CVE-2024-52303 aiohttp is an asynchronous HTTP client/server framework for asyncio and Python. Also affects airflow
- CVE-2024-21272 Vulnerability in the MySQL Connectors product of Oracle MySQL (component… Also affects airflow