Новости · Безопасность

Python 3.12.14 закрыл три обхода tarfile-фильтра и path traversal в ZIP на Windows

12 августа 2026 года разработчик Томас Воутерс опубликовал security-релизы Python трёх активных веток: 3.12.14, 3.11.16 и 3.10.21. Все три версии перешли в режим только-для-безопасности и выходят без расписания — только когда накапливается критический объём патчей. Этот пакет — один из крупнейших за год: закрыто более двадцати уязвимостей, в том числе три обхода фильтра безопасности tarfile, path traversal в ZIP-архивах на Windows и серия DoS-атак через XML, CSV и HTML.

Коротко: Python 3.12.14, 3.11.16 и 3.10.21 — обязательное обновление для тех, кто распаковывает архивы из внешних источников. tarfile получил три патча против симлинков вне директории назначения, shutil.unpack_archive() теперь пропускает пути с Windows-префиксом диска в ZIP-архивах. XML и CSV закрыли квадратичные DoS-векторы.

21 августа 2026 Редакция LoadFile Чтение 6 мин
Цифровой щит безопасности с иконками файлов — патч Python tarfile и ZIP
Содержание
  1. Что произошло
  2. Три обхода фильтра в tarfile
  3. ZIP на Windows: обход через диск-префикс
  4. DoS в XML, CSV и HTML
  5. Проблемы с памятью: bz2, lzma, zlib
  6. Кого это касается и что делать
  7. Источники

Что произошло

12 августа 2026 года на официальном блоге Python появилась запись с характерным заголовком — «Python Releases Eclipse Your Security»: релиз совпал с полным солнечным затмением, видимым над Европой. Шутка в стороне, обновление закрывает реальные проблемы безопасности, которые касаются работы с архивами и структурированными данными.

Вышли три версии:

  • Python 3.12.14 — самая свежая ветка, максимальное количество патчей;
  • Python 3.11.16 — предыдущая ветка, находится в режиме security-only;
  • Python 3.10.21 — старая ветка, также security-only, поддерживается до октября 2026.

Все три — исходники без исполняемых файлов (source-only releases). Бинарные сборки появятся у сторонних дистрибуторов (python.org, пакетные менеджеры ОС) в ближайшие дни. Если вы используете Python через дистрибутив Linux или Homebrew — следите за обновлением пакета в своём репозитории.

Три обхода фильтра в tarfile

Главная тема патча — модуль tarfile. В Python 3.12 он получил механизм «фильтров»: при распаковке можно задать политику data, tar или fully_trusted, которая ограничивает потенциально опасные пути и символические ссылки (symlinks). Фильтр data — наиболее строгий, именно его рекомендуют для распаковки ненадёжных архивов.

Проблема в том, что в этом фильтре обнаружили три независимых обхода, позволяющих создать symlink, указывающий за пределы директории назначения:

  1. gh-149486: при распаковке symlink-элемента с помощью tarfile.TarFile.extract() фильтр не применялся к цели символической ссылки — только к самой ссылке. Злоумышленник мог создать архив, где symlink ведёт в произвольное место файловой системы.
  2. gh-151558: при разрешении symlink-директории не обрезались завершающие разделители пути (/). Это позволяло обойти проверку «находится ли путь внутри назначения», добавив лишний слэш.
  3. gh-151987: третий вектор — комбинация особенностей разрешения вложенных symlink-цепочек, где при определённых условиях итоговый путь выходил за пределы дерева распаковки.
!
Кого затрагивает

Уязвимость опасна для сервисов, которые принимают .tar или .tar.gz файлы от пользователей: платформы загрузки данных, CI/CD-системы, пакетные менеджеры. Если распаковываете только собственные доверенные архивы — риск минимален, но обновиться всё равно рекомендуется. Как устроен формат архива, который здесь разбирается — в гайде чем открыть TAR.GZ.

ZIP на Windows: обход через диск-префикс

Второй важный блок — функция shutil.unpack_archive() при работе с ZIP-архивами на Windows. Проблема связана с особенностью Windows-путей: они могут начинаться с буквы диска, например C:\ или D:\.

ZIP-архив, в котором путь файла начинается с подобного префикса (C:\secret\passwd), при распаковке на Windows мог записать файл вне директории назначения — прямо в указанный путь на любом диске. Это классический path traversal, аналогичный тому, что много лет закрывают в Java, Go и других языках.

В версиях 3.12.14/3.11.16/3.10.21 такие пути теперь молча пропускаются при распаковке: файл с Windows-абсолютным путём просто игнорируется. Поведение изменилось без предупреждения, что важно учитывать при тестировании кода, который обрабатывает архивы в автоматическом режиме.

