CVE-2026-100689 в Debian: GitPython, path из .gitmodules и статус исправления

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

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


GitPython до версии 3.1.62 не проверяет поле path из файла .gitmodules при обновлении сабмодулей. Значение может содержать компоненты обхода каталогов, из-за чего checkout создаётся за пределами рабочей области репозитория. В Debian затронут пакет python-git; в release forky и sid исправление доступно, в bookworm и trixie статус open.

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


Риск связан с тем, что при обновлении сабмодулей GitPython использует необработанное значение path из .gitmodules, поэтому приложение может создавать каталоги вне ожидаемой рабочей области репозитория. Это не требует локального доступа пользователя и не зависит от пользовательского интерфейса.

  • Тип ошибки: CWE-22, directory traversal в обработке поля path
  • 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
  • Оценка: HIGH, 8.7
  • Условие атаки: приложение обновляет сабмодули на не-HEAD commit, например через historical-commit API
  • Факт эксплуатации: в источниках нет отдельного подтверждения активной эксплуатации
  • EPSS: 0,40%, процентиль 31,79%

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


В Debian затронут исходный пакет python-git, который предоставляет GitPython.

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

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


GitPython до 3.1.62 не валидирует поле path, которое читается из файла .gitmodules при обновлении сабмодулей.

Ранее добавленная проверка Submodule._validated_name() ограничивает только поле name. Внутренний guard Submodule._to_relative_path() применяется в методах add() и move(), но не используется в Submodule.update().

В результате абсолютное место checkout вычисляется из необработанного значения path. Если .gitmodules содержит компоненты обхода каталогов, например ../../../tmp/escaped, библиотека может создать каталоги вне рабочей области репозитория, заполнить их содержимым из submodule URL при клонировании и удалить через shutil.rmtree() при использовании force_remove.

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


Атака строится на контроле файла .gitmodules или на контроле потока обновления сабмодулей.

Значение поля path передаётся в Submodule.update(), где оно используется для вычисления пути checkout без проверки containment. Если значение содержит последовательности вроде ../../.., библиотека создаёт каталоги за пределами рабочей области репозитория.

Содержимое этих каталогов формируется из submodule URL во время clone-шага. При повторном обновлении или при использовании force_remove дерево может быть удалено через shutil.rmtree().

Обычный сценарий clone-then-update не затрагивается, потому что путь пересчитывается из канонического tree lookup. Уязвимый путь активизируется, когда приложение обновляет сабмодули на конкретном не-HEAD commit.

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


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

  • Приложение использует GitPython до 3.1.62 и вызывает Submodule.update()
  • Файл .gitmodules контролируется атакующим или содержит вредоносное значение в поле path
  • Поток обновления сабмодулей работает на не-HEAD commit, например через historical-commit API
  • Рабочая область репозитория доступна для записи
  • Вектор доступа к приложению позволяет контролировать .gitmodules или параметры обновления

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


Атакующий получает возможность влиять на .gitmodules файла проекта или на запрос, который обновляет сабмодули.

В поле path записывается значение с компонентами обхода каталогов. При вызове Submodule.update() GitPython до 3.1.62 использует это значение для создания checkout-каталога вне рабочей области репозитория.

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

Если приложение предоставляет API исторических commit'ов, атакующий может выбирать конкретный не-HEAD commit и запускать уязвимый путь обновления.

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


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

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

Отсутствие сведений о PoC или эксплуатации не означает, что они отсутствуют; это означает, что доступные источники не содержат такой детали.

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


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

Ниже приведены общие точки контроля, которые можно использовать как неспецифичные признаки аномалии.

  • Создание каталогов вне рабочей области репозитория рядом с проектами Python или Git
  • Внезапное появление каталогов с именами из .gitmodules в системных или пользовательских директориях
  • Вызовы shutil.rmtree() на каталогах, созданных через обновление сабмодулей
  • Аномальные записи в журналах Python-приложений о создании файлов за пределами ожидаемого workspace
  • Изменения в файле .gitmodules с компонентами обхода каталогов в поле path

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


Для обнаружения атаки можно проверить состояние пакетов и логику обновления сабмодулей.

  • Проверить версию пакета python-git на Debian
  • Найти файлы .gitmodules с компонентами обхода каталогов в поле path
  • Проверить журналы Python-приложений на вызовы os.makedirs() и shutil.rmtree() вне рабочей области репозитория
  • Отслеживать создание каталогов за пределами проекта, если приложение обновляет сабмодули
  • Проверить, использует ли приложение API обновления сабмодулей на не-HEAD commit

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


Команды проверки версии для Debian:

Bash:
cat /etc/debian_version

Bash:
cat /etc/os-release

Bash:
apt-cache policy <имя-пакета>

Bash:
dpkg-query -W -f='${Package} ${Version}\n' <имя-пакета>

Замените <имя-пакета> на python-git для проверки версии пакета в Debian.

Пример:

Bash:
apt-cache policy python-git

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

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


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

В Debian:

  • forky: обновите пакет python-git до версии 3.1.62-1
  • sid: обновите пакет python-git до версии 3.1.62-1 или 3.1.62-2 в зависимости от репозитория
  • bookworm: статус open, исправления нет; используйте временные меры
  • trixie: статус open, исправления нет; используйте временные меры

Обновление выполняется через стандартный пакетный менеджер Debian:

Bash:
apt update

Bash:
apt upgrade python-git

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

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


Пока исправление недоступно в bookworm и trixie, можно снизить риск.

  • Ограничить доступ к файлам .gitmodules только для доверенных источников
  • Не обновлять сабмодули на не-HEAD commit, если это возможно
  • Проверять поле path в .gitmodules перед вызовом Submodule.update()
  • Ограничить права приложения на запись каталогов вне рабочей области репозитория
  • Использовать контейнер или sandbox для Python-приложений, которые обновляют сабмодули
  • Отключить обновление сабмодулей в приложениях, где это не требуется

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


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

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

Ожидаемый результат: версия 3.1.62-1 или выше в forky и sid.

Для bookworm и trixie проверьте статус через Debian Security Tracker:

Debian Security Tracker — CVE-2026-100689

Если статус остаётся open, используйте временные меры и отслеживайте обновления репозитория.

Вывод​


CVE-2026-100689 — уязвимость в GitPython до 3.1.62, связанная с отсутствием проверки поля path из .gitmodules при обновлении сабмодулей.

В Debian затронут пакет python-git. В forky и sid исправление доступно, в bookworm и trixie статус open.

Для защиты нужно обновить пакет до 3.1.62 или выше, ограничить доступ к .gitmodules и не обновлять сабмодули на не-HEAD commit, если это возможно.

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


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

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


  • 28.09.2026 — Опубликована первая версия материала.
 
Назад
Верх Низ