CVE-2026-100689 в Debian: GitPython, .gitmodules и directory traversal

CVE: CVE-2026-100689
Продукт: Debian
Дата публикации: 26.09.2026
Критичность: HIGH
CVSS: 8.7 (4.0)
EPSS: 0,40%; процентиль 31,82%
CISA KEV: нет подтверждения в каталоге CISA KEV

Краткое описание​


GitPython до версии 3.1.62 не проверяет поле path из файла .gitmodules при обновлении сабмодулей. В Debian затронут пакет python-git: trixie 3.1.44-1 и bookworm 3.1.30-1+deb12u2 остаются без исправления, а forky и sid уже содержат фикс в сборках 3.1.62-1 и 3.1.62-2.

Основные характеристики​


Уязвимость возникает из-за того, что Submodule.update() использует значение path из .gitmodules без ограничения по глубине каталогов. При обновлении сабмодулей это приводит к созданию и удалению директорий вне рабочей области репозитория.

  • Тип ошибки: CWE-22 — directory traversal
  • CVSS 4.0: CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X, оценка 8.7 (HIGH)
  • Условие атаки: приложение обновляет сабмодули по не-HEAD коммитам, например через historical-commit API
  • Факт эксплуатации: в источниках нет подтверждения реальных атак или массового использования
  • EPSS: 0,40% (процентиль 31,82%)

Какие продукты и версии затронуты​


В Debian затронут пакет python-git.

  • trixie: версия 3.1.44-1, статус open, исправления нет
  • bookworm: версия 3.1.30-1+deb12u2, статус open, исправления нет
  • forky: версия 3.1.62-1, статус resolved, исправление выпущено
  • sid: версия 3.1.62-2, статус resolved, исправление выпущено

Причина уязвимости​


GitPython до 3.1.62 читает поле path из файла .gitmodules и передаёт его в Submodule.update(). Этот метод вычисляет абсолютный путь checkout без применения containment guard Submodule._to_relative_path(), который используется в add() и move().

Ранее выпущенное исправление GHSA-hmq2-w58f-27jc ограничивало поле name через Submodule._validated_name(), но не касалось path. В результате значение path может содержать компоненты directory traversal, например ../../../tmp/escaped.

При обновлении сабмодулей GitPython вызывает os.makedirs() для создания каталогов по этому пути, клонирует содержимое из submodule URL и при force_remove использует shutil.rmtree(). Все операции выполняются с тем абсолютным путём, который получен без проверки.

Как работает атака​


Атакующий контролирует файл .gitmodules или репозиторий, из которого обновляются сабмодули. В записи submodule задаётся path со значениями directory traversal.

При вызове Submodule.update() GitPython не нормализует и не ограничивает этот путь. Метод вызывает os.makedirs(), создавая каталоги в произвольном месте файловой системы. Далее содержимое из submodule URL копируется в созданный каталог.

Если приложение использует force_remove, shutil.rmtree() удаляет созданные каталоги вместе с содержимым. Удаление может затронуть данные вне рабочей области репозитория.

Путь до уязвимого компонента: .gitmodules → поле path → Submodule.update() → os.makedirs() / shutil.rmtree(). Проверка пути отсутствует именно в update(), а не в add() или move().

Условия успешной эксплуатации​


Для успешной эксплуатации нужны следующие условия:

  • установлен пакет python-git с версией GitPython ниже 3.1.62
  • приложение использует GitPython для обновления сабмодулей
  • обновление выполняется по не-HEAD коммитам, например через historical-commit API
  • атакующий может контролировать .gitmodules или URL submodule
  • у процесса есть права на создание и удаление каталогов в целевых директориях

Возможный сценарий атаки​


Сценарий строится вокруг приложения, которое обновляет сабмодули по историческим коммитам.

Атакующий создаёт запись в .gitmodules с path = ../../../tmp/escaped. При вызове Submodule.update() GitPython вызывает os.makedirs(), создавая каталог tmp/escaped вне рабочей области репозитория. Содержимое из submodule URL копируется в этот каталог.

Если приложение использует force_remove, shutil.rmtree() удаляет созданный каталог и всё его содержимое. Обычный сценарий clone-then-update не затрагивает уязвимость, потому что путь пересчитывается из канонического дерева репозитория.

