Найти в Дзене
Цифровая Переплавка

🚨 Опасный символ: как обычный возврат каретки взломал Git и дал хакерам RCE-доступ

На первый взгляд трудно представить, как простой символ возврата каретки (\r) из эпохи механических печатных машинок мог создать серьёзную угрозу для современных систем. Однако недавно выявленная уязвимость в Git (CVE-2025-48384) доказала, что даже незначительная ошибка логики обработки текста может привести к катастрофическим последствиям, включая удалённое выполнение кода. Недавно исследователь безопасности Дэвид Лидбитер обнаружил, что популярная система контроля версий Git некорректно обрабатывает символ возврата каретки в файле .gitmodules. Проблема проявляется на Unix-подобных системах (Linux, macOS), в то время как Windows, благодаря своим ограничениям на символы в именах файлов, оказалась невосприимчивой к атаке. Проблема возникает, когда в конфигурационном файле .gitmodules (отвечающем за работу с подмодулями репозитория) прописывается путь подмодуля, заканчивающийся на символ возврата каретки (\r). Git при проверке пути использует оригинальную строку, но во время записи в кон
Оглавление
Иллюстрация демонстрирует скрытую угрозу: при рекурсивном git clone вредоносный репозиторий «ломает» цепочку безопасности и вызывает тревожный сигнал.
Иллюстрация демонстрирует скрытую угрозу: при рекурсивном git clone вредоносный репозиторий «ломает» цепочку безопасности и вызывает тревожный сигнал.

На первый взгляд трудно представить, как простой символ возврата каретки (\r) из эпохи механических печатных машинок мог создать серьёзную угрозу для современных систем. Однако недавно выявленная уязвимость в Git (CVE-2025-48384) доказала, что даже незначительная ошибка логики обработки текста может привести к катастрофическим последствиям, включая удалённое выполнение кода.

🧑‍💻 Что именно произошло?

Недавно исследователь безопасности Дэвид Лидбитер обнаружил, что популярная система контроля версий Git некорректно обрабатывает символ возврата каретки в файле .gitmodules. Проблема проявляется на Unix-подобных системах (Linux, macOS), в то время как Windows, благодаря своим ограничениям на символы в именах файлов, оказалась невосприимчивой к атаке.

Проблема возникает, когда в конфигурационном файле .gitmodules (отвечающем за работу с подмодулями репозитория) прописывается путь подмодуля, заканчивающийся на символ возврата каретки (\r). Git при проверке пути использует оригинальную строку, но во время записи в конфигурацию удаляет этот символ. Это приводит к тому, что проверка и реальная запись пути отличаются, позволяя злоумышленникам обходить внутренние проверки Git.

🔗 Механизм атаки шаг за шагом:

Вот как выглядит упрощённая цепочка уязвимости:

  • 📝 Вредоносный репозиторий содержит файл .gitmodules с поддельным путём, например:
    [submodule "exploit"]
    path = "malicious_folder\r"
  • 🔍 Git считывает этот путь с символом возврата каретки и проводит проверку безопасности.
  • 🖋️ После успешной проверки Git записывает уже изменённый путь (без символа возврата каретки) в конфигурацию, например:
    [core]
    workdir = ../../../malicious_folder
  • ⚠️ Это расхождение между проверенным и реальным путём позволяет записать файлы подмодуля в произвольное место на диске (например, в папку .git/hooks), что позволяет злоумышленникам разместить вредоносный скрипт.
  • 🚨 Итог — при активации таких скриптов (например, хуков) атакующие получают возможность удалённого выполнения произвольного кода на вашем компьютере.

🎯 Почему это особенно опасно?

Главная опасность в том, что уязвимость затрагивает стандартный способ клонирования репозиториев с подмодулями (git clone --recursive). Особенно высок риск при использовании популярных клиентов, таких как GitHub Desktop, которые используют рекурсивное клонирование по умолчанию.

Кроме того, данная уязвимость позволяет не только записывать произвольные файлы, но и перезаписывать критически важные конфигурации Git, что может привести к гораздо более серьёзным последствиям, включая компрометацию всей рабочей станции разработчика.

🛠️ Почему возникла ошибка?

Корень проблемы оказался в обработке конфигурационных файлов формата .ini. Git пытается быть совместимым с DOS-подобными системами и автоматически удаляет символ возврата каретки перед записью значений в конфигурационный файл. Однако при считывании Git снова воспринимает символы по-другому, создавая логическую несогласованность и, как следствие, обход защитных проверок.

Эта проблема показывает, насколько опасны могут быть даже минимальные логические ошибки в интерпретации текста и как тщательно нужно подходить к обработке пользовательского ввода, особенно в системах контроля версий.

🔒 Как защищаться?

Существует несколько простых шагов для защиты до момента обновления Git:

  • 🧩 Обновитесь до исправленной версии Git и всех связанных программ, таких как GitHub Desktop, GitKraken и другие, встроенные среды разработки.
  • 🚧 Избегайте клонирования непроверенных репозиториев с параметром --recursive. Лучше сперва проверить содержимое файла .gitmodules.
  • 📂 Используйте дополнительные инструменты для мониторинга и проверки подозрительных конфигураций репозиториев.

Исправление оказалось простым, но важным:

for (i = 0; value[i]; i++)
- if (value[i] == ';' || value[i] == '#')
+ if (value[i] == ';' || value[i] == '#' || value[i] == '\r')
quote = "\"";

Теперь Git принудительно оборачивает строки с символом возврата каретки в кавычки, что предотвращает некорректную интерпретацию.

🌐 Что эта уязвимость говорит о современном софте?

Данная ошибка, несмотря на кажущуюся простоту, подчёркивает общую уязвимость современных программных систем. Важно понимать, что подобные ошибки не ограничиваются языком C, в котором написан Git. Это фундаментальная логическая ошибка обработки данных, которая может проявиться в любом языке программирования и любом проекте.

Параллели можно провести с известными проблемами инъекций CRLF в веб-приложениях и почтовых протоколах. Раньше считалось нормой быть «либеральным» в принятии данных (принцип Постела), однако в современных условиях информационной безопасности такой подход уже нельзя считать разумным. Сегодня любое отклонение от строгих правил обработки ввода может привести к серьёзной уязвимости.

📌 Личное мнение автора

Мне кажется особенно важным, что именно такие ошибки — не сложные переполнения буфера, а простые логические нестыковки — становятся причиной критических уязвимостей. Это подчёркивает необходимость не только тестировать безопасность на уровне кода, но и на уровне логики взаимодействия компонентов.

Также примечательно, что данная уязвимость была найдена в рамках целенаправленного аудита Git компанией G-Research Open Source. Подобные аудиты должны стать нормой для всех критически важных программных продуктов.

В конце концов, даже символ возврата каретки, родившийся более века назад, сегодня может иметь решающее значение для кибербезопасности.

📚 Подробнее про уязвимость:
🔗
Статья исследователя (dgl.cx)
🔗
CVE-2025-48384 на GitHub