Skip to content

Distrust eMudhra's CA roots and Sectigo's AAA root for registry, OSV and Socket requests - #11

Merged
adamtty merged 2 commits into
mainfrom
distrust-emudhra
Oct 23, 2026
Merged

adamtty merged 2 commits into
mainfrom
distrust-emudhra

Conversation

@adamtty

@adamtty adamtty commented Oct 23, 2026 •

Copy link
Copy Markdown
Owner

The private keys of 8 eMudhra (emSign) intermediate CAs turned out to be guessable. Browsers block those intermediates, but the roots above them are still in macOS's /etc/ssl/cert.pem, which /usr/bin/python3 trusts. Anyone holding one of those keys could pass for PyPI, OSV or Socket.

  • tls_context() loads Python's default roots: $SSL_CERT_FILE, else its default file, else its default folder. It leaves out any root whose SHA-256 is one of eMudhra's four, or whose DER names eMudhra. Both urlopen calls use it.
  • Still stdlib only, and still works on macOS's Python 3.9 / LibreSSL.
  • Tests: the context has more than 100 roots and none from eMudhra; only eMudhra roots are dropped; $SSL_CERT_FILE is honoured and filtered.

Checked live: PyPI verifies fine through the filtered context.

Sectigo AAA: each compromised intermediate also has a twin cross-signed by Sectigo's legacy AAA Certificate Services root. Browsers and certifi dropped AAA in 2025, but macOS's /etc/ssl/cert.pem still trusts it, so it is dropped too (by SHA-256). Checked live without it: PyPI, OSV, Socket, the GitHub API, raw, release assets, npm, crates.io, RubyGems and the Go proxy all still verify.

The keys of 8 eMudhra (emSign) intermediate CAs were guessable. Browsers block
those intermediates, but macOS's default bundle still trusts the roots above
them. Requests now use Python's default roots minus eMudhra's.
Each compromised eMudhra intermediate has a twin cross-signed by AAA
Certificate Services, which macOS's /etc/ssl/cert.pem still trusts, so
dropping the emSign roots alone left a path open.
@adamtty adamtty changed the title Distrust eMudhra's CA roots for registry, OSV and Socket requests Distrust eMudhra's CA roots and Sectigo's AAA root for registry, OSV and Socket requests Oct 23, 2026
@adamtty
adamtty merged commit 899da81 into main Oct 23, 2026
10 checks passed
@adamtty
adamtty deleted the distrust-emudhra branch October 23, 2026 00:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant