26 октября 2026 года релиз-менеджер Хьюго ван Кеменаде объявил в блоге Python Insider о внеочередных выпусках Python 3.15.2, 3.14.10, 3.13.18, 3.12.16 и 3.11.18. Это продолжение истории со скомпрометированными промежуточными сертификатами eMudhra: пять дней назад команда обновила встроенный pip, а теперь сам модуль ssl отказывается работать с цепочками, где встречаются эти ключи. Заодно закрыты ещё две дыры, в tarfile и http.cookiejar.
Если на сервере крутятся скрипты, боты или сайт на Python 3.11 и новее, обновление стоит поставить. Python 3.10 в список не попал: поддержка этой ветки закончилась, и исправлений для неё больше не будет.
ssl теперь сам отсекает ключи eMudhra
Напомню суть: закрытые ключи восьми промежуточных сертификатов eMudhra (emSign) оказались слабыми, и их можно восстановить прямо из сертификатов. С таким ключом можно выпустить сертификат на чужой сайт и встать посередине между клиентом и сервером. Подробнее об инциденте и о том, почему старый pip продолжал доверять этим сертификатам, я писал в заметке про Python 3.15.1.
Теперь в модуле ssl есть короткий чёрный список таких ключей (исправление CVE-2026-115557). Сверка идёт по открытому ключу, точнее по SHA-256 от структуры SubjectPublicKeyInfo, поэтому под запрет попадают и кросс-подписанные сертификаты, которые используют тот же ключ. Как сказано в задаче gh-160040, проверка срабатывает на любом SSLContext с включённой проверкой сертификатов (CERT_OPTIONAL или CERT_REQUIRED). Похожий фильтр раньше добавили в Go.
Разработчики прямо называют это крайней мерой. Убирать доверие к сертификатам должно системное хранилище, а встроенный список только закрывает окно, пока обновление не дошло до ОС, Docker-образа или пакета вроде certifi. Новые ключи в него будут добавлять только в исключительных случаях. Практический плюс в том, что обычный pip, в том числе при обновлении самого себя, на новом Python уже безопасен, даже если в виртуальном окружении остался старый pip.
tarfile и cookiejar: ещё две дыры
Вторая уязвимость, CVE-2026-114583, в распаковке tar-архивов. Фильтр tarfile.tar_filter пропускал ссылки, путь которых указывает на саму папку распаковки, например ссылки с пустым именем. Фильтр data_filter такие ссылки уже отбрасывал, теперь их отбрасывает и tar_filter. Это важно тем, кто распаковывает чужие архивы с filter=”tar”.
Третья правка в http.cookiejar. Как показал разработчик Грегори Смит в задаче gh-160300, политика DefaultCookiePolicy проверяла домен только у cookie с версией 0 или выше. Если сервер присылал Set-Cookie с отрицательным Version, домен вообще не сверялся. В итоге любой сайт, к которому программа ходит с общим CookieJar, мог поставить или перезаписать cookie для постороннего домена. Читать чужие cookie так нельзя. Теперь такие cookie просто игнорируются.
Что ещё в 3.13.18, 3.12.16 и 3.11.18
Старые ветки заодно получили исправления, которые в 3.15.1 и 3.14.9 вошли ещё 21 октября:
- встроенная библиотека Expat обновлена до 2.9.0, это закрывает CVE-2026-77214 и CVE-2026-102633;
- на Windows mimetypes больше не читает по умолчанию файлы из mimetypes.knownfiles (CVE-2024-3220);
- исправлен ещё один случай неправильного переноса заголовков в модуле email;
- в 3.13.18 и 3.12.16 исправлена гонка при удалении tempfile.TemporaryDirectory.
Готовые установщики для Windows и macOS есть только у 3.15.2 и 3.14.10. Ветки 3.13, 3.12 и 3.11 уже в режиме только исправлений безопасности, поэтому для них выпущены одни исходники. Пользователям 3.15 будет полезна ещё одна правка: в 3.15.2 исправлена регрессия 3.15.0, из-за которой потоки, впервые импортирующие подмодули пакета, могли получить _DeadlockError или ложную ошибку о частично инициализированном модуле.
Как проверить и обновить
Сначала посмотрите, какая версия реально работает в окружении приложения:
python3 -c "import sys, ssl; print(sys.version); print(ssl.OPENSSL_VERSION)" # то же внутри виртуального окружения /path/to/venv/bin/python -V
Python, собранный из исходников или поставленный через pyenv, обновляется до новой версии этой же ветки. Системный Python в Debian, Ubuntu и других дистрибутивах собирают мейнтейнеры, туда исправление приходит обычным обновлением пакета, и номер версии может отличаться от официального. Если Python живёт в Docker-образе, после выхода новых тегов образ нужно пересобрать. А pip, certifi и uv в старых виртуальных окружениях всё равно лучше обновить, как советовали после первого бюллетеня: встроенный в ssl список защищает только на новых выпусках Python.
На практике это означает следующее: на Python от 3.11 до 3.15 после обновления скомпрометированные ключи eMudhra не пройдут проверку TLS, даже если системное хранилище или certifi ещё не обновлены. Плюс закрыты обход фильтра tar и подмена cookie для чужих доменов. Обновиться стоит всем, кто сидит на поддерживаемых ветках, а тем, кто ещё на 3.10, пора переезжать.