Python Weekly #5: Python 3.15.1 revoca CA comprometida, PEP 850 para aceleración por hardware y retirada del PEP 836

Python · Weekly #5

Python Weekly #5: Python 3.15.1 revoca CA comprometida, PEP 850 para aceleración por hardware y retirada del PEP 836

PythonSemanalWheelVariantsJITVulnerabilidad de seguridad

Fuentes:GitHub Releases + 官方博客 + HN

Bienvenidos a la 5.ª edición de la columna de Python en Tuanzi Tech Digest. Esta semana (del 19 al 26 de octubre de 2026), el equipo oficial de Python publicó múltiples versiones de mantenimiento de emergencia para interceptar certificados CA comprometidos; el grupo de trabajo de empaquetado presentó conjuntamente el PEP 850 para normalizar la distribución de paquetes con aceleración por hardware; el equipo central de CPython retiró el PEP 836 reorientando el desarrollo del compilador JIT hacia prototipos externos; y una vulnerabilidad crítica en el decodificador Brotli amenazó la cadena de dependencias de red en Python. A continuación, el resumen de las novedades técnicas verificadas de los últimos siete días.

📦 Estado de versiones

Lanzamientos de emergencia y blindaje de la capa de transporte

La versión de producción estable principal actual es Python 3.15.1 (publicada el 21 de octubre de 2026, firmada por el director de lanzamiento Hugo van Kemenade). Para un análisis exhaustivo de las novedades de la serie 3.15, consulte nuestro informe: Detalles de Python 3.15.

En los últimos siete días, tras la filtración de las claves privadas de certificados intermedios de la entidad certificadora de confianza eMudhra, el equipo de CPython ejecutó dos lanzamientos de emergencia consecutivos e integró en la rama principal una corrección para una regresión de interbloqueo en la importación de módulos. Los cambios de ingeniería fundamentales incluyen:

  1. Bloqueo de validación de certificados (gh-160040 / CVE-2026-115557): Ante el compromiso de la clave privada intermedia de eMudhra, las versiones Python 3.15.1, 3.14.9 y 3.13.17 publicadas el 21 de octubre actualizaron la versión integrada de pip a 26.2.2 (con certifi 2026.10.19). El 25 de octubre se publicaron además 3.13.18, 3.12.16 y 3.11.18, inyectando directamente en el módulo central _ssl una lista negra codificada basada en hashes SubjectPublicKeyInfo (SPKI). Siempre que el cliente tenga activada la comprobación de certificados, la negociación TLS aborta inmediatamente la conexión afectada sin esperar a que el sistema operativo actualice su almacén de confianza.
  2. Parches de estabilidad en Python 3.15.1: Como primera actualización de mantenimiento para 3.15.0, 3.15.1 incorpora unas 330 correcciones aportadas por 117 colaboradores. Entre los aspectos destacados: solución de una vulnerabilidad en http.cookiejar con versiones negativas de cookies (gh-160300), corrección de una condición de carrera durante la limpieza concurrente en tempfile.TemporaryDirectory (gh-157579), solución al riesgo de evasión de rutas por enlaces en tarfile.tar_filter (CVE-2026-114583) y desactivación de la carga predeterminada de mimetypes.knownfiles en Windows (CVE-2024-3220).
  3. Corrección de falsos interbloqueos en importaciones concurrentes (gh-159963 / gh-159965): El componente _HierarchicalLockManager introducido en 3.15.0 provocaba que el bloqueo del paquete principal se mantuviera durante la ejecución del cuerpo del submódulo, generando excepciones falsas de tipo _DeadlockError durante arranques en frío multihilo. El equipo central desacopló este comportamiento en main y en la rama de mantenimiento 3.15, liberando el cerrojo del paquete contenedor justo antes de ejecutar el código del submódulo.

Resumen de las ramas de mantenimiento oficial:

VersiónFecha de lanzamientoEstado de la ramaPuntos clave e impacto técnico
Python 3.15.12026-10-21Rama principal estable (Bugfix)Incluye pip 26.2.2 sin la CA revocada; 330 correcciones de estabilidad
Python 3.14.92026-10-21Mantenimiento anterior (Bugfix)Actualiza pip y sincroniza certificados en el instalador de macOS
Python 3.13.182026-10-25Soporte de seguridad (Security)Bloqueo por SPKI en _ssl de eMudhra; actualización de Expat a 2.9.0
Python 3.12.162026-10-25Soporte de seguridad (Security)Parche retrospectivo de SPKI y protección contra evasión en tarfile
Python 3.11.182026-10-25Soporte de seguridad (Security)Bloqueo de huellas de certificados en contenedores y sistemas legados

La revisión de las notas de lanzamiento confirma que actualizar el binario global de Python en el sistema operativo no modifica las dependencias de los entornos virtuales preexistentes. Es imprescindible ejecutar python -m pip install --upgrade certifi pip dentro de cada virtualenv activo para garantizar la protección.


📝 Artículos en profundidad

