В современном мире разработки программного обеспечения безопасность данных и управление репозиториями Git играют ключевую роль. С ростом популярности GitHub миллионы разработчиков совершают коммиты и меняют историю своих веток, стремясь улучшить качество кода и избежать ошибок. Однако среди распространённых операций есть одна, которая несёт в себе скрытый риск для конфиденциальности – это форсированный пуш (force push). Как показала недавняя исследовательская работа Truffle Security, коммиты, удалённые посредством force push, на самом деле не исчезают окончательно и могут стать источником утечки секретов и конфиденциальных данных. Рассмотрим, как сканировать такие форсированные коммиты и защитить репозитории от нежелательных последствий.
Force Push в Git и его последствия Git push --force – операция, которая заставляет удалённый репозиторий принять локальную историю без проверки, является ли она прямым продолжением существующей. В отличие от обычного пуша, где сервер отвергает попытку переписать уже существующую историю, при форсированном пуше ветка удалённого репозитория уходит назад или переписывается, а все коммиты, которые больше не достижимы через какие либо ветки и теги, становятся «висячими» – dangling commits. Эти коммиты удалены из видимой истории, но не стерты физически и могут оставаться доступными через известные SHA-1 хеши. Особенно опасна ситуация, когда разработчики пытаются исправить ошибки, удаляя коммиты с секретами, паролями или ключами API. Несмотря на форсированный пуш, старая история сохраняется в виде dangling commits, что создаёт уязвимость.
Что такое нулевой форсированный пуш и почему он важен? Нулевой форсированный пуш – это ситуация, когда разработчик перемещает указатель ветки назад, не запушивая новых коммитов, а именно удаляет последние N коммитов и форсирует обновление. В публичных событиях GitHub (PushEvent с пустым массивом commits) такие операции отображаются как событие форсированного пуша без новых коммитов, что позволяет отслеживать подобные изменения. Эти нулевые форсированные пуши особенно интересны исследователям безопасности, потому что зачастую они используются для попыток скрыть данные. Тем не менее, история этих изменений и связанные с ними коммиты всё ещё доступны для анализа, если знать, как обращаться к ним инструментально. Встреча с Force Push Scanner Для эффективного поиска и анализа этих висячих коммитов Truffle Security разработала инструмент Force Push Scanner.
Его цель – обнаружить секреты в dangling commits, созданных после форсированных пушей, которые казались удалёнными по историческим причинам, но физически всё ещё доступны. Работа инструмента разбита на несколько этапов. Сначала скрипт запрашивает из GH Archive – огромного публичного архива событий GitHub, – данные о push-событиях с нулевыми коммитами. Этот проект, выступающий в качестве базы данных с несколькими петабайтами данных, хранит публичные push-события с 2015 года. Далее, используя список событий с нулевым количеством коммитов, анализируется ключевое поле before – SHA-1 хеш последнего коммита до форсированного обновления ветки.
Этот хеш зачастую указывает на висячий коммит, который удалён из видимой истории. Инструмент пытается подтянуть этот форсированный коммит из удалённого репозитория с помощью git fetch, а затем строит цепочку родительских коммитов для полного анализа viсячей истории. Для последующей проверки найденных данных используется популярный поиск секретов TruffleHog, который просматривает содержимое и выявляет возможные утечки API-ключей, паролей и других чувствительных данных. Почему это важно для безопасности разработки? Традиционные инструменты сканирования зачастую игнорируют висячие коммиты, потому что они недоступны в основном дереве разработки. Как показало исследование Truffle Security, только по событиям с нулевыми форсированными пушами обнаружено в среднем около 3.
68 уникальных висячих коммитов на одно такое событие. С учётом десятков миллионов подобных операций, количество потенциально опасных коммитов достигает десятков миллионов — огромный необнаруженный резервуар риска. Таким образом, недостаточно просто переписать историю и надеяться на удаление секретов. Реально удалённые данные сохраняются и становятся нелегальным источником утечек для злоумышленников, особенно если их SHA-1 хеши каким-либо образом становятся известны либо вычислимы. Практические рекомендации по работе с форсированными пушами Безопасное использование форсированного пуша требует сознательного подхода и внедрения внутренней политики безопасности.
Необходимо всегда избегать форсированного пуша в общие ветки, такие как main или master, без согласования с командой. Кроме того, рекомендуется применять флаг --force-with-lease, который защищает от случайного переписывания чужой работы. Для удаления секретов лучше использовать специализированные инструменты, такие как git filter-repo или BFG Repo-Cleaner, которые обеспечивают детальное удаление конфиденциальных данных из всех частей истории. Более того, интеграция проверки на секреты в процессы CI/CD и внедрение pre-commit хуков, например с использованием TruffleHog или других сервисов, поможет не допускать попадания критичных данных в репозиторий изначально. Доступ к данным GH Archive и работа с BigQuery Для детального анализа событий GitHub используется GH Archive – открытый проект, агрегирующий всю активность GitHub за последние годы.
Данные размещены в BigQuery, где можно делать запросы, связанные с push-событиями, фильтруя их по типу и организационной принадлежности. При желании разработчики и команды безопасности могут воспользоваться готовой базой данных, опубликованной Truffle Security, который содержит уже предобработанные события с форсированными пушами, что значительно упрощает процесс. Важность просвещения и ответственности Несмотря на технические решения, ключевым аспектом остаётся осознанность разработчиков относительно последствий форсированных пушей и способов безопасного еженедельного использования репозитория. Важно постоянно обучать команды, внедрять внутрискриптовые проверки и контролировать прошедшие коммиты на предмет скрытых секретов, даже если история была переписана. Заключение Форсированные пуши – необходимый инструмент для управления историей git, но одновременно распространённый источник утечек данных.
С помощью Force Push Scanner и глубокого анализа GH Archive становится возможным раскрыть и зафиксировать нежелательные секреты из висячих коммитов, которых не видно в стандартном обзоре истории репозитория. Использование подобных инструментов – важный этап в комплексной защите репозиториев. Для снижения рисков необходимо сочетать технический контроль, процессы и культуры разработки с обучением и осведомлённостью. В эпоху активного развития open source и облачных репозиториев знание особенностей работы с историей и умение выявлять «мертвые» коммиты, содержащие секреты, становится критически важным элементом безопасности современного девопса и разработки программного обеспечения.