Blog / Security Advisories

Python Security Releases October 2026: tarfile, zipfile, and SSL CVEs, the eMudhra CA Fix, and How to Upgrade

Python had two rounds of security releases in October 2026. On October 1, every supported branch got fixes for tarfile, zipfile, SSL, and urllib vulnerabilities, and Python 3.10 reached end of life. On October 21, expedited releases replaced the bundled certificate store after the eMudhra CA key compromise. Here is what changed, who is at risk, and how to upgrade interpreters, virtual environments, and containers without downtime.

· 11 min read

The Python security releases of October 2026 arrived in two waves. On October 1, Python 3.14.8, 3.13.16, 3.12.15, 3.11.17, and 3.10.22 fixed vulnerabilities in tarfile, zipfile, ssl, asyncio, urllib, and the IDNA codec, and updated bundled libexpat. Python 3.10.22 was the final 3.10 release. On October 21, expedited releases Python 3.15.1, 3.14.9, and 3.13.17 upgraded the bundled pip to 26.2.2 with certifi 2026.10.19. That certificate bundle removes the eMudhra/emSign CA after eight of its intermediate private keys were found to be recoverable.

This article was created with AI assistance. Facts were checked against the official Python release announcements and python.org downloads page on October 24, 2026. Confirm details in the official notes before acting.

TL;DR: which Python version to install

If you runUpgrade toStatusInstallers
Python 3.153.15.1BugfixWindows and macOS
Python 3.143.14.9BugfixWindows and macOS
Python 3.133.13.17Security fixes onlyWindows and macOS (special release)
Python 3.123.12.15Security fixes onlySource only
Python 3.113.11.17Security fixes onlySource only
Python 3.10 or olderMove to 3.12 or laterEnd of life—

Python 3.12 and 3.11 did not get October 21 releases. On those branches, and on any version that bundles an older pip, upgrade pip and certifi in each environment yourself (see below).

October 1, 2026: Python CVE fixes

CVEIssueMost exposed
CVE-2026-19672tarfile extraction filters did not prevent some directory traversalApps extracting uploaded or downloaded tar archives
CVE-2026-82049tarfile hard link and symlink handlingSame as above (fixed in 3.10–3.13 releases)
CVE-2026-87910tarfile extraction filter not applied to fallback membersSame as above (fixed in 3.10–3.13 releases)
CVE-2026-15310zipfile decompression allocations were not boundedApps opening untrusted ZIP files (memory exhaustion)
CVE-2026-19553ssl.SSLContext.wrap_bio() server argument validation and asyncio TLS hostname validationAsync and custom TLS clients
CVE-2026-19445Crash when switching SSL contextsTLS servers using SNI callbacks or context switching
CVE-2026-15806urllib.request.HTTPPasswordMgr credentials not scoped by URL schemeClients using urllib basic or digest auth
CVE-2026-17084Stringprep and IDNA codec Unicode restrictions per RFC 3454Code that encodes internationalized hostnames

These releases also updated the bundled libexpat XML parser to 2.8.5. The 3.13.16 and 3.14.8 binary installers moved to OpenSSL 3.5.9. Python 3.10.22 additionally hardened XML parsing against hash-flooding attacks. The two additional tarfile fixes, CVE-2026-82049 and CVE-2026-87910, are listed for the 3.10 to 3.13 releases.

October 21, 2026: the eMudhra CA certificate fix

On October 17, 2026, it was reported that private keys for eight eMudhra/emSign intermediate CA certificates were recoverable because of a key generation flaw. Six of the certificates were for TLS and two for code signing. Browsers blocked the intermediates within days, and Mozilla removed the emSign ECC Root CA – G3 root. Non-browser clients depend on their own certificate bundles, and many Python applications use certifi, through pip, requests, httpx, and other libraries.

Python’s expedited releases bundle pip 26.2.2 with certifi 2026.10.19, which no longer trusts the emSign ECC Root CA – G3. Installing a new Python does not update existing virtual environments, so the Python team asks users to upgrade pip and uv in every environment:

# In every virtual environment (and every Python you use pip with)
python -m pip install --upgrade pip certifi

# uv users
uv self update

# Projects that pin certifi in a lockfile
# requirements.txt:  certifi>=2026.10.19
# Poetry:            poetry update certifi
# uv:                uv lock --upgrade-package certifi

On Linux, Python’s own ssl module usually trusts the operating system’s certificate store, so also update the ca-certificates package. On macOS with python.org installers, rerun Install Certificates.command or upgrade certifi as above. Node.js shipped a matching certificate store update in its October 2026 security release.

Who is most at risk

Archive extraction: tarfile and zipfile

Any service that unpacks archives it did not create is exposed: upload and import features, CI and build systems, plugin installers, data pipelines, and machine-learning workflows that download model or dataset archives. A path traversal in tar extraction can write files outside the target directory. That can mean overwriting code, configuration, or cron entries, and it can lead to code execution. The zipfile issue lets a small archive consume large amounts of memory.

