Jorge Turbica / blog · Blog ← Todos los artículos EN · Read in English
Lenguajes

Python 3.15.2 y otras cuatro versiones bloquean en ssl las claves comprometidas de eMudhra

Cinco releases de seguridad de CPython rechazan en el propio ssl las CA comprometidas de eMudhra y corrigen un CVE en tarfile. Cómo actualizar cada rama.

Cinco versiones de CPython a la vez, el 26 de octubre de 2026: 3.15.2, 3.14.10, 3.13.18, 3.12.16 y 3.11.18. Son releases de seguridad aceleradas, y la razón principal es que el módulo ssl pasa a rechazar por sí mismo las claves comprometidas de las CA intermedias de eMudhra (emSign), aunque el almacén de certificados que uses siga confiando en ellas.

El bloqueo baja al runtime

Una CA intermedia con las claves comprometidas permite a quien las tenga emitir un certificado válido para cualquier dominio. Hasta ahora la defensa en Python dependía de cada almacén de confianza: el paquete de CA del sistema, certifi o el que lleva cada herramienta. Si una sola pieza de la cadena se quedaba atrás, el cliente seguía aceptando certificados falsificados.

Con estas versiones (CVE-2026-115557, gh-160040), el propio ssl bloquea esas claves "como último recurso". El equipo de releases lo concreta con pip: los usos normales, incluido actualizar pip, quedan a salvo de ataques basados en esas claves aunque pip todavía no se haya actualizado. Es el mismo razonamiento para cualquier cliente HTTP que verifique a través de ssl: un certifi antiguo en una imagen olvidada deja de ser un agujero si el intérprete está al día.

Lo que no resuelve: el software que no verifica a través del ssl de CPython, y los intérpretes que no actualices. Esa segunda parte es la que más trabajo da, porque el Python de producción rara vez es el del portátil.

Dos arreglos más en el mismo paquete

Las cinco versiones traen además:

  • CVE-2026-114583 (gh-160097): tarfile.tar_filter rechaza ahora los enlaces que sustituyen al destino. Si extraes tarballs de origen externo con el filtro tar (artefactos, backups, paquetes subidos por usuarios), este es el arreglo que te toca.
  • gh-160300: http.cookiejar rechaza las cookies con versión negativa.

Las ramas 3.13, 3.12 y 3.11 reciben también lo que 3.15.1 y 3.14.9 ya llevaban: Expat 2.9.0 (CVE-2026-77214 y CVE-2026-102633), el cambio para no leer mimetypes.knownfiles por defecto en Windows (CVE-2024-3220) y un caso límite del replegado de cabeceras (gh-87720). En 3.13.18 y 3.12.16 se corrige además una condición de carrera al limpiar tempfile.TemporaryDirectory.

Cómo actualizar según tu rama

RamaVersiónInstaladores binarios
3.153.15.2Sí
3.143.14.10Sí
3.133.13.18No, solo código fuente
3.123.12.16No, solo código fuente
3.113.11.18No, solo código fuente

Para 3.15 y 3.14 hay instaladores en python.org. En las otras tres ramas dependes de tu distribución, de tu imagen base o de compilar desde el código fuente. Con los gestores de versiones habituales:

bash
# uv: instala y fija la versión en el proyecto
uv python install 3.15.2
uv python pin 3.15.2

# pyenv: actualiza la lista de versiones y compila
pyenv update
pyenv install 3.12.16

En contenedores, fija la versión completa en el FROM (por ejemplo python:3.15.2-slim) en lugar de python:3.15, y reconstruye: una imagen ya construida no cambia porque la etiqueta flotante avance.

Checklist antes de llevarlo a producción

  • Inventaría los intérpretes reales: imágenes base, runtimes serverless, agentes de CI y VMs con el Python del sistema. Lo que corre en producción no es lo que dice el pyproject.toml.
  • Comprueba la versión dentro de cada artefacto, no en el host: python -c "import sys; print(sys.version)" en el contenedor ya construido.
  • Revisa cualquier extractall con filter="tar" o con filtros propios sobre tarballs de terceros, y ejecuta los tests que extraen archivos.
  • Busca en los logs, tras el despliegue, errores de verificación TLS nuevos. Si alguno de tus servicios dependía de un certificado emitido por esas CA intermedias, empezará a fallar; la respuesta es cambiar el certificado, no desactivar la verificación.
  • En 3.13, 3.12 y 3.11, confirma que el paquete de tu distribución o tu imagen base corresponde ya a 3.13.18, 3.12.16 o 3.11.18, o al menos que incluye el parche de gh-160040.

Fuentes

Jorge Turbica

Software Engineer y SRE. Escribo sobre los retos reales que me encuentro en producción.

Ver portfolio ↗