Presentación oficial del PEP 850: Wheel Variants estandariza ruedas para hardware heterogéneo

  • Qué sucedió: El 19 de octubre de 2026, Michał Górny (Quansight), Jonathan Dekhtiar, Konstantin Schütze (Astral/uv) y Ralf Gommers presentaron formalmente el PEP 850 (Wheel Variants: Providers), unificando y reestructurando los previos PEP 817 y PEP 825. La propuesta cuenta con el patrocinio de Carol Willing y la autoría conjunta de Astral, Meta y Quansight.
  • Por qué es importante: Las bibliotecas de computación científica como PyTorch y JAX se veían limitadas por las etiquetas estáticas de plataforma, dependiendo históricamente de sufijos de versión local (como +cu124) o índices privados Extra Index para distribuir binarios con soporte de aceleradores. El PEP 850 define un mecanismo de extensión de proveedores de variantes (Variant Providers) que permite a los resolutores inspeccionar dinámicamente los aceleradores del host en la instalación (CUDA compute capability, ROCm, AVX-512, Metal). Esto habilita la resolución automática del paquete óptimo desde el índice principal de PyPI sin recurrir a convenciones propietarias.
  • Quiénes se ven afectados: Desarrolladores de frameworks de aprendizaje profundo, mantenedores de paquetes científicos, creadores de herramientas de empaquetado (uv, pip) y administradores de canales de integración continua.

CPython retira el PEP 836 y el PEP 774: la estrategia JIT se desplaza a prototipos externos

  • Qué sucedió: El 19 de octubre de 2026, los autores principales del JIT de CPython, Savannah Ostrowski, Ken Jin y Brandt Bucher, anunciaron la retirada formal del PEP 836 (“JIT Go Brrr: The Path to a Supported JIT Compiler for CPython”). El 20 de octubre se retiró de forma sincronizada el PEP 774, concebido para eliminar la dependencia de compilación de LLVM. En el foro Discourse, los autores señalaron que, debido a limitaciones de dedicación y al alto umbral de estabilidad fijado por el Steering Council para 3.16, el prototipo JIT a nivel de método continuará su desarrollo en una bifurcación externa (openai-oss-forks:cpython:public/pep-836).
  • Por qué es importante: La decisión supone un giro desde la arquitectura de rastreo (tracing JIT) adoptada en 3.13 hacia un modelo basado en métodos. La prueba de concepto logró aceleraciones del 5 al 6 % en los bancos de pruebas pyperformance y Pyston, reduciendo además unas 3.100 líneas de código generado y 4.300 de código estático. No obstante, alcanzar una calidad de producción de primer nivel en entornos multiplataforma y sin GIL (free-threading) no era viable a corto plazo. Por ello, el proyecto oficial ralentiza la integración del compilador JIT como característica predeterminada en 3.16.
  • Quiénes se ven afectados: Arquitectos de sistemas centrados en el rendimiento del intérprete, desarrolladores de paralelismo sin GIL e investigadores de compiladores y máquinas virtuales.

CVE-2026-111497 (Broccoli2Shell): desbordamiento de escritura en Brotli impacta librerías HTTP de Python

  • Qué sucedió: El 24 de octubre de 2026, analistas de seguridad hicieron pública una vulnerabilidad crítica de escritura fuera de límites en el decodificador Brotli en C de Google (CVE-2026-111497, puntuación CVSS 4.0 de 9.2 Crítica), afectando a las versiones 1.0.3 a 1.2.0. Las extensiones en C disponibles en PyPI, Brotli y brotlicffi, están directamente comprometidas.
  • Por qué es importante: Si la librería está instalada en el entorno, urllib3 y requests envían automáticamente la cabecera Accept-Encoding: br y descomprimen el contenido de forma transparente; el entorno asíncrono aiohttp actúa del mismo modo. Incluso si el código del usuario no llama a funciones de descompresión, cualquier petición saliente que reciba una respuesta maliciosa de aproximadamente 23 MB desencadena una escritura fuera de límites en memoria, provocando denegaciones de servicio o ejecución remota de código (RCE). En producción es urgente actualizar a Brotli>=1.2.1 o brotlicffi>=1.2.1.0. Si la actualización no puede realizarse de inmediato, desinstalar ambos paquetes hace que el cliente use de forma segura compresión gzip.
  • Quiénes se ven afectados: Ingenieros de backend que utilizan requests, urllib3 o aiohttp para llamadas salientes, desarrolladores de rastreadores web y equipos de seguridad de operaciones.

Python 3.15 corrige el falso interbloqueo en importaciones jerárquicas concurrentes (gh-159963)

  • Qué sucedió: El 25 de octubre de 2026, el equipo central de CPython integró en main el pull request gh-159965 (y adaptó gh-160630 a la rama 3.15), subsanando un fallo de bloqueo en la primera importación concurrente de submódulos derivado de _HierarchicalLockManager en 3.15.0 (gh-159963).
  • Por qué es importante: En 3.15.0, cuando varios hilos ejecutaban importaciones simultáneas entre paquetes por primera vez, el cerrojo del paquete contenedor se retenía durante la ejecución del cuerpo del submódulo. Como resultado, código legítimo sin dependencias circulares producía excepciones falsas _DeadlockError o fallos aparentes de ImportError. Librerías clave como cryptography y protobuf experimentaban bloqueos recurrentes en arranques en frío multihilo. El parche reestructura la gestión del ciclo de vida de los bloqueos, asegurando la liberación del cerrojo superior antes de ejecutar el módulo hijo.
  • Quiénes se ven afectados: Equipos que despliegan microservicios multihilo en Python 3.15.0 o inicializan procesos concurrentes con FastAPI, Gunicorn y Celery.

🔥 Debate comunitario

Secuelas de Broccoli2Shell: seguridad del código C frente a la negociación implícita

  • Repercusión: El hilo principal de Hacker News reunió 390 puntos / 209 comentarios (HN #50219177), acompañado de un hilo secundario con 186 puntos / 95 comentarios (HN #50216791).
  • Puntos centrales del debate:
    1. ¿Debe reescribirse el software de base en Rust?: Numerosos desarrolladores de sistemas argumentaron que el hecho de que un componente universal como Brotli sufra un fallo de memoria con gravedad 9.2 confirma la necesidad de adoptar Rust en la infraestructura central. En contraposición, defensores de C señalaron que la base existente ha acumulado más de diez años de afinamiento SIMD para microarquitecturas, donde el rendimiento de descompresión en entornos edge es crítico y difícilmente igualable a corto plazo en una reescritura.
    2. ¿Deben los clientes HTTP eliminar la negociación implícita?: Varios ingenieros cuestionaron que urllib3 y requests activen Accept-Encoding: br por el mero hecho de encontrar el paquete en el entorno, considerando que esta conducta implícita amplía la superficie de ataque y debería requerir activación explícita. Los mantenedores respondieron que la negociación automática de compresión es la norma establecida en los estándares HTTP modernos, y exigir configuración manual dispararía el consumo global de ancho de banda.

Daniel Lemire evalúa fastpybase64: optimización SIMD y el papel de la biblioteca estándar

  • Repercusión: Conversación en Hacker News (HN #50154972) y artículo técnico de Daniel Lemire.
  • Puntos centrales del debate: En pruebas sobre un único núcleo de un Intel Xeon Gold 6548N, fastpybase64 (basado en simdutf) alcanzó una velocidad de decodificación de 13,3 GB/s en bloques de 64 KiB: 4 veces más rápido que pybase64 (3,1 GB/s) y 27 veces más rápido que el módulo base64 de la biblioteca estándar de Python (0,49 GB/s).
    1. ¿Debería CPython incorporar vectorización SIMD nativa en la biblioteca estándar?: Los defensores del rendimiento señalaron que operaciones como Base64 y JSON representan cuellos de botella habituales y que la biblioteca estándar debería incluir instrucciones ensambladas como simdutf. Los mantenedores del núcleo defendieron que la prioridad de CPython es la máxima portabilidad; mantener matrices de compilación SIMD multiplataforma en el árbol de CPython dispararía los costes de mantenimiento, siendo preferible conservar una biblioteca estándar limpia y confiar el rendimiento extremo a librerías especializadas.
    2. Saturación del ancho de banda de memoria sin GIL: En un entorno multihilo sin GIL, un solo núcleo procesando 13 GB/s se acerca al límite físico del bus de memoria. El rendimiento decreciente de mayores optimizaciones vectoriales bajo alta concurrencia centró parte del análisis técnico.

Puntos ciegos en la cadena de suministro de PyPI: discrepancia entre fuentes y binarios

  • Repercusión: Debate en Hacker News (HN #50154823) y artículo del investigador Artem Golubin.
  • Puntos centrales del debate: La atención se centró en una debilidad estructural de los procesos de verificación de PyPI: la inmensa mayoría de analizadores de seguridad revisan únicamente el código fuente de los paquetes (sdist). Esto permite a atacantes publicar código inofensivo en GitHub y simultáneamente inyectar código binario malicioso en los paquetes compilados preexistentes (.whl) subidos a PyPI.
    1. ¿Debe exigirse compilación en infraestructura gestionada y compilaciones reproducibles?: Quienes abogan por mayores garantías de seguridad propusieron prohibir de forma gradual la subida de binarios compilados localmente por los desarrolladores, obligando a realizar compilaciones reproducibles en CI verificada con firmas criptográficas. La comunidad de empaquetado recordó que Python depende de compilaciones cruzadas complejas (C, C++, Fortran, Rust) y que PyPI carece de la infraestructura necesaria para asumir la capacidad de cómputo mundial de compilación, advirtiendo de que una exigencia drástica colapsaría las publicaciones de paquetes científicos.

🔭 Qué vigilar la próxima semana

  • Avances en CPython 3.16.0 y evolución de WASI: Seguimiento de la integración en el marco del PEP 11 para actualizar el destino de WebAssembly de wasip1 a wasip3.
  • Elecciones del Python Steering Council 2026: Apertura del calendario de votación según el PEP 8107 y anuncios de candidaturas para renovar el consejo de gobierno.