概要
- GitHub では公開リポジトリの全てのコミットが 削除後も記録 されている現状
- Force push で消したはずのコミットも GH Archive に「Zero-Commit」PushEventとして残存
- Truffle Security と共同で、これら隠れたコミット内の シークレット検出ツール をOSS化
- APIやGH Archive の活用により、全削除コミットの効率的なスキャンが可能
- バグバウンティ やサプライチェーンリスク対策に直結する重要性
GitHubで「削除したはずのコミット」が消えない理由とリスク
- GitHub は全ての公開コミットを アーカイブ し、削除操作後も永続的に保存
- Force push (強制プッシュ)でミスやシークレット情報流出を隠そうとしても 完全消去不可
- GH Archive プロジェクトにより、全PushEventが 自動記録 されている実態
- Zero-Commit PushEvent は「HEADを過去に戻すだけ」の操作で、 コミットが消えたように見える
- しかし コミットハッシュ を知っていれば、GitHub上で 内容を復元・閲覧可能
コミット削除の仕組みとGitHubの保存構造
- git reset --hard HEAD~1 と git push --force で過去のコミットを参照不能状態に
- しかし GitHub は内部的に すべてのコミット を保持し、 reflog や多層的な仕組みで消去しない
- Pull Request や Fork、監査・複製・監視など多様な用途で 履歴保存 が必須
- そのため Force push 後も、 該当コミット は「削除済み」扱いで Web/API経由で取得可能
GitHub Event APIとGH Archiveの活用
- GitHub Event API は全公開リポジトリの イベント情報 をリアルタイムで取得可能
- 認証不要で利用可能
- PushEvent や Issue作成 など多様なイベントをカバー
- GH Archive はGitHub全イベントを アーカイブ し、 BigQuery 等で横断検索が可能
- 過去の全PushEventデータを 日付単位でダウンロード 可能
- Zero-Commit PushEvent を抽出し、「before」コミットをスキャン対象として特定
削除コミットからのシークレット発見と自動化
- TruffleHog 等のツールで、 削除されたコミット に埋もれた シークレット情報 を検出
- 例:APIキー、パスワード、証明書など高額バグバウンティ対象
- GitHub API やWeb UI経由で、 コミットハッシュ さえ分かれば内容取得が可能
- APIは レートリミット あり(登録ユーザー5,000回/時、未登録60回/時)
- 自動化スクリプト やOSSツールで、 Zero-Commit PushEvent を効率的に横断検索・検出
- Truffle Security との共同開発で、 組織単位の全削除コミットスキャンツール をOSS公開
事例と影響
- $25,000相当 のバグバウンティシークレットを 削除コミット から発見
- サプライチェーンリスク や 情報漏洩 の早期発見・防止に直結
- Force push 後も「完全消去」できないGitHubの特性を理解し、 運用・監査体制強化 が必須
推奨対策とまとめ
- シークレット管理 の徹底(コミット前スキャンや自動検出ツールの活用)
- Force push による履歴消去は 根本的な解決にならない 認識の徹底
- 公開リポジトリ の運用者は GH Archive や Zero-Commit検出ツール の活用推奨
- 定期的な監査 と 自動化ツール による継続的な監視体制の構築
- OSSツール によるセルフチェックで、 組織・個人のGitHubリスク低減 を実現
参考リンク・ツール
- GH Archive: gharchive.org
- TruffleHog: https://github.com/trufflesecurity/trufflehog
- Force Push Scanner OSSツール: Truffle Security公式リリース参照
- GitHub Event API: https://docs.github.com/en/rest/activity/events
まとめ
- GitHub でコミットを削除しても 履歴は消えない
- Force push や履歴改変操作では 情報漏洩リスク は排除できない
- GH Archive や Zero-Commit検出ツール で 過去の削除コミット も監査・調査可能
- シークレット検出の自動化 と 継続的な運用管理 が安全な開発運用の鍵