Git закрыл CVE-2026-111760: рекурсивный клон мог выполнить код из подмодуля
В Git 2.56.1 и поддерживаемых ветках исправлена ошибка обработки индекса: слишком длинный путь обходил проверку и позволял подменить файл .git в подмодуле симлинком на каталог с чужими хуками.
Что случилось
Проект Git выпустил исправление уязвимости CVE-2026-111760: вредоносный репозиторий мог выполнить код на машине, которая клонирует его рекурсивно вместе с подмодулями. Исправление вошло в Git 2.56.1 и в поддерживаемые ветки — 2.50.2, 2.51.3, 2.52.1, 2.53.1, 2.54.1 и 2.55.1.
Детали
Причина — целочисленное усечение при работе с индексом. Слишком длинный путь в репозитории проходил проверку безопасности, но при записи на диск Git сохранял его под укороченным именем, которое атакующий мог задать как .git. В результате в свежесклонированном подмодуле, где .git — это обычный файл, а не каталог, появлялась возможность подменить его символической ссылкой на каталог с чужими хуками и конфигурацией. Хуки — это программы, которые Git запускает в определённые моменты, так что дальше код атакующего выполняется сам.
Git отказывается заменять каталог .git симлинком, и именно поэтому атака строится на подмодуле: там .git — файл, а не каталог. Исправленные версии отвергают чрезмерно длинные пути до того, как длина будет усечена.
- GitHub уже применил исправления на github.com и в GitHub Enterprise Cloud;
- для GitHub Enterprise Server исправления в версиях 3.19.15, 3.20.11, 3.21.9 и 3.22.4;
- Git for Windows на момент публикации ещё не выпустил сборку на основе 2.56.1;
- GitHub Desktop и приложение GitHub Copilot ждут обновления.
В том же выпуске закрыто ещё несколько дыр. CVE-2026-113408: при клоне пустого репозитория по протоколу v2 сервер может прислать имя ветки с обходом каталогов, и последующее обновление ветки запишет данные вне каталога ссылок. CVE-2026-114467: слияние тега с более чем двумя подписями GPG портит стек и приводит к отказу в обслуживании. CVE-2026-114469: бинарный патч, разворачивающийся больше гигабайта, обходит ограничение размера и роняет Git чтением за границей буфера. CVE-2026-114466: три возможности fast-import — rewrite-submodules-from, rewrite-submodules-to и export-pack-edges — позволяли читать произвольные файлы и создавать их; теперь они отклоняются без флага --allow-unsafe-features.
Отдельно стоит CVE-2026-105437, которую назначил GitLab. Большое слияние с множеством конфликтов и большим значением атрибута conflict-marker-size вызывает переполнение кучи. Атрибут задаётся в .gitattributes, который лежит в самом репозитории, поэтому достаточно права пушить ветки и открывать запрос на слияние. Серверы хостинга кода вызывают git merge-tree, чтобы проверить, сливается ли запрос, — и становятся уязвимыми.
Что это значит
Обновлять нужно не только сам Git на рабочих машинах, но и всё, что несёт его внутри: серверы GitLab, Gitea и Forgejo, CI-раннеры, сборщики, devcontainer-образы. Именно хостинги кода интересны атакующим в первую очередь: там чужие репозитории обрабатываются постоянно и автоматически.
Временная мера для серверов, которые пока не обновились, — добавить conflict-marker-size=7 в файл info/attributes каждого репозитория либо отключить проверки слияния для недоверенных репозиториев. Это не заменяет патч, но снимает самый простой вектор. И общее правило, которое стоит перенести в регламент: не запускать git clone --recursive по ссылкам из непроверенных источников на машинах с доступом к инфраструктуре.
Комментарии 0
Комментариев пока нет — будьте первым.
Оставить комментарий
Имя и текст — этого достаточно. Комментарий появится сразу; подозрительные сообщения уходят на проверку.