TLS clients and servers: ssl and asyncio

CVE-2026-19553 affects hostname validation for TLS connections created through wrap_bio() and asyncio, which async HTTP clients and frameworks use under the hood. Weak hostname checks let an attacker who controls the network path impersonate the server. CVE-2026-19445 can crash TLS servers that switch SSL contexts, for example during SNI handling.

Credentials in urllib

CVE-2026-15806 concerns HTTPPasswordMgr credentials that were not scoped by URL scheme, so credentials registered for one scheme could be offered to another, such as plain HTTP. Scripts and internal tools that use urllib with basic or digest authentication should upgrade.

Internationalized hostnames

CVE-2026-17084 tightens the stringprep and IDNA codecs to RFC 3454. Applications that normalize or compare internationalized hostnames, such as allow lists, SSRF filters, and email domain checks, should upgrade so validation and connection logic agree.

Supported and end-of-life Python versions

BranchStatusSupported until
3.15Bugfix (released October 9, 2026)October 2031
3.14BugfixOctober 2030
3.13Security fixes onlyOctober 2029
3.12Security fixes onlyOctober 2028
3.11Security fixes only (oldest supported)October 2027
3.10End of lifeEnded October 2026

Python 3.10 will not receive fixes for future vulnerabilities. Your Linux distribution may continue to patch its own Python 3.10 package under its support policy; otherwise, upgrade to a supported branch.

Check which Python versions you run

# Interpreter, build, OpenSSL, pip, and certifi
python -VV
python -c "import ssl; print(ssl.OPENSSL_VERSION)"
python -m pip --version
python -c "import certifi; print(certifi.__version__)"

# Does the certifi bundle still trust the removed emSign root? (expect False)
python -c "import certifi; print('emSign ECC Root CA - G3' in open(certifi.where()).read())"

# Python inside running containers
docker ps --format '{{.Names}}' | xargs -I{} sh -c 'echo "{}: $(docker exec {} python -V 2>&1)"'

Remember the places Python hides: virtual environments (each has its own pip and certifi), CI images, serverless functions, Jupyter and data science images, Airflow and Celery workers, and tools that bundle their own interpreter.

Interim mitigations

  • Extract archives with the safest filter. Use tar.extractall(path, filter="data"), which blocks absolute paths, links outside the destination, and special files. Python 3.14 makes "data" the default. Extract untrusted archives into an empty, unprivileged directory.
  • Check ZIP sizes before extracting. Sum ZipInfo.file_size for all members and reject archives above a limit; cap the number of entries.
  • Update certifi now in every environment, even before upgrading the interpreter.
  • Pass server_hostname explicitly for custom TLS code and keep check_hostname enabled.
  • Register urllib credentials only for https:// URLs and avoid sending credentials to plain HTTP endpoints.
  • Run pip-audit to find vulnerable third-party packages while you are in the change window.

Python upgrade paths by setup

Docker images

Official python images publish tags such as python:3.13.17-slim, python:3.14-slim, and python:3.12-alpine. Rebuild with docker build --pull, update pinned tags or digests in every stage, and reinstall dependencies so the image gets the new pip and your locked certifi:

docker build --pull --no-cache -t registry.example.com/api:py-sec-2026-10 .
docker run --rm registry.example.com/api:py-sec-2026-10 python -VV

pyenv, uv, and conda

# pyenv (update definitions first)
pyenv update || brew upgrade pyenv
pyenv install 3.13.17 && pyenv global 3.13.17

# uv-managed Python
uv self update
uv python install 3.14.9

# conda / mamba (once conda-forge publishes the build)
conda update python

These tools install the new patch version at a new path. Existing virtual environments still point to the old interpreter, so recreate them (uv venv, python -m venv, or your Poetry or Pipenv equivalent) and reinstall from your lockfile.

Linux distribution packages

Do not replace the system Python. Debian, Ubuntu, RHEL, and Alpine backport fixes into their own Python packages; follow your vendor’s advisory for the fixed package release, and update ca-certificates for the eMudhra change. The deadsnakes PPA on Ubuntu publishes upstream versions separately.

Windows and macOS installers

Use the python.org installers for 3.15.1, 3.14.9, or 3.13.17, or the Python Install Manager on Windows. Python 3.12 and 3.11 security releases are source-only; on desktops, use a newer branch or a package manager build.

Serverless and PaaS

  • AWS Lambda managed runtimes (for example python3.12, python3.13) are patched by AWS. If you pinned a runtime version with runtime management controls, update it. Rebuild container-image functions, and redeploy functions that vendor certifi so they pick up 2026.10.19.
  • Buildpack platforms such as Heroku read .python-version or similar files. Update the version and redeploy.

CI pipelines

actions/setup-python with python-version: "3.13" resolves the newest patch on each run once it is available. Bump exact pins in .python-version, tox.ini, noxfile.py, or CI configuration, and clear caches that hold old virtual environments.

