Python 3.15.2 и ещё четыре выпуска: ssl сам блокирует ключи eMudhra

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, пора переезжать.

Источники и ссылки


Комментарии загружаются…