
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.