Логотип
Git как машина времени: репозитории, которые помнят всё, что ты пытался стереть

Git как машина времени: репозитории, которые помнят всё, что ты пытался стереть

26 августа, 2026

40

Многие разработчики и безопасники искренне верят в магию команды git commit --amend или принудительного пуша с флагом --force. Реальность куда прозаичнее: Git спроектирован как структура данных на основе направленного ациклического графа (DAG), которая по умолчанию ничего не удаляет, а лишь переставляет указатели веток.

Анатомия каталога .git и висячие объекты

Когда файл случайно попадает в коммит, а затем разработчик пытается «замести следы» быстрым откатом ветки, содержимое файла никуда не исчезает. Оно остается в виде сжатого blob-объекта внутри внутренней базы данных под каталогом .git/objects.

Такие объекты переходят в категорию dangling (висячих) объектов, на которые больше не ссылается ни одна вершина графа. Внутренний сборщик мусора git gc не трогает их неделями, давая форензик-специалисту огромное окно возможностей для извлечения чувствительных данных.

Извлечение улик из скрытого журнала

Если коммит перезаписали или затерли локально, первым делом исследуют журнал ссылок git reflog. Он ведет строгий учет каждого перемещения указателя HEAD, сохраняя историю всех переключений, слияний и правок.

  • Команда git fsck --lost-found моментально находит все потерянные коммиты и распаковывает их содержимое в отдельную папку.
  • Утилита git cat-file -p <HASH> позволяет восстановить исходный текст любого найденного blob-объекта напрямую по его хешу.
  • Анализ git log -g раскрывает полную хронологию локальных действий пользователя до момента принудительной перезаписи истории.

Удаленные репозитории и публичные зеркала

Попытка переписать публичную ветку на GitHub или GitLab через git push --force создает лишь иллюзию безопасности. Платформы кэшируют старые коммиты во внутренних хранилищах, и они остаются доступными по прямому хешу через API событий или Pull Requests.

Любой приватный ключ, токен API или пароль от базы данных, попавший в публичный доступ хотя бы на пять секунд, уже спарсен ботами поисковых систем и зеркал. Использование инструментов вроде BFG Repo-Cleaner или git-filter-repo зачищает граф, но не отзывает скомпрометированные секреты у внешних систем.

Практические правила для расследователя

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

  • Всегда клонируйте репозиторий вместе с полным набором скрытых веток и служебных ссылок через флаг --mirror.
  • Используйте сканеры вроде TruffleHog или Gitleaks для автоматического поиска энтропии и паттернов секретов по всей глубине графа.
  • Не пытайтесь тестировать утилиты очистки на рабочем репозитории без создания изолированного бэкапа, я серьезно.

Оставьте заявку