Критическая уязвимость в CPython: повторное использование декомпрессора bz2 ведёт к отказу в обслуживании

Python

В эталонной реализации языка Python, известной как CPython, обнаружена уязвимость высокого уровня опасности. Она затрагивает модуль bz2, предназначенный для работы с архивами, использующими одноимённый алгоритм сжатия. Проблема получила идентификатор CVE-2026-9669. Согласно оценке по шкале CVSS 4.0, уровень опасности составляет 8,2 балла из десяти - это высокая степень риска.

Уязвимость CVE-2026-9669

Уязвимость связана с некорректным поведением объекта BZ2Decompressor (декодировщика bz2-потоков). В штатном режиме при ошибке распаковки данных этот объект выбрасывает исключение OSError (ошибка операционной системы). Разработчик, обработав такое исключение, теоретически может попытаться повторно использовать тот же самый объект декомпрессора для обработки следующего фрагмента данных. Однако внутреннее состояние объекта после ошибки становится неопределённым. Если злоумышленник подставит специально сформированные входные данные, декомпрессор может возобновить работу из некорректного состояния и выполнить запись за границы буфера стека (stack buffer overflow). В результате процесс аварийно завершается, что приводит к отказу в обслуживании.

Иными словами, атакующий не получает доступа к данным или управления системой, но может сделать целевое приложение недоступным. Для удалённой атаки достаточно передать серверу вредоносный архив bz2, который обрабатывается одним и тем же экземпляром декомпрессора после перехвата исключения. Эта техника особенно опасна для долгоживущих процессов, которые многократно используют один объект BZ2Decompressor, например, при разборе множества небольших архивов.

Под угрозой находятся все версии CPython до 3.16.0 включительно. Разработчики из Python Software Foundation уже выпустили соответствующий патч в рамках подготовки к релизу 3.16.0. Пользователям более старых стабильных веток (3.14, 3.12, 3.10 и т. д.) рекомендуется установить обновление, которое включает исправление. Если по каким-либо причинам обновление невозможно, временной мерой может стать отказ от повторного использования одного и того же декомпрессора после ошибки: вместо этого следует создавать новый экземпляр BZ2Decompressor для каждой новой порции данных.

Описанная уязвимость относится к категории CWE-121 (Common Weakness Enumeration - каталог типовых слабостей программного обеспечения), а именно "переполнение буфера стека". Подобные ошибки возникают из-за отсутствия проверок границ при записи в локальные массивы. В данном случае дополнительным триггером стало непредусмотренное повторное использование объекта после сбоя. Это классический пример того, как обработка исключительных ситуаций может привести к новым уязвимостям, если программа не возвращается в безопасное состояние.

Для специалистов по информационной безопасности и разработчиков на Python эта новость - напоминание о том, что даже зрелые и широко распространённые проекты могут содержать скрытые дефекты. Модуль bz2 используется не только в скриптах, но и в веб-приложениях, конвейерах обработки данных и автоматизированных системах. Если сервер принимает пользовательские архивы bz2 и обрабатывает их с помощью одного экземпляра декомпрессора, атакующий может отправить последовательность из запроса, вызывающего OSError, и следом - запроса с вредоносными данными. Таким образом, отказ в обслуживании может быть вызван удалённо, без аутентификации.

Отметим, что атака требует некоторой осведомлённости о внутреннем устройстве модуля и правильном подборе входных данных, однако сложность её осуществления эксперты оценивают как достаточно низкую. Вектор атаки - сетевой (AV:N в CVSS), а для успешной эксплуатации не требуется привилегий (PR:N). Уязвимость проявляется только при определённом сценарии использования, но при его наличии последствия серьёзны: аварийное завершение процесса и, соответственно, отказ в обслуживании.

Вывод здесь однозначен: всем, кто использует CPython в production-среде, необходимо как можно скорее обновить интерпретатор до версии 3.16.0 или установить соответствующий патч для своей ветки. Тем, кто не может обновиться немедленно, следует пересмотреть логику обработки архивов bz2 - не допускать повторного использования одного и того же объекта BZ2Decompressor после ошибки. Лучше создавать новый экземпляр или перехватывать OSError и завершать работу с текущим фрагментом данных.

Эта история вновь подчёркивает, что безопасность - не статичная характеристика, а постоянный процесс. Даже такая привычная и проверенная временем библиотека, как bz2, может таить в себе неожиданные риски. Отслеживание бюллетеней безопасности и своевременное обновление остаются главными инструментами защиты от подобных угроз.

Ссылки

Комментарии: 0