CPython ssl: Use-after-free in server-side SNI callback context switch
Summary
CPython's ssl module contains a use-after-free in server-side TLS handling when an sni_callback assigns a different context to SSLSocket.context and the original SSLContext is no longer referenced. A remote, unauthenticated TLS client can trigger a crash or, less reliably, memory corruption. Only servers that create an SSLContext per connection or replace it while connections are open are affected; servers wrapping their listening socket with a long-lived context and all TLS clients are not affected.
Affected
- CPython 3.10.0 to before 3.10.22
- CPython 3.11.0 to before 3.11.17
- CPython 3.12.0 to before 3.12.15
- CPython 3.13.0 to before 3.13.16
- CPython 3.14.0 to before 3.14.8
- CPython 3.15.0a1 to before 3.15.0rc3
- Versions 3.9 and older: no fixed release, treat as unpatched
- Only server-side ssl use with sni_callback in the vulnerable pattern
Fixed in
- CPython 3.10.22, 3.11.17, 3.12.15, 3.13.16, 3.14.8 and 3.15.0rc3 or later
- Check python.org for the latest point release of your branch
- Linux distributions: check the vendor advisory for your release
Workaround
- Keep a strong reference to every SSLContext that sets sni_callback for the lifetime of the server
- Restrict Python TLS servers using sni_callback to trusted clients
- Use a long-lived SSLContext wrapping the listening socket instead of per-connection contexts
Exploitation
- No known exploitation in the wild; not listed in CISA KEV
- No public proof-of-concept found
- Impact is primarily denial of service; memory corruption is harder to exploit reliably
Our recommendation
- Inventory Python runtimes on servers, containers and appliances, including embedded copies
- Identify services that run server-side ssl code with sni_callback
- Upgrade to the patched point release for your branch
- Where upgrade is delayed, apply the reference-retention workaround and restrict TLS access
- Monitor for crashes of affected Python services
Public exploits
Links to third-party sites, not checked by us – exploit code can contain malware. Only use it in isolated test environments.
- Proof of concept on GitHub (1 repositories)
abraxas/cve-2026-19445-sni-uaf
Research sources
- Python security-announce advisory mail.python.org
- Python 3.10.22 / 3.11.17 release blog blog.python.org
- Python 3.14.8 release notes www.python.org
- Fix commit for 3.14 github.com
- Fix commit for 3.13 github.com
- Fix commit for 3.15 github.com
- Debian security tracker security-tracker.debian.org
- Open wall oss-security post www.openwall.com
Researched and written up in English and German by an AI (Claude by Anthropic) based on NVD, CISA, EPSS and the sources listed. The vendor information is authoritative. Researched on 31 Oct 2026, 05:04.
Original description (NVD)
A remote, unauthenticated TLS client can make a server crash or call through a freed pointer if its sni_callback assigns a different context to SSLSocket.context (the documented way to select a certificate per server name) and nothing else keeps the original ssl.SSLContext alive. Typical cases are servers that create an SSLContext per connection or replace it while connections are open; servers that wrap their listening socket with it are not affected. Mitigation: keep a reference to every SSLContext that sets sni_callback for the lifetime of the server. TLS clients are not affected.
NVD references (11)
- https://github.com/python/cpython/commit/34a53dce8174da2fceb12fe084a4def02a10053d
- https://github.com/python/cpython/commit/46133cd57d309652139ada74014aca7665ac552b
- https://github.com/python/cpython/commit/63fab143d94cafae71850831acfb52041ba44af7
- https://github.com/python/cpython/commit/b12968cefe69ca1dcb8606c832ff73ee7dbf4ba8
- https://github.com/python/cpython/commit/cd7e51e7d4563866fbaa1e2521ae69b45daf3698
- https://github.com/python/cpython/commit/d8717ed01717a9641686e6e6f83f0ab8af235e2c
- https://github.com/python/cpython/commit/ec44b5a3258cbda947d5e07242ee562ed05ef24b
- https://github.com/python/cpython/issues/156293
- https://github.com/python/cpython/pull/158504
- https://mail.python.org/archives/list/security-announce@python.org/thread/QMQIUQB6WGGC3MI7I3WKQXOYOBDSPPS3/
- http://www.openwall.com/lists/oss-security/2026/09/30/17
Sources
The tracker combines official, freely usable data sources – updated continuously:
- NVD (NIST) – CVEs, rating (CVSS), affected products
- CISA KEV – vulnerabilities confirmed by CISA as actively exploited
- CISA Vulnrichment – CISA assessment (SSVC) in the official CVE record
- FIRST EPSS – probability of exploitation
- Microsoft MSRC – Patch Tuesday: vulnerabilities, severity, updates
- PoC-in-GitHub – public proof-of-concept repositories
- Metasploit (Rapid7) – modules of the Metasploit Framework
- Exploit-DB (OffSec) – archive of public exploits (links only)
- Patch days: official vendor pages (linked per vendor) (Vendor patch days)
This product uses data from the NVD API but is not endorsed or certified by the NVD. EPSS data © FIRST.org.
Affected? We can help.
We check whether your systems are affected, install updates and close the gap – continuously with the System Health Checker if you wish.