DoS в XML, CSV и HTML

Значительная часть патча закрывает векторы отказа в обслуживании через сложность разбора — когда специально составленный файл заставляет парсер тратить экспоненциально много времени или памяти.

csv.Sniffer.sniff() — встроенный определитель диалекта CSV — содержал квадратичную и экспоненциальную сложность при разборе строк с большим количеством кавычек. Злоумышленник, отправив файл с заголовком, перегруженным кавычками, мог надолго «подвесить» сервис. Теперь алгоритм определения диалекта ограничивает перебор.

xml.parsers.expat получил два отдельных исправления:

  • В обработчике ElementDeclHandler() была неограниченная рекурсия в C-коде, вызывавшая падение при разборе специально созданного XML-документа с глубокой вложенностью деклараций элементов.
  • Защита от «billion laughs» (атака через многократное разворачивание XML-сущностей) получила новые методы настройки: теперь можно программно задать порог активации и максимальный коэффициент усиления. Одновременно с этим обновлена встроенная библиотека libexpat до версии 2.8.3, которая содержит собственные улучшения защиты от hash flooding.

html.parser закрыл медленный разбор длинных незавершённых конструкций (например, незакрытые теги с гигантским атрибутом). Аналогичные квадратичные сложности устранены в configparser (пробельные символы), xml.etree.ElementTree (XPath-предикаты с большим числом дочерних элементов) и tomllib (чрезмерно длинные составные ключи).

i
Для тех, кто обрабатывает файлы из интернета

DoS-векторы в парсерах особенно опасны в веб-сервисах — там одного запроса с «ядовитым» CSV или XML достаточно, чтобы загрузить процессор на минуты. О принципах безопасной работы с файлами из ненадёжных источников — в разделе безопасность файлов Loadfile.

Проблемы с памятью: bz2, lzma, zlib

Три стандартных модуля сжатия получили патчи против ошибок работы с памятью при прерывании декомпрессии.

В модулях bz2, lzma и внутреннем zlib-декомпрессоре существовал сценарий «висящего указателя» (dangling pointer): если во время декомпрессии возникала ошибка нехватки памяти (MemoryError), внутренний буфер освобождался, но указатель на него сохранялся. Повторный вызов decompress() обращался к уже освобождённой памяти — это неопределённое поведение, которое может привести к краху или, в теории, к чтению посторонних данных.

Отдельная проблема была в bz2.BZ2Decompressor: повторное использование объекта после ошибки libbz2 могло вызвать переполнение стека. Теперь объект переходит в неиспользуемое состояние после такого сбоя.

Для пользователей на ARM-процессорах с pointer authentication (современные чипы Apple Silicon, Cortex-A76+) Python 3.12.14 и 3.11.16 добавляют инструкции защиты ветвлений для JIT-кода профилировщика -X perf_jit.

Кого это касается и что делать

Патч актуален прежде всего для разработчиков и DevOps-команд, которые:

  • принимают и распаковывают .tar, .tar.gz или .zip файлы от пользователей;
  • разбирают XML, CSV или HTML из внешних источников без жёстких ограничений размера;
  • используют bz2/lzma/zlib в цикле с обработкой исключений;
  • работают в окружениях CI/CD, где артефакты сборки могут прийти из ненадёжного репозитория.

Для рядовых пользователей, запускающих скрипты на личном компьютере с доверенными файлами, непосредственной угрозы нет — но обновление всё равно рекомендуется, так как многие системные утилиты используют Python внутри.

  1. Проверьте установленную версию: python3 --version.
  2. Установите актуальную версию своей ветки: 3.12.14, 3.11.16 или 3.10.21 — через официальный установщик python.org, apt/dnf, Homebrew или pyenv.
  3. Если используете Docker — пересоберите образы на базе обновлённого официального Python-образа из Docker Hub.
  4. Проверьте зависимости: при обновлении runtime убедитесь, что lock-файлы (pip, pipenv, poetry) не тянут старую версию транзитивно.

Смежные темы на Loadfile: ранее мы разбирали похожую уязвимость в node-tar (CVE-2026-59873) — там тоже речь шла о распаковке tar-архивов без ограничений. Принцип один: разбор чужих файловых архивов требует явных лимитов на объём и структуру.

Источники

  • Официальный анонс релиза Python 3.12.14, 3.11.16 и 3.10.21 — blog.python.org
  • Страница загрузки Python 3.12.14 — python.org/downloads
  • Технический разбор patчей: tarfile, ZIP, XML, DoS — linuxcompatible.org

Данные приведены на 21 августа 2026 по материалам официального блога Python и первичных источников. Номера версий и описания уязвимостей соответствуют официальным release notes.

Читайте также