Skip to content

[3.12] gh-160040: Distrust compromised eMudhra intermediate CA keys (CVE-2026-115557) (GH-160042) - #160571

Merged
Yhg1s merged 1 commit into
python:3.12from
gpshead:backport-7dd8b47-3.12
Oct 24, 2026
Merged

Yhg1s merged 1 commit into
python:3.12from
gpshead:backport-7dd8b47-3.12

Conversation

@gpshead

@gpshead gpshead commented Oct 24, 2026

Copy link
Copy Markdown
Member

(cherry picked from commit 7dd8b47)

Co-authored-by: Christian Heimes christian@python.org

Manual backport notes (3.12):

  • Modules/_ssl.c: 3.12 predates _ssl.c calls SSL_CTX_get_verify_callback unnecessarily #113332, so _set_verify_mode() still fetched and re-installed the current ctx verify callback. It now installs _ssl_verify_callback directly, as on main (the unused verify_cb local is dropped; CPython never installs a callback of its own). newPySSLSocket()'s post-handshake-auth path already passes SSL_get_verify_callback() through, which is what main's hunk there introduces, so it is unchanged.
  • Lib/test/test_ssl.py: 3.12 lacks main's LEAF_MISSING_AKI_* constants; the DISTRUSTED_SPKI_* block is placed after SIGNED_CERTFILE_ECC_HOSTNAME. The test itself is unchanged.
  • Lib/test/certdata/make_ssl_certs.py: 3.12 predates the argparse cmdlineargs refactor, so make_distrusted_spki_cert() takes no arguments and uses the module-level enddate and literal '7000' days like the rest of the 3.12 script.
  • Makefile.pre.in / PCbuild/_ssl.vcxproj{,.filters}: add only Modules/_ssl/distrusted_spki.h (main's _openssl_mem.h is main-only), plus the Header Files filter definition.

distrusted_spki.h, distrusted.zip and the NEWS entry are identical to main. test_ssl, test_asyncio.test_ssl and test_asyncio.test_sslproto pass, including test_distrusted_spki; no new _ssl.c compiler warnings.

…keys (CVE-2026-115557) (pythonGH-160042)

The ssl module now rejects TLS certificate chains that contain any of a set of
compromised eMudhra intermediate CA keys.  This is an extraordinary measure and
a last line of defense: removing trust is primarily the job of the platform root
store, and the built-in denylist only blocks connections while that update has
not yet reached the OS, a container image, or a bundled trust store in various
Python packages.  Entries are added to the denylist only under a very high
threshold.

The denylist matches on the public key (the SHA-256 digest of the RFC-5280
SubjectPublicKeyInfo), so it also covers the cross-signed certificates that
reuse one of the distrusted keys.

---------

Signed-off-by: Christian Heimes <christian@python.org>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

(cherry picked from commit 7dd8b47)

Co-authored-by: Christian Heimes <christian@python.org>
@bedevere-app bedevere-app Bot added the type-security A security issue label Oct 24, 2026
@gpshead
gpshead marked this pull request as ready for review October 24, 2026 07:12
@gpshead
gpshead requested a review from a team as a code owner October 24, 2026 07:12
@Yhg1s
Yhg1s merged commit a17d9ef into python:3.12 Oct 24, 2026
29 of 30 checks passed
@Yhg1s

Yhg1s commented Oct 24, 2026

Copy link
Copy Markdown
Member

(I'll keep an eye on the docs build post-merge CI, but as it was an infrastructure failure I didn't want to rerun everything to verify pre-merge.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Development

Successfully merging this pull request may close these issues.

3 participants