Разработчики CPython выпустили исправление для уязвимости, затрагивающей версии интерпретатора для операционной системы Windows. Проблема, получившая идентификатор CVE-2026-12003, связана с механизмом поиска путей к файлам при сборке "на месте" (in‑tree layout) и может привести к нарушению конфиденциальности данных и обходу политики безопасности. Уровень опасности оценён как средний (5,3 балла по шкале CVSSv4).
Уязвимость CVE-2026-12003
Ошибка возникает из‑за того, что в сборочных версиях CPython сохранился код, позволяющий запускать интерпретатор непосредственно из дерева исходников, а не из установочной директории. Для этого на этапе компиляции определяется переменная VPATH, указывающая путь к вспомогательным файлам - в частности, к маркеру Modules/setup.local. Когда этот маркер обнаруживается относительно пути к исполняемому файлу, Python считает, что работает внутри исходного дерева, и генерирует альтернативный sys.path. Этот код остаётся и в релизных сборках, чтобы можно было тестировать готовящиеся к выпуску версии без установки.
На Windows каталоги сборок размещаются в PCbuild/<архитектура>, поэтому значение VPATH устанавливается как ..\.., что приводит к маркеру ..\..\Modules\setup.local. Этот путь располагается вне установочной директории Python и может иметь иные права доступа. В результате пользователь с низкими привилегиями способен создать нужный файл-маркер и подменить папку Lib, которая будет обнаружена при запуске Python. Особенно уязвимы системы, где использовался устаревший установщик EXE, устанавливающий Python для всех пользователей в корень диска: на Windows любой пользователь может создавать папки в корневой директории.
Проблему обнаружил Джейк Ямаки, старший консультант компании Bishop Fox. Он указал, что атака требует локального доступа и некоторых дополнительных условий: злоумышленнику необходимо иметь возможность создавать файлы в определённой области файловой системы, а жертва должна запустить интерпретатор с недостаточно защищённой установкой. При успешной эксплуатации злоумышленник мог бы внедрить в sys.path подставную библиотеку, что потенциально открывает путь к выполнению произвольного кода и краже данных.
Разработчики Python обратили внимание, что проблема затрагивает только Windows - на других платформах переменная VPATH переопределяется, но расположение бинарных файлов обычно не ведёт к маркеру за пределами установочной директории. Кроме того, механизм обнаружения через VPATH является запасным и включается, когда отсутствует более специфичный маркер pybuilddir.txt. В будущих версиях Python этот запасной путь будет удалён, и для работы с исходным деревом потребуется явное присутствие файла pybuilddir.txt.
В качестве основной меры защиты команда CPython рекомендует перейти с устаревшего установщика EXE на новый менеджер установки Python, который ставит интерпретатор для текущего пользователя. В такой конфигурации каталог двумя уровнями выше установочной директории не доступен для изменения другими пользователями, что исключает возможность повышения привилегий. Если переход невозможен, можно заблаговременно создать папку Modules и ограничить к ней доступ. При этом следует учитывать, что только версии 3.13 и 3.14 получат обновлённые установщики EXE - для более ранних выпусков исправления предоставляются исключительно в исходных кодах.
Согласно бюллетеню безопасности Python JIFOBO7UX3LY4VJKJUOKYJV62CFR2IRH, опубликованному 16 июня, уязвимости подвержены все версии CPython для Windows от 3.11.0 до 3.11.15, от 3.12.0 до 3.12.13, от 3.13.0 до 3.13.14, от 3.14.0 до 3.14.6, а также бета-версия 3.15.0b2. Пользователям настоятельно рекомендуется обновить интерпретатор до актуальной сборки, включившей исправление. Ссылки на патч и полное описание уязвимости доступны в архиве списка рассылки security-announce@python.org и на портале CVE.
Новость подчёркивает сохраняющуюся важность корректной обработки путей в сборочных механизмах языков программирования. В случае CPython проблема была известна разработчикам, но оставалась незамеченной до отчёта стороннего эксперта. После устранения уязвимости команда Python планирует окончательно отказаться от использования VPATH в качестве метода определения исходного дерева, что должно предотвратить появление подобных ошибок в будущем.
Ссылки
- https://www.cve.org/CVERecord?id=CVE-2026-12003
- https://github.com/python/cpython/pull/151545
- https://mail.python.org/archives/list/security-announce@python.org/thread/JIFOBO7UX3LY4VJKJUOKYJV62CFR2IRH/