Оказывается, разработчики массово оставляют секреты (API-ключи, токены, пароли) в публичных коммитах на GitHub! 🔍 Исследователь просканировал тысячи репозиториев и обнаружил: в «упс-коммитах» регулярно всплывают данные для облачных сервисов, БД и платежных систем. 💣 Хакеры этим активно пользуются — их боты автоматически сканируют Git и высасывают ключи за минуты после публикации. Совет: ставьте pre-commit хуки с анализаторами вроде TruffleHog! 💻☠️ #безопасность #devops
Экспертный разбор: механизм утечки секретов через «упс-коммиты» в GitHub
Резюме исследования
Исследование демонстрирует фундаментальную уязвимость в архитектуре GitHub: force-push операции не удаляют коммиты физически, оставляя секреты доступными через «dangling commits». Анализ 100% публичных событий GitHub с 2020 года через GitHub Archive выявил действующие секреты на сумму $25k в программах bug bounty. Представлен open-source инструмент Force Push Scanner для превентивного аудита организаций.
Технический механизм уязвимости
Архитектура Git и GitHub
- Force-push: При выполнении
git reset --hard HEAD~1 && git push --forceссылка на коммит удаляется, но сам объект сохраняется в reflog - Доступность данных: GitHub сохраняет коммиты неограниченно для поддержки:
- Pull Request (через
refs/pull/) - Форков (механизм fork network)
- Систем аудита
- Pull Request (через
- Эксплуатация: Достаточно 4 hex-символов хеша для доступа через:
https://github.com/org/repo/commit/9eed.patch curl https://api.github.com/repos/org/repo/commits/9eed
Система обнаружения
GitHub Events API и GH Archive
- Сбор событий: Анализ потокового API (без аутентификации)
- Фильтрация: Выявление
PushEventс пустым массивом commits («zero-commit events») - Извлечение данных: Использование публичного датасета GH Archive в BigQuery
Force Push Scanner: Архитектура инструмента
python force_push_scanner.py --db-file scan.db --scan org_name
| Компонент | Технология | Назначение |
|---|---|---|
| Сканирование коммитов | TruffleHog | Поиск 100+ типов секретов |
| Оптимизация доступа | Git filter=blob:none | Минимизация трафика при клонировании |
| Хранение данных | SQLite3 | Логирование результатов |
Реальные инциденты
Кейс: Компрометация Istio
- Найденный артефакт: GitHub PAT с admin-правами
- Уровень доступа: Полный контроль над 30+ репозиториями
- Риски:
- Изменение CI/CD pipeline
- Инъекция backdoor в релизы
- Supply-chain атака
- Разрешение: Экстренный ревок токена
Метрики и статистика
- Распределение уязвимостей:
- MongoDB: 32%
- AWS Keys: 24%
- GitHub PAT: 18%
- Топ файлов-источников:
- .env (26%)
- docker-compose.yml (11%)
- application.properties (9%)
Рекомендации для Enterprise
- Проактивный мониторинг: Регулярный запуск Force Push Scanner
- Хранение секретов: Использование Vault / AWS Secrets Manager
- Политики доступа:
# .gitignore .env* **/secrets.yml config/*.token - Ответственное раскрытие: Интеграция с HackerOne/Bugcrowd
Архитектурные выводы
GitHub не предназначен для безопасного удаления данных. Ключевые инженерные уроки:
- Секреты в истории Git = компрометация (вне зависимости от force-push)
- Открытые API (GitHub Events) — источник для атакующих
- Эффективное обнаружение требует комбинации:
- Потоковая обработка событий
- Статический анализ кода
- Контекстная оценка критичности
Будущее технологии
- Интеграция TruffleHog Analyze для автооценки рисков
- LLM-агенты для автоматической триагирования
- Расширение на private репозитории через GitHub Apps
Экспертное заключение
«Удаление» коммитов — опасная иллюзия безопасности. Enterprise-командам необходимо: 1) Внедрить инструменты превентивного сканирования 2) Реализовать строгий lifecycle-менеджмент секретов 3) Аудитровать все force-push операции в критичных репозиториях Открытость GitHub Archive превращает исторические «ошибки» в перманентный вектор атак.
