Фильтр извлечения tarfile в CPython допускает создание каталогов вне целевой директории

Python

В CPython существует уязвимость в модуле tarfile, которая позволяет обойти фильтр извлечения архивов и создать пустые каталоги за пределами целевой папки. Проблема получила идентификатор CVE-2026-19672 и оценку 6,3 балла по шкале CVSS, что соответствует среднему уровню опасности. Уязвимость затрагивает только POSIX-совместимые платформы, включая Linux и macOS, тогда как Windows не подвержена из-за особенностей обработки путей.

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

CPython используется не только как самостоятельный интерпретатор, но и входит в состав многих операционных систем и сред выполнения. Поэтому обновление может потребоваться не только там, где Python установлен вручную, но и в дистрибутивах, где управление пакетами отвечает за его поддержку.

Злоумышленник формирует архив TAR, в котором одна из записей имеет имя, нарушающее логику фильтра. Такой архив можно распространять через электронную почту, мессенджеры или размещать на сайтах. Если система автоматически распаковывает полученные файлы, атака происходит без участия пользователя. В случае ручной распаковки жертва должна открыть архив сама, что снижает, но не исключает риск.

Модуль tarfile входит в стандартную библиотеку Python и работает с архивами TAR. Фильтры, применяемые при извлечении, ограничивают записи архива пределами указанной директории. Уязвимость возникает из-за расхождения между проверкой имени и фактическим созданием каталогов. Фильтр вычисляет нормализованный путь записи, в котором устранены переходы на уровень выше, и проверяет, что этот путь находится внутри целевой папки. Однако промежуточные каталоги система создаёт на основе исходного имени записи без нормализации. Если имя выглядит как переход в родительский каталог, а затем возврат в целевую директорию, проверка проходит успешно, но во время извлечения система создаёт каталог за пределами назначения.

Процесс извлечения идёт поэтапно: сначала система создаёт все промежуточные каталоги, указанные в имени записи, затем помещает файл. Если имя начинается с перехода на уровень выше, система выходит за пределы целевой папки и создаёт там каталог, после чего возвращается обратно. Нормализация пути, которую выполняет фильтр, не влияет на реальные системные вызовы. Именно это несоответствие и делает атаку возможной.

Фильтры извлечения в tarfile появились для защиты от известных атак на распаковку, которые могут привести к перезаписи системных файлов. Без фильтров злоумышленник мог бы указать, например, путь к системному каталогу и поместить туда вредоносный файл. Фильтры проверяют каждый элемент архива и отклоняют записи, которые выходят за пределы указанной директории. Уязвимость показывает, что такая проверка не всегда полна.

Система создаёт только пустые каталоги, содержимое извлекаемых файлов остаётся внутри целевой директории. Для успешной атаки имя записи должно содержать конечный компонент пути целевой папки, поэтому при распаковке в случайно сгенерированную изолированную директорию эксплуатация невозможна. В Windows переходы на уровень выше схлопываются до обращения к файловой системе, поэтому проблема не проявляется. Стоит отметить, что уязвимость проявляется только при извлечении архивов с использованием уязвимых фильтров. Чтение архива без распаковки, а также извлечение с отключёнными фильтрами не подвержены проблеме.

Об уязвимости сообщил исследователь Стэн Улбрых, публикация в списке рассылки security-announce появилась 19 августа 2026 года. Согласно описанию CVE, проблема затрагивает все версии CPython до 3.16.0 включительно. Разработчики выпустили исправление в версии 3.16.0. Обновление доступно на официальном сайте Python, а также через менеджеры пакетов большинства дистрибутивов. Пользователям более ранних веток стоит следить за обновлениями и проверить наличие патчей в используемых системах.

Разработчики классифицируют уязвимость как обход политики безопасности. Это означает нарушение изоляции, которую они закладывали в механизм извлечения архивов. Обычно фильтры предотвращают известные атаки типа zip-slip, когда злоумышленник указывает имя файла с переходом в родительский каталог. В данном случае фильтр проверяет разрешённый путь, но создание каталогов происходит по исходному имени, поэтому изоляция нарушается частично. Оценка CVSS 6.3 отражает несколько факторов: атака требует взаимодействия с пользователем, не приводит к раскрытию данных или выполнению кода, но может иметь ограниченное влияние на целостность системы.

Хотя уязвимость не позволяет записывать файлы за пределами директории, создание каталогов в неожиданных местах может нарушить работу приложений. Например, атакующий может заполнить диск множеством пустых каталогов или спровоцировать конфликты с файлами, которые уже существуют по этим путям. В зоне повышенного риска находятся системы, автоматически распаковывающие архивы из ненадёжных источников. Такие задачи встречаются в серверных приложениях, при обработке вложений или загрузке файлов. Создание каталогов в неожиданных местах может стать первым шагом для дальнейших атак, например, для подмены других файлов или нарушения логики приложения.

Пользователям стоит обновить CPython до актуальной версии. Если обновление невозможно, следует избегать извлечения архивов из непроверенных источников и проверять содержимое архивов до распаковки. О наличии эксплуатирующих эту уязвимость атак в дикой природе сведений нет. Тем, кто не может обновиться, стоит проверить, какие фильтры используют их приложения, и при необходимости реализовать дополнительные проверки.

Уязвимости в обработке архивов возникают регулярно, в том числе в популярных языках программирования. Корректная проверка итогового пути не гарантирует безопасность, если промежуточные операции используют другие данные, поэтому разработчикам важно следить за согласованностью проверок и реальных действий при работе с файловой системой. В то же время этот случай может послужить полезным примером при проектировании собственных механизмов проверки путей в библиотеках и фреймворках.

Ссылки

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