Есть ли публичный эксплойт​


В предоставленных источниках нет отдельного PoC, эксплойта или подтверждённой эксплуатации.

Техническое описание позволяет понять механизм: контроль path в .gitmodules приводит к созданию и удалению каталогов вне рабочей области. Отсутствие сведений о публичном эксплойте не означает, что он невозможен; оно отражает только состояние данных на момент сбора.

Признаки эксплуатации​


Специфичных IOC для CVE-2026-100689 в источниках нет.

Доступны только общие точки контроля:

  • создание каталогов с компонентами directory traversal вне рабочей области репозитория
  • вызов shutil.rmtree() на путях, полученных из .gitmodules
  • изменения файловой системы рядом с рабочими каталогами git-репозиториев
  • аномальные записи в журналах Python-приложений, использующих GitPython

Как обнаружить атаку​


Для обнаружения атаки можно использовать следующие методы:

  • мониторинг создания и удаления каталогов вне рабочей области репозитория
  • анализ логов приложений на вызовы os.makedirs() и shutil.rmtree()
  • проверка содержимого .gitmodules на компоненты directory traversal в поле path
  • аудит версий python-git через dpkg-query или apt-cache policy

Как проверить свою версию​


Проверка версии пакета python-git в Debian:

Bash:
cat /etc/debian_version

Bash:
cat /etc/os-release

Bash:
apt-cache policy python-git

Bash:
dpkg-query -W -f='${Package} ${Version}\n' python-git

Если версия ниже 3.1.62, система уязвима.

Для bookworm актуальная версия 3.1.30-1+deb12u2, для trixie — 3.1.44-1. Для forky и sid исправленные версии уже доступны: 3.1.62-1 и 3.1.62-2 соответственно.

Исправление​


Исправление CVE-2026-100689 доступно в GitPython 3.1.62.

Для Debian:

  • forky: обновите python-git до 3.1.62-1
  • sid: обновите python-git до 3.1.62-2
  • bookworm: исправление ещё не выпущено, статус open
  • trixie: исправление ещё не выпущено, статус open

Команда обновления:

Bash:
apt-get update
apt-get upgrade python-git

После обновления проверьте версию через dpkg-query или apt-cache policy.

Временные меры защиты​


Пока нет подтверждённых временных мер от вендора.

Можно применить следующие защитные действия:

  • ограничить доступ к .gitmodules только для доверенных источников
  • проверить, что приложение не обновляет сабмодули по не-HEAD коммитам
  • контролировать права процесса на создание и удаление каталогов вне рабочей области
  • использовать read-only mount для рабочих каталогов репозиториев, если это позволяет архитектуре приложения

Как проверить устранение уязвимости​


После обновления проверьте версию пакета:

Bash:
dpkg-query -W -f='${Package} ${Version}\n' python-git

Версия должна быть 3.1.62-1 или выше.

Также можно проверить статус в Debian Security Tracker: CVE-2026-100689. Если статус для вашей версии стал resolved, исправление установлено.

Для bookworm и trixie статус остаётся open, поэтому обновление не возможно через apt до выпуска официальной сборки.

Вывод​


CVE-2026-100689 затрагивает python-git в Debian. Уязвимость связана с отсутствием проверки path в .gitmodules при обновлении сабмодулей. Исправление доступно для forky и sid, но не выпущено для bookworm и trixie.

Обновление нельзя откладывать, если приложение использует GitPython для обновления сабмодулей по не-HEAD коммитам. До выпуска исправления для bookworm и trixie рекомендуется ограничить доступ к .gitmodules и контролировать права процесса на файловые операции.

Официальные источники​


  1. NVD — CVE-2026-100689
  2. Debian Security Tracker — CVE-2026-100689
  3. FIRST EPSS — CVE-2026-100689

История обновлений статьи​


  • 28.09.2026 — Опубликована первая версия материала.
  • 30.09.2026 — Уточнены сведения об уязвимых версиях, оценке риска или исправлении.
  • 01.10.2026 — Уточнены сведения об уязвимых версиях, оценке риска или исправлении.
 
Последнее редактирование:
Назад
Верх Низ