eMudhra CA Compromise: uv Shipped Fixes October 20 and 21, an AWS CLI Fix Merged October 21, Azure CLI's certifi Pin Changed in 2.92.0 on November 3
A comparison of how uv, pip, CPython, the AWS CLI and the Azure CLI handled the compromised eMudhra intermediate CAs, drawing on release notes, pull requests, Mozilla and Cloudflare.
Editor's Note ·
- Clarification:
- The headline and body give uv 0.13.5 as released on October 21 and uv 0.13.6 on October 26, which are the dates printed in uv's release notes. GitHub release and PyPI upload timestamps (UTC) are 2026-10-22 01:35 for 0.13.5 and 2026-10-27 00:47 for 0.13.6, so the notes' dates reflect a US time zone; the other dates in the article (Mozilla, AWS CLI, Azure CLI) are UTC. uv 0.13.4 is October 20 in both conventions.
Overview
The compromise of eight eMudhra intermediate certificate authorities (CAs) did not reach developers through a single channel. Browsers, language runtimes, package managers and vendor command-line tools each carry their own copy of a trust list, so each shipped a fix on its own schedule. This analysis compares the public record of five developer-facing projects: uv, pip and CPython, the AWS CLI, and the Azure CLI. It uses release notes, pull requests and a Python Software Foundation (PSF) forum thread, plus two independent write-ups from Mozilla and Cloudflare. The Herald previously reported on the Go toolchain’s response; this piece covers the Python packaging tools and cloud CLIs.
Background
According to Mozilla, it “received a report that private keys associated with eight eMudhra intermediate certificates had been compromised” on Saturday, October 17, at 20:06 UTC. Mozilla also said it was updating its NSS trusted certificate list (NSS 3.131.1) to remove the root certificate that signed the affected intermediates, an update it said helps protect other applications that use Mozilla’s trust store.
Cloudflare wrote on October 30 that “the affected intermediate private keys could be recovered almost instantly by anyone from the public certificates themselves.” It listed the eight key values as 4, 56, 66, 115, 155, 156, 230 and 237. Cloudflare said that about a week after logging finished rolling out on October 21 it had seen about 22,000 attempted handshakes with the weak keys, and that there was “no evidence of the weak keys being used to intercept Cloudflare’s connections so far.” It also said one of the forged certificates it saw was dated October 20 at 18:19 UTC, “less than an hour after Mozilla’s bug report was made public.”
Operating-system and browser blocks do not automatically protect software that ships its own CA bundle. The Azure CLI pull request description puts it this way: “certifi’s bundle has no revocation checking, so OS and browser blocks don’t cover azure-cli.”
The Python packaging tools
The certifi security advisory, rated critical, says certifi 2026.10.18 “removed all emSign roots from the bundle” and that 2026.10.19 “restored the emSign roots that are not affected.” It names requests, urllib3, pip and the Python.org macOS installer as examples of clients that rely on the bundle.
A PSF forum thread opened by Seth Michael Larson on October 20 lists minimum versions, including certifi 2026.10.19, pip 26.2.2 and uv 0.13.6. The thread says it will be updated, and the list as the Herald retrieved it on November 6 includes python-build-standalone 20261026, so it has been revised since the first post. It also asks users to upgrade to Python 3.15.2, 3.14.10, 3.13.18, 3.12.16 and 3.11.18, and notes that “Python versions 3.10 and older are end-of-life and no longer eligible for security fixes.” In the same thread, Christian Heimes wrote that “pip always loads the CA certificates from its vendored certifi in addition to the system trust store, and there is no supported way to disable this,” and that “Updating pip is the only reliable fix.”
uv’s own releases moved in steps:
- uv 0.13.4: released on 2026-10-20, it addresses advisory GHSA-hq85-5cpj-mr62 and updates the bundled Mozilla root certificates via
webpki-root-certs1.0.10. - uv 0.13.5: released on 2026-10-21, it rejects certificate chains containing the compromised intermediate keys via
rustls-webpki0.103.16, and ships managed CPython builds with pip 26.2.2 and certifi 2026.10.19. Its notes add: “Please note upstream CPython 3.9 and 3.10 still bundle pip releases whose certificate bundles trust the affected eMudhra/emSign root.” The notes also say uv will stop publishing Docker images with uv installed for end-of-life Python versions. - uv 0.13.6: released on 2026-10-26, it adds CPython 3.11.18, 3.12.16, 3.13.18, 3.14.10 and 3.15.2.
Two cloud CLIs, two timelines
The AWS CLI and the Azure CLI both vendor CA bundles, but the public records differ. The AWS CLI pull request, “Remove Comodo AAA root from vendored certificate file,” was opened on October 20 and merged on October 21, according to GitHub metadata. Its description says “The bundle has no emSign roots, so this is the only change needed.”
The Azure CLI pull request bumped the pinned certifi from 2024.7.4 to 2026.10.19. It was opened on October 20 and merged on October 26. On October 23, maintainer mansoor sarfraz wrote: “As the new release cutoff is couple of days away, we decided to include it in the standard upcoming release.” Several commenters asked for a hotfix. The pull request author wrote that other software “have all shipped fixes, mostly within two days of disclosure,” and asked whether an advisory would be published. The Herald found no answer to that question in the thread. On October 26 the maintainer said an edge build with the fix was available.
The Herald checked the pinned requirements file in each tagged release. In azure-cli-2.91.0 the Linux file pins certifi==2024.7.4; in azure-cli-2.92.0 it pins certifi==2026.10.19. GitHub metadata shows 2.92.0 was published on November 3. By the Herald’s own count, that is 14 days after the October 20 certifi advisory.
What independent sources show about uptake
Cloudflare measured how many visitors still accept the compromised chain, using probes on its challenge pages. It cautioned that “by design the traffic to these challenge pages is highly skewed,” with many unconfirmed bots, so the figures are indicative rather than a census. Its finding: “Up-to-date modern browsers are mostly patched, but bots and old browsers are not,” and “Across the large networks, more than half of probes still accept the compromised chain.” The post also points developers on macOS to a crowdsourced instructions site.
Implications
Three patterns follow from the sources, stated here as what the records show rather than as predictions.
- Fix location differs by tool. For pip, Heimes says OS-level distrust is not enough because pip carries its own bundle, so the fix is a pip upgrade. For uv, the 0.13.5 notes describe rejecting affected chains via an updated
rustls-webpki. For the cloud CLIs, the fix was a change to a vendored file or pinned dependency; a commenter in the Azure thread wrote that users of the MSI and Homebrew installs “can’t pick up a newer certifi themselves.” - Release cadence set the exposure window. The AWS CLI change merged the day after it was opened, while Azure CLI’s equivalent waited for a scheduled release. Whether the AWS CLI change was released on the same day is not stated in the pull request cited here.
- End-of-life runtimes lag. The PSF thread says Python 3.10 and older are no longer eligible for security fixes, and the uv notes say CPython 3.9 and 3.10 still bundle pip releases that trust the affected root.
Cloudflare’s closing argument is that trust stores should not be “a static list of root certificate authorities” but able to receive revocation updates quickly; that is Cloudflare’s view, not a documented change in the tools above.
What We Don’t Know
- The sources reviewed do not say how many installations of each tool remain on affected versions.
- The Herald did not locate an Azure CLI advisory about the certifi change.
- Apple’s own documentation on command-line tools such as git and curl on macOS is not cited here and is not covered by this comparison.