Zero-downtime rollout for Python services

  • Gunicorn: HUP reloads workers but keeps the master on the old interpreter. To switch interpreters in place, send USR2 to start a new master, WINCH to the old master to retire its workers, then QUIT once the new workers are healthy. Or roll instances behind your load balancer.
  • Uvicorn and other ASGI servers: roll processes or pods one at a time behind a load balancer; handle SIGTERM with graceful shutdown.
  • Celery, RQ, and other workers: send TERM for a warm shutdown so running tasks finish, then start the worker on the new interpreter. Make tasks idempotent so retries are safe.
  • Kubernetes: rolling updates with readiness probes, maxUnavailable: 0, a PodDisruptionBudget, and enough terminationGracePeriodSeconds for in-flight work. Include CronJobs and worker Deployments.
  • Canary first, and keep the previous image digest for rollback.

Verify the Python upgrade

  1. Run python -VV in every image, host, and virtual environment that serves traffic.
  2. Confirm pip and certifi versions in every environment, and that the emSign check above prints False.
  3. Restart long-running processes (web servers, workers, schedulers, notebooks) and confirm start times are after the upgrade.
  4. Run your test suite, paying attention to archive handling, outbound TLS, and anything using urllib authentication.
  5. Run pip-audit and your image scanner so your inventory reflects the new versions.

How DAST tools help you catch issues like this sooner

No scanner can predict an undisclosed bug in the Python runtime, and upgrading is the only fix for these CVEs. The pattern is familiar from this month’s other runtime advisories, though: the danger comes from application features that hand attacker-controlled data to the vulnerable code, such as archive uploads, XML endpoints, and URL fetchers. Dynamic application security testing exercises those features from the outside, the way an attacker would.

DastPilot scans your APIs from an OpenAPI spec or Postman collection, as every role you configure. Checks most relevant to Python applications:

  • File upload testing: flags endpoints that accept dangerous file types, insecure uploads, and missing upload size validation. These are the features that feed archive extraction code.
  • Path traversal probes on file and path parameters.
  • XML handling: XXE probes and detection of legacy XML interfaces, relevant to the libexpat updates in these releases.
  • SSRF probes on URL parameters, where hostname-handling bugs make outbound requests more dangerous.
  • Leaky errors and debug surfaces: flags Python tracebacks in responses, unhandled 500 errors on malformed input, and unauthenticated debug or configuration endpoints, such as a framework left in debug mode.
  • Stack fingerprinting through headers like Server: gunicorn, plus injection and BOLA, BFLA, and authentication checks.
  • Regression tracking: each scan is compared with the last, so a weakness that returns after an emergency deploy is flagged as reopened.

Run scans on a schedule or in your CI/CD pipeline, and rescan staging after a runtime upgrade. DAST complements patching: pair it with pip-audit and image scanning to know which versions you run. For the rest of this month’s runtime advisories, see our guides to the Ruby regexp CVEs behind GitLab’s RCE, Node.js, nginx, and PHP.

Frequently asked questions

What are the latest Python security releases?

Python 3.15.1, 3.14.9, and 3.13.17 were released on October 21, 2026 to update the bundled pip and certifi after the eMudhra CA compromise. Python 3.12.15 and 3.11.17, released on October 1, 2026, are the latest security releases for those branches.

Which CVEs were fixed in the October 2026 Python releases?

The October 1 releases fixed CVE-2026-19672, CVE-2026-82049, and CVE-2026-87910 in tarfile, CVE-2026-15310 in zipfile, CVE-2026-19553 and CVE-2026-19445 in ssl and asyncio, CVE-2026-15806 in urllib, and CVE-2026-17084 in the stringprep and IDNA codecs.

Is Python 3.10 still supported?

No. Python 3.10.22, released on October 1, 2026, was the final release of Python 3.10. It will not receive further security updates. Upgrade to Python 3.12 or later, or rely on your Linux distribution’s own support policy for its packaged Python.

Do I need to update certifi after the eMudhra CA compromise?

Yes. Installing a new Python does not update existing virtual environments. Run python -m pip install --upgrade pip certifi in each environment, bump certifi to 2026.10.19 or later in lockfiles, and update your operating system ca-certificates package.

How do I upgrade Python without downtime?

Build new images or interpreters, recreate virtual environments that point to the old interpreter, and roll out gradually behind a load balancer or with Kubernetes rolling updates. Gunicorn supports an in-place interpreter swap with the USR2, WINCH, and QUIT signals.

Can a DAST scanner detect these Python vulnerabilities?

A DAST scanner cannot identify which Python CVEs apply to you; use version inventory and pip-audit for that. DAST tools such as DastPilot find the application features attackers use to reach runtime bugs, including unsafe file uploads, path traversal, XXE, SSRF, leaked tracebacks, and debug endpoints.

Find the features attackers use to reach runtime bugs

DastPilot flags unsafe uploads, path traversal, XXE, SSRF, leaked tracebacks, and authorization flaws in your Python APIs, and rechecks them on every scan. 30-day free trial, no credit card required.

Start Free Trial