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 и контролировать права процесса на файловые операции.
Официальные источники
История обновлений статьи
- 28.09.2026 — Опубликована первая версия материала.
- 30.09.2026 — Уточнены сведения об уязвимых версиях, оценке риска или исправлении.
- 01.10.2026 — Уточнены сведения об уязвимых версиях, оценке риска или исправлении.
Последнее редактирование:
