В стандартной библиотеке CPython обнаружили уязвимость, связанную с распаковкой zip-архивов, использующих сжатие bzip2, LZMA и Zstandard. При обработке специально созданных файлов интерпретатор может предварительно выделить слишком большой объём памяти, что приводит к её исчерпанию и отказу в обслуживании. Проблема зарегистрирована как CVE-2026-15310 и получила оценку 2,1 балла по шкале CVSS, то есть низкий уровень опасности.
Уязвимость CVE-2026-15310
Уязвимость затрагивает модуль zipfile, который входит в состав стандартной библиотеки Python. Этот модуль отвечает за чтение и запись ZIP-архивов, и, как следствие, используется в огромном количестве приложений, от скриптов автоматизации до веб-серверов. При распаковке содержимого архивов модуль обрабатывает данные, сжатые разными алгоритмами. Для bzip2, LZMA и Zstandard существует особенность: при чтении блоков данных недостаточно строго соблюдается ограничение на максимальный размер распакованного фрагмента.
Суть проблемы в том, что при декомпрессии Python может опираться на значение размера, которое указывает сам архив. Атакующий, контролирующий содержимое zip-файла, способен задать это значение произвольно большим. Не проверив реальный объём данных, интерпретатор пытается зарезервировать память под будущий результат распаковки. Если размер окажется чрезмерным, процесс исчерпает доступную память и аварийно завершится либо зависнет. Таким образом, даже небольшой по размеру архив может вызвать проблемы на стороне сервера или рабочей станции.
Важно отметить, что для эксплуатации уязвимости требуется хотя бы минимальное взаимодействие с пользователем. В соответствии с вектором CVSS, атака возможна только в том случае, если жертва откроет вредоносный файл или система автоматически распакует присланный архив. В большинстве реальных сценариев это означает, что злоумышленнику придётся отправить файл по электронной почте, разместить его на сайте или иным образом убедить человека запустить обработку. Поэтому уязвимость нельзя назвать критической, но её существование создаёт дополнительный риск для сервисов, которые принимают файлы от пользователей и распаковывают их на лету.
Особую актуальность проблема представляет для веб-приложений и API, где загрузка zip-архивов является штатной функцией. Если приложение использует модуль zipfile для извлечения содержимого, то специально сформированный архив может привести к исчерпанию памяти на сервере. В многопользовательской среде это способно вызвать отказ в обслуживании сразу для многих клиентов. При этом, согласно описанию, уязвимость затрагивает только версии CPython до 3.15.0 включительно - точнее, все выпуски до указанной версии считаются затронутыми, а в версии 3.15.0 проблема уже устранена.
Исправление появилось в релизе CPython 3.15.0, который стал доступен вскоре после публикации бюллетеня безопасности. Разработчики добавили ограничение на максимальную длину блока при распаковке данных, сжатых методами bzip2, LZMA и Zstandard. Это значит, что значение из архива больше не используется напрямую для выделения памяти без проверки фактического размера. Пользователям, работающим на более ранних версиях интерпретатора, рекомендуется обновить CPython до актуальной версии или применить соответствующий патч из репозитория проекта.
Уязвимость подобного рода не является уникальной для Python. Неограниченное выделение памяти при распаковке сжатых данных периодически обнаруживается в различных языках программирования и библиотеках. Проблема возникает, когда разработчики полагаются на данные из внешнего источника, будь то заголовок архива, поле длины или метаданные, вместо проверки фактического объёма потока. В данном случае низкая оценка серьёзности объясняется необходимостью участия пользователя, однако для проектов, автоматически обрабатывающих архивы, риск остаётся значимым. Даже одна успешная атака может надолго вывести сервис из строя, а в сочетании с другими уязвимостями подобная проблема способна стать звеном в более сложной цепочке атак.
Тем не менее, разработчики CPython отреагировали оперативно: уведомление о проблеме появилось 25 августа 2026 года, а уже в версии 3.15.0 доступно исправление. Пользователям стоит проверить, какая версия интерпретатора используется в их окружении, и при необходимости обновить её или установить патч. Для тех, кто не может обновиться немедленно, временной мерой может стать ограничение максимального размера загружаемых архивов и запрет на распаковку файлов из непроверенных источников. В остальном уязвимость служит очередным напоминанием о том, что даже низкорисковые ошибки в популярном программном обеспечении требуют своевременного внимания, поскольку масштаб использования таких библиотек делает любую проблему потенциально массовой.
Ссылки
- https://www.cve.org/CVERecord?id=CVE-2026-15310
- https://mail.python.org/archives/list/security-announce@python.org/thread/YUHXURX2WZGKGNA4ANYBQS2VZRYQ5JNK/