В мире информационной безопасности обнаружена новая серьёзная угроза, затрагивающая ядро одного из самых популярных языков программирования. В стандартной библиотеке CPython, а именно в модулях для работы со сжатыми данными, выявлена уязвимость, получившая идентификатор CVE-2026-6100. Её опасность оценена в 9.1 балла из 10 по шкале CVSS, что классифицирует её как критическую. Проблема кроется в механизмах распаковки форматов LZMA, BZ2 и GZIP и при определённых условиях может позволить злоумышленнику либо получить доступ к конфиденциальной информации из памяти процесса, либо выполнить произвольный код. Данная уязвимость напоминает специалистам о том, что даже фундаментальные, десятилетиями используемые компоненты требуют постоянного внимания с точки зрения безопасности.
Уязвимость CVE-2026-6100
Техническая суть проблемы заключается в так называемом "использовании после освобождения" (use-after-free). Этот класс уязвимостей возникает, когда программа продолжает обращаться к участку оперативной памяти после того, как он был освобождён. В контексте CPython ошибка проявляется в классах "lzma.LZMADecompressor", "bz2.BZ2Decompressor" и "gzip.GzipFile". Однако для её эксплуатации необходимо выполнение специфического сценария. Во-первых, в процессе распаковки данных должно произойти исчерпание доступной памяти, что приводит к генерации исключения "MemoryError". Во-вторых, и это ключевое условие, само приложение должно повторно использовать тот же самый экземпляр объекта-распаковщика после возникновения данной ошибки. Если же программа при каждом вызове создаёт новый объект для декомпрессии или не пытается продолжить работу с тем же экземпляром после сбоя, она остаётся защищённой.
Важно отметить, что упрощённые вспомогательные функции, такие как "lzma.decompress()", "bz2.decompress()" и "gzip.decompress()", не затронуты, поскольку внутри них для каждой операции создаётся новый экземпляр распаковщика. Таким образом, основному риску подвержены высокопроизводительные или специализированные приложения, которые сознательно переиспользуют объекты для декомпрессии в целях оптимизации, чтобы избежать накладных расходов на их постоянное создание и уничтожение. Это могут быть системы потоковой обработки больших данных, серверы приложений, работающие со сжатыми архивами, или бэкенд-сервисы, принимающие входящие сжатые файлы. В условиях ограниченной памяти, например, в контейнеризованных средах с жёсткими лимитами или на устройствах с малым объёмом ОЗУ, создание условий для исчерпания памяти становится более реалистичным вектором для атаки.
Последствия успешной эксплуатации такой уязвимости могут быть крайне тяжёлыми. Использование после освобождения часто ведёт к повреждению данных в памяти, что может вызвать аварийное завершение программы (отказ в обслуживании). Однако более опасным сценарием является возможность утечки информации. Злоумышленник, контролируя данные, подаваемые на вход распаковщику, может спровоцировать сбой и затем, манипулируя повторным использованием объекта, прочитать содержимое освобождённой памяти. В этой области могут случайно оказаться конфиденциальные данные: пароли, сессионные ключи, персональная информация пользователей или фрагменты исходного кода. В худшем случае, благодаря сложным техникам эксплуатации памяти, атакующий может добиться выполнения собственного произвольного кода в контексте уязвимого процесса, что фактически даёт ему полный контроль над системой.
На текущий момент исправление доступно в форме патча для исходного кода CPython. Разработчикам настоятельно рекомендуется изучить соответствующий коммит в репозитории языка и применить его к своим сборкам. Для команд, использующих Python из официальных дистрибутивов или репозиториев пакетов, следует дождаться выхода обновлённых версий, содержащих исправление, и незамедлительно установить их. В качестве временной меры предосторожности можно пересмотреть код приложений на предмет использования уязвимых классов. Если повторное использование объектов "LZMADecompressor", "BZ2Decompressor" или "GzipFile" не является строго необходимым, стоит рассмотреть переход на простые функции "decompress()", которые не подвержены проблеме. Кроме того, целесообразно реализовать в коде более жёсткую обработку исключения "MemoryError", гарантированно завершая работу с объектом-распаковщиком при его возникновении и создавая новый экземпляр для последующих операций.
Обнаружение CVE-2026-6100 служит важным напоминанием для сообщества разработчиков и специалистов по безопасности. Даже в зрелых и надёжных экосистемах, таких как Python, могут скрываться тонкие и сложные для обнаружения дефекты, особенно в коде, работающем с низкоуровневыми операциями, такими как управление памятью. Этот инцидент также подчёркивает важность практик безопасного программирования, включая тщательное тестирование в условиях стресса, например, при нехватке памяти, и внимательный аудит кода, который переиспользует объекты для повышения производительности. Для бизнеса, чьи сервисы полагаются на обработку сжатых данных с помощью Python, данная уязвимость представляет собой прямой операционный риск, требующий немедленной оценки и принятия мер по снижению угрозы до появления активных эксплойтов в дикой природе.
Ссылки
- https://mail.python.org/archives/list/security-announce@python.org/thread/HTWB2Z6KT5QQX4RYEZAFININDHNOSIF3/
- https://security-tracker.debian.org/tracker/CVE-2026-6100
- https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2026-6100
- https://github.com/python/cpython/pull/148396