Обзор CVE-2025-48384
CVE-2025-48384 — это критическая уязвимость в Git, широко используемой распределенной системе контроля версий. Она связана с некорректной обработкой символов возврата каретки (CR) в значениях конфигурации, что может привести к проблемам обхода пути при проверке подмодулей. Эта ошибка позволяет потенциально произвольное выполнение кода при определенных условиях. Уязвимость была публично раскрыта 8 июля 2025 года и последний раз изменена 26 августа 2025 года. Она была добавлена в каталог известных эксплуатируемых уязвимостей (KEV) Агентства по кибербезопасности и защите инфраструктуры США (CISA) 25 августа 2025 года, что указывает на активную эксплуатацию в дикой природе, с крайним сроком исправления 15 сентября 2025 года.
Описание уязвимости
Проблема возникает из-за того, как Git обрабатывает значения конфигурации:
- При чтении значения конфигурации Git удаляет все завершающие символы возврата каретки и перевода строки (CRLF).
- Однако при записи записи конфигурации значения, содержащие завершающий CR, не заключаются в кавычки должным образом, что приводит к потере CR при последующих чтениях.
Это несоответствие может привести к тому, что подмодуль будет извлечен в неправильное место, если его путь содержит завершающий CR. Если злоумышленник настроит символическую ссылку, указывающую на измененный путь к каталогу хуков подмодуля, и подмодуль содержит исполняемый хук после проверки (post-checkout), сценарий хука может быть выполнен непреднамеренно после извлечения, что приведет к произвольному выполнению кода.
Технические детали
Уязвимость использует конфликт интерпретации в синтаксическом анализе конфигурации Git:
- Несоответствие обработки конфигурации: Завершающие CR удаляются при чтении, но не сохраняются при записи без кавычек.
- Изменение пути извлечения подмодуля: Путь подмодуля, такой как "submodule/path", может быть интерпретирован как "submodule/path" после потери CR.
- Эксплуатация символических ссылок: Злоумышленник может создать символическую ссылку с измененного пути на каталог хуков (например,
.git/hooks/post-checkout), что позволит выполнять вредоносные хуки во время таких операций, как git submodule update или git clone --recurse-submodules.
Это классифицируется как:
- CWE-436: Конфликт интерпретации (несоответствие в обработке данных).
- CWE-59: Некорректное разрешение ссылок перед доступом к файлу («Переход по ссылке»), из-за злоупотребления символическими ссылками.
Вектор атаки — сетевой (AV:N), с высокой сложностью (AC:H), низкими требуемыми привилегиями (PR:L), требуется взаимодействие с пользователем (UI:R), измененный объем (S:C), с высоким влиянием на конфиденциальность, целостность и доступность (C:H/I:H/A:H).
Затронутые версии
Уязвимость затрагивает версии Git до следующих исправленных выпусков:
- Все версии до v2.43.7
- v2.44.0 – v2.44.3
- v2.45.0 – v2.45.3
- v2.46.0 – v2.46.3
- v2.47.0 – v2.47.2
- v2.48.0 – v2.48.1
- v2.49.0
- v2.50.0
Она затрагивает Git на различных платформах, включая Linux, macOS и Windows, но особенно актуальна в средах разработчиков, конвейерах CI/CD (например, GitHub Actions, GitLab CI) и везде, где подмодули Git клонируются из ненадежных репозиториев.
Воздействие и сценарии эксплуатации
- Воздействие: Высокий риск удаленного выполнения кода (RCE), эксфильтрации данных или компрометации системы. В рабочих процессах разработчиков это может привести к атакам на цепочку поставок, если клонируются вредоносные репозитории.
- Требования к эксплуатации:
- Специально созданный путь подмодуля с завершающим CR.
- Символическая ссылка, перенаправляющая в каталог хуков.
- Исполняемый хук (например, post-checkout) в подмодуле.
- Взаимодействие с пользователем, например, клонирование репозитория с
--recurse-submodules.
- Реальная эксплуатация: Поскольку уязвимость находится в каталоге KEV CISA, федеральные агентства и критическая инфраструктура должны устранить ее до 15 сентября 2025 года. Вероятно, она используется в целевых атаках на разработчиков или проекты с открытым исходным кодом. В уведомлении не упоминается общедоступное доказательство концепции (PoC), но высокая сложность предполагает необходимость специальной настройки.
Детали CVSS в NVD еще не полностью оценены (ожидается CVSS 4.0), но на основе метрик CVSS 3.1 из уведомления это соответствует критической серьезности (предположительно CVSS 8.8, как отмечалось ранее в более широких списках CVE).
Меры по смягчению и рекомендации
- Исправленные версии: Обновите Git до одной из следующих или более поздних:
- v2.43.7
- v2.44.4
- v2.45.4
- v2.46.4
- v2.47.3
- v2.48.2
- v2.49.1
- v2.50.1
- Обходные пути:
- Избегайте рекурсивного клонирования подмодулей (
--recurse-submodules) из ненадежных репозиториев.
- Отключите или ограничьте использование символических ссылок в конфигурациях Git, если это возможно.
- Используйте Git в средах с ограниченными правами (например, в контейнеризованных установках).
- Дополнительные рекомендации: Для организаций, подпадающих под директивы CISA, примените исправления в соответствии с инструкциями поставщика или прекратите использование, если исправление невозможно. Регулярно сканируйте репозитории на предмет подозрительных подмодулей и отслеживайте неожиданное выполнение хуков.
Авторы и ссылки
- Авторы: В уведомлении указан ttaylorr за сообщение и публикацию подробностей.
- Основные ссылки:
Эта уязвимость подчеркивает важность безопасной обработки в системах контроля версий, особенно с подмодулями. Если вы используете Git в производственной среде или среде разработки, немедленно выполните обновление, учитывая статус активной эксплуатации.
Быстрое PoC
- Предварительные требования: установлен Docker; этот репозиторий клонирован локально. Сеть не требуется во время PoC.
- Уязвимый Git: используется Git 2.40.4 (проверенное поведение с путаницей путей).
- URL подмодуля: файл
.gitmodules указывает на https://github.com/s41r4j/CVE-2025-48384-submodule.git, но PoC перезаписывает его на локальную копию для офлайн-тестирования.
Запустите:
bash scripts/poc.sh
Что он делает:
- Создает образ контейнера с Git 2.40.4.
- Создает флаг в
$HOME/flag.txt внутри контейнера.
- Копирует
malicious-submodule-repo/ в /tmp в контейнере.
- Рекурсивно клонирует этот репозиторий с перезаписью URL на эту локальную копию подмодуля.
- Принудительно выполняет извлечение, чтобы запустить хук
post-checkout, если путаница путей срабатывает.
- Выводит
/tmp/flag.txt, созданный хуком.
Примечания:
- Путь вредоносного подмодуля — это буквальное
sub^M (CR), сохраненное как gitlink; очищенный путь sub разрешается через символическую ссылку в .git/hooks, поэтому отслеживаемый post-checkout подмодуля попадает как реальный хук и выполняется.
- Чтобы перенаправить gitlink на последний коммит вашего удаленного подмодуля после отправки его на GitHub, выполните:
bash scripts/update-gitlink.sh.