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