Разработчики Python устранили несколько уязвимостей в CPython, затрагивающих все версии до 3.15.0. Одна из них связана с функцией управления паролями и позволяет перехватить учетные данные при переходе с защищенного соединения на открытое. Другая нарушает корректность обработки доменных имен и может приводить к обходу политик безопасности. Обе проблемы получили средний уровень серьезности по шкале CVSS, балл 6.0.
Детали уязвимостей
Первая уязвимость, зарегистрированная под идентификатором CVE-2026-15806, обнаружена в классе HTTPPasswordMgr из модуля urllib.request. Этот компонент отвечает за хранение и подстановку учетных данных для HTTP-запросов, например, при использовании базовой аутентификации. Проблема в том, что при сопоставлении сохраненных паролей с адресом запроса не учитывается схема URL, то есть протокол http или https. Если приложение сохранило пароль для защищенного соединения с хостом, а затем выполняет запрос к этому же хосту по открытому протоколу, пароль отправляется в незашифрованном виде. Такой сценарий возможен, когда клиент следует редиректу с HTTPS на HTTP или когда злоумышленник находится на сетевом пути и принудительно понижает защищенное соединение до незащищенного. В этом случае данные перехватываются и читаются в открытом виде. Аналогично пароль, сохраненный для HTTP-адреса, может быть передан при запросе по HTTPS, что приводит к раскрытию учетных данных внутри зашифрованного канала, но при этом они могут оказаться в журналах или прокси-серверах.
Исправление ограничивает область действия учетных данных. Теперь пароль, зарегистрированный для адреса с явной схемой, используется только для запросов с той же схемой. При этом сохраненная запись без указания схемы, например, только имя хоста, по-прежнему подходит для любых протоколов, что сохраняет совместимость со старым кодом и прокси-аутентификацией. Для тех, кто не может немедленно обновиться, существует обходной путь: не выполнять обычные HTTP-запросы к хостам, для которых заданы учетные данные, и не следовать редиректам на незащищенные адреса.
Вторая уязвимость, CVE-2026-17084, связана с модулем stringprep, который используется для подготовки строк, в том числе доменных имен и паролей, к обработке по стандарту IDNA 2003. Модуль обращается к таблицам из спецификации RFC 3454, но ошибочно использует текущие атрибуты символов Unicode вместо версии Unicode 3.2.0, указанной в стандарте. Это приводит к расхождениям при обработке символов, которые появились или изменили свои свойства, например, поведение при преобразовании регистра, после выхода Unicode 3.2.0. В результате доменные имена, содержащие такие символы, обрабатываются некорректно: функция in_table_b2() может не распознать символ, который должен считаться допустимым, или наоборот, принять ошибочный вариант. На практике это означает, что системы, полагающиеся на преобразование доменных имен в единый канонический вид, могут по-разному интерпретировать похожие адреса, что потенциально позволяет подменять имена или обходить фильтры безопасности. Подобные проблемы особенно актуальны для серверов электронной почты, браузеров и межсетевых экранов, где проверка доменных имен играет ключевую роль.
Обе уязвимости закрыты в выпуске CPython 3.15.0. Для более старых веток разработчики выпустили исправления в рамках регулярных обновлений безопасности, подробности приведены в официальных бюллетенях на сайте проекта. Пользователям рекомендуется обновить интерпретатор Python, а также проверить, что используемые приложения собираются с актуальной версией. Особое внимание стоит уделить средам, где Python применяется для обработки внешних запросов, например, в веб-фреймворках или инструментах автоматизации. В таких системах уязвимость HTTPPasswordMgr может иметь практические последствия, так как перехват паролей происходит незаметно для пользователя и без следов в журналах приложения.
Эти находки показывают, что даже в зрелых и широко используемых языках программирования сохраняются проблемы, связанные с несоответствием реализаций стандартам и недостаточной проверкой граничных условий. Уязвимости в обработке URL и строковых преобразованиях требуют особого внимания, поскольку они затрагивают базовые механизмы безопасности, на которые опираются тысячи сторонних библиотек и сервисов. Своевременное обновление остается главным способом защиты, но разработчикам также стоит пересмотреть практики хранения и передачи учетных данных, в идеале переходя на более современные схемы аутентификации, не предполагающие отправку пароля в каждом запросе.
Ссылки
- https://mail.python.org/archives/list/security-announce@python.org/thread/3OKPE5S75KDNA7FY7AI3PL2MXM2X5RB3/
- https://mail.python.org/archives/list/security-announce@python.org/thread/EUHHTC6EV7HCLSUHP25C5VHSV4V2MUZN/