- GitHubでは、削除されたフォーク、削除されたリポジトリ、さらには非公開リポジトリのデータにもアクセスできる
- これはGitHubが把握しており、意図的に設計された挙動である
- GitHubを利用するあらゆる組織にとって巨大な攻撃ベクトルとなるため、「クロスフォークオブジェクト参照(CFOR)」という新しい用語を導入している
- CFOR脆弱性は、あるリポジトリのフォークが別のフォーク(非公開および削除済みフォークのデータを含む)の重要なデータにアクセスできるときに発生する
削除されたフォークのデータにアクセスする
- GitHubで一般的なワークフローを考えると、公開リポジトリをフォークし、そのフォークにコードをコミットした後、フォークを削除することがある
- フォークにコミットしたコードは依然としてアクセス可能であり、永続的にアクセス可能である
- コミットハッシュを知っていなければ保護されていると思うかもしれないが、ハッシュは発見できる
- 削除されたフォークからデータを見つけることは、かなり頻繁に起きる
削除されたリポジトリのデータにアクセスする
- GitHubに公開リポジトリがあり、ユーザーがそのリポジトリをフォークし、フォーク後にデータをコミットし、その後リポジトリ全体を削除するシナリオを考えると、
- フォーク後にコミットしたコードは依然としてアクセス可能である
- GitHubはリポジトリとフォークをリポジトリネットワークに保存し、元の「upstream」リポジトリがルートノードの役割を果たす
- フォークされた公開の「upstream」リポジトリが「削除」されると、GitHubはルートノードの役割を下流フォークのいずれかに再割り当てする
- しかし、「upstream」リポジトリのすべてのコミットは依然として存在し、すべてのフォーク経由でアクセスできる
非公開リポジトリのデータにアクセスする
- GitHubで新しいツールをオープンソース化する一般的なワークフローを考えると、
- 最終的に公開される非公開リポジトリを作成し、そのリポジトリの非公開な内部版を作成して(フォーク経由で)、公開しない機能のための追加コードをコミットし、「upstream」リポジトリを公開したうえでフォークは非公開のまま維持することがある
- 非公開機能および関連コード(ステップ2のもの)が公開閲覧可能かどうかは、公開リポジトリからアクセスできる
- 「upstream」リポジトリを公開した後に非公開フォークへコミットした内容は閲覧できない
実際にどのようにデータへアクセスするのか?
- コミットに直接アクセスすることで可能になる
- GitHubのリポジトリネットワークにおける破壊的操作(上で述べた3つのシナリオのようなもの)は、標準のGitHub UIや通常のgit操作からコミットデータへの参照を削除する
- しかし、このデータは依然として存在しており(コミットハッシュを知っていれば)アクセスできる
- コミットハッシュはSHA-1値であり、ユーザーが見たい特定のコミットのSHA-1コミットハッシュを知っていれば、https://github.com/<user/org>/…; エンドポイントからそのコミットへ直接移動できる
- コミットハッシュはGitHubのUIを通じてブルートフォース可能である
- GitHubのpublic events APIエンドポイントを通じてコミットハッシュをクエリすることもできる
GitHubのポリシー
- 最近、GitHubのVDPプログラムを通じてこれらの結果を提出したところ、GitHubはリポジトリがこのように動作するよう設計されていることを明確にした
- ドキュメントを確認した結果、GitHubは上で文書化された事例において、ユーザーが何を期待すべきかを明確に文書化していることが分かった
影響
- フォークが1つでも存在する限り、そのリポジトリネットワークに対するすべてのコミット(「upstream」リポジトリまたは「downstream」フォークのコミット)は永続的に存在することになる
- GitHubのリポジトリアーキテクチャはこの設計上の欠陥を必要としており、大多数のGitHubユーザーはリポジトリネットワークが実際にどのように動作するかを理解しておらず、その結果より安全でなくなる
- シークレットスキャンが進化し、リポジトリネットワーク内のすべてのコミットをスキャンできるようになると、自分のものではないシークレットについて警告されるようになる
- これら3つのシナリオは衝撃的だが、GitHubがリポジトリ内の削除済みデータを保持し得るすべての方法を網羅しているわけではない
GN⁺の見解
- この記事は、GitHubを利用する組織にとって重要なセキュリティ問題を提起している。削除された、あるいは非公開に設定されたリポジトリのデータに依然としてアクセス可能である点は衝撃的だ。これはGitHubのリポジトリネットワークアーキテクチャに起因する根本的な設計上の欠陥に見える
- 開発者はこの問題を認識し、重要なデータやシークレットをGitHubにコミットする際には注意すべきである。いったん公開リポジトリにプッシュされると、永久にアクセス可能になる可能性がある。重要なシークレットが漏えいした場合、完全な対処はキーのローテーションによってのみ可能である
- GitHubはこの問題を透明性をもって公開・文書化しているが、大多数のユーザーはリポジトリネットワークの動作を完全には理解していないだろう。GitHubはこの問題に対する認識向上とユーザー教育にさらに力を入れるべきである
- 他のバージョン管理システムでも同様の問題が存在する可能性がある。開発者と組織は、重要なデータを扱う際に使用中のツールのアーキテクチャと限界を十分に理解しなければならない
- 重要なデータの漏えいを防ぐには、厳格なアクセス制御と最小権限の原則の適用、定期的なシークレットスキャンと監視など、多面的なセキュリティ対策が必要である。何よりも開発者の高いセキュリティ意識が重要である
1件のコメント
Hacker Newsの意見