Инженер по безопасности обнаружил ряд критических уязвимостей в инструментах Git, которые подвергли миллионы разработчиков опасности кражи учетных данных.
RyotaK, инженер по безопасности из GMO Flatt Security Inc., занимался поиском ошибок в рамках программы GitHub Bug Bounty в октябре 2024 года, когда обнаружил слабые места в GitHub Desktop, Git Credential Manager, Git LFS, GitHub CLI и GitHub Codespaces - все они были связаны с неправильной проверкой ввода и обработкой текстовых протоколов.
Протокол Git Credential Protocol и его уязвимости
Эти уязвимости связаны с протоколом Git Credential Protocol, который обменивается учетными данными пользователей, используя формат ключ-значение с разделителями новой строки (
).
Хотя в Git обычно запрещены новые строки и NULL-байты, чтобы избежать инъекционных атак, неправильная обработка других символов окончания строки, таких как возврат каретки (
), создает лазейки в безопасности.
Уязвимости:
- GitHub Desktop (CVE-2025-23040) Умело созданный URL вредоносного подмодуля, содержащий %0d (шестнадцатеричный возврат каретки), мог обойти логику разбора GitHub Desktop и обманом раскрыть учетные данные пользователя github.com на домены, контролируемые злоумышленниками.
- Git Credential Manager (CVE-2024-50338) Аналогичные недостатки разбора в .NET StreamReader позволяли символам возврата каретки проносить данные через строки, подвергая пользователей потенциальной краже учетных данных.
- Git LFS (CVE-2024-53263) Уязвимости введения новой строки позволяли вредоносным репозиториям изменять конфигурационные файлы и обходить средства защиты Git, передавая конфиденциальные данные злоумышленникам.
- GitHub CLI (CVE-2024-53858) Недостатки логики приводили к утечке токенов доступа к контролируемым злоумышленниками доменам при использовании определенных переменных окружения, таких как CODESPACES=true или GITHUB_ENTERPRISE_TOKEN.
- GitHub Codespaces: Вспомогательный скрипт Codespaces (gitcredential_github.sh) без разбора возвращал конфиденциальные токены для всех операций Git, независимо от запрашиваемого хоста.
В ответ на это Git реализовал комплексный механизм защиты (CVE-2024-52006), введя конфигурацию credential.protectProtocol для блокировки URL, содержащих символы возврата каретки (
).
Эта опция, включенная по умолчанию, закрывает уязвимости во всех Git и Git LFS. GitHub также обновил Codespaces для проверки запросов к хостам и ограничения обмена учетными данными на github.com.
Выводы RyotaK подчеркивают постоянную опасность текстовых протоколов и недостаточной проверки. Как отметил инженер, «небольшой недостаток архитектуры может привести к большой проблеме безопасности».
Разработчикам и разработчикам платформ рекомендуется применять стратегии «защита во всей глубине» и тщательно тестировать уязвимости анализа ввода.