On this page (7 sections)

The Python package manager uv carries its own bundled list of trusted certificate authorities (CAs). In versions before 0.13.4, that list contains the emSign ECC Root CA - G3 root, and eight eMudhra intermediate certificates chaining to it have compromised private keys. The GitHub advisory GHSA-hq85-5cpj-mr62 rates it Critical, with a CVSS score of 9.1.

If you use uv on servers, CI runners or developer machines, this is worth a quick check. According to the advisory, an attacker holding one of the compromised keys can issue certificates that uv accepts for any hostname, which can be used for man-in-the-middle (MITM) attacks.

What happened

By default, uv validates TLS connections against a vendored copy of the webpki-root-certs bundle. The advisory says versions before 0.13.4 include the emSign ECC Root CA - G3 root, and that the eight eMudhra intermediates under it have compromised private keys. The CA has revoked those intermediates.

uv 0.13.4 removes the root from its vendored bundle, following webpki-root-certs 1.0.10. The advisory's only remediation instruction is to upgrade to 0.13.4 or later.

The advisory also references a disclosure site and a Mozilla dev-security-policy thread about the eMudhra problem. We have not reviewed those, so this article relies on the single GitHub advisory. Only one independent publisher covers the story so far.

Why a compromised intermediate matters

As general background: a TLS client trusts a set of root CAs, roots vouch for intermediates, and intermediates sign website certificates. If an intermediate's private key falls into the wrong hands, certificates signed with it can chain up to a root the client trusts. That is why the advisory says such certificates would be accepted for any hostname.

The advisory's CVSS v4 metrics list network attack vector, high attack complexity, attack requirements present, no privileges and no user interaction. Impact on confidentiality and integrity is rated high, with no availability impact. The advisory does not spell out the attack scenario beyond the MITM description, so treat any more detailed picture as inference.

Where uv commonly runs

The advisory does not list affected environments. As examples of places uv often runs, and therefore worth checking:

  • CI/CD runners and build servers that use uv to install dependencies.
  • Developer laptops and containers, especially when used on shared or untrusted networks.
  • Docker images that pin an older uv version and are rebuilt rarely.
  • Deployment or bootstrap scripts that install a fixed uv version.

Websites that never run uv are not affected by this particular issue. It concerns uv's own outbound TLS checks, not visitors loading your pages.

How to check your exposure

Run this on each machine, runner or container to print the installed uv version. Anything below 0.13.4 is affected.

Show the installed uv version (any platform with uv on PATH)Shell
uv --version

If you installed uv as a Python package, this read-only command shows the version pip sees. Look for 0.13.4 or later.

Show uv as seen by pip (pip-installed uv only)Shell
python -m pip show uv

Also search your repositories for pinned versions, such as Dockerfiles, CI workflow files and requirements files that fix uv to an older release.

What to do now

The advisory says to upgrade to 0.13.4 or later. For uv installed through pip, the standard upgrade command is below. If you installed uv another way, use that method's own update path.

Caution. Upgrading tooling in CI or production images can change build behavior. Test the new version on a non-critical pipeline first, and rebuild images rather than patching them in place where you can.

This command upgrades a pip-installed uv and then prints the version. The result should show 0.13.4 or later.

Upgrade a pip-installed uv, then confirm the versionShell
python -m pip install --upgrade uv
uv --version
Tip. Hash-pinned dependencies add a second layer: a tampered download should fail verification even if the TLS connection was intercepted. This is general good practice, not a step from the advisory.

Detection and monitoring afterwards

Nothing in the research tells you whether a past connection was intercepted, so treat the exposure window as a reason to review, not as proof of compromise. Compare what recent builds installed against your lock files and look for unexpected version or hash changes.

For the websites you operate, watching certificate changes is good general practice. The free SSL certificate checker shows which CA issued your certificate and when it expires, and certificate and DNS monitoring can alert you to unexpected changes. These cover your public sites, not uv's internal trust store.

If you suspect a build was tampered with, follow website hacked: what to do, rotate secrets the build could access, and rebuild from clean sources.

What we do not know yet

  • The research reports no confirmed exploitation of the compromised keys against uv users.
  • No CVE identifier appears in the research, only the GitHub advisory ID.
  • How the intermediate keys were compromised is described in external references we have not reviewed.

We will update this article if the advisory or its references change.

Sources

This article is based on the public sources below. Details can change as vendors and researchers publish more; check the original advisories before acting on version numbers.

  1. GHSA-hq85-5cpj-mr62 - GitHub Advisory Databasegithub.com ·
  • uv
  • Python
  • TLS
  • certificate authority
  • supply chain
  • CI/CD