10 ポイント 投稿者 GN⁺ 2024-07-25 | 1件のコメント | WhatsAppで共有
  • 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件のコメント

 
GN⁺ 2024-07-25
Hacker Newsの意見
  • 2018年にHackerOneへ報告されたが、GitHubは意図した動作だとして修正しなかった。結論としては、個人フォークの代わりにリポジトリをコピーして使うべき
  • GitHubはあらゆるものを公開し、変更不可能にすることに執着している。たとえば、コメントを削除するにはリポジトリ所有者に実際の身分証明書をメールで送る必要がある
  • このような「非公開」機能の問題をユーザーが知っておく必要があるにもかかわらず、GitHubがこれをバグではなく機能と見なしているのは、セキュリティへの無関心を示している。非公開リポジトリは「リスト非掲載」リポジトリと呼ぶほうが適切
  • 非公開リポジトリと非公開フォークを使っていて、リポジトリを公開に切り替えるとフォークも公開される。GitHubは意図した動作だと主張できるかもしれないが、リポジトリとフォークを同時に公開するよう強制すべき
  • こうした動作はダークパターンのように見え、人々の生計がかかっているにもかかわらずGitHubは気にしていない。評判の失墜よりも、もっともらしい否認可能性と曖昧な利用規約のほうに価値を置いているからだ
  • この問題を矮小化するコメントがあることに驚く。GitHubを長年使ってきたが、このような結果は予想しておらず、不安を感じる。記事を直接読むことを勧める
  • この問題は新しいものではない。以前から多くの人がこの問題を見つけていた
  • GitHubのOSPOでは、公開フォークの非公開ミラーを維持するためのオープンソースGitHub Appを開発中で、今週ベータリリースを予定している
  • GitHub Eventsアーカイブが脆弱なリポジトリのSHA1ハッシュを露出させる仕組みこそが真の脆弱性であり、ネットワーク全体を検索することで削除された非公開リポジトリにもアクセスできる
  • 非公開データが公開データに依存し得る仕組みが問題。たとえば、非公開コミットが公開コミットCに依存している場合、公開リポジトリからCが削除されるとGitHubはそれを保持しなければならない。そうしないと非公開コミットが壊れてしまう
  • すべてのコミットはGitHubに送信された後は永続的に残り、一度公開されたコミットは常にコミットハッシュ経由でアクセス可能