Github Security

Support HackTricks

What is Github

(From here) 高レベルでは、GitHubは開発者がコードを保存・管理し、コードの変更を追跡・制御するのを助けるウェブサイトおよびクラウドベースのサービスです

Basic Information

Basic Github Information

External Recon

Githubリポジトリは公開、非公開、内部として設定できます。

  • 非公開は、組織の人だけがアクセスできることを意味します。

  • 内部は、企業の人だけがアクセスできることを意味します(企業は複数の組織を持つことがあります)。

  • 公開は、全てのインターネットがアクセスできることを意味します。

ターゲットにしたいユーザー、リポジトリ、または組織を知っている場合github dorksを使用して敏感な情報を見つけたり、各リポジトリでの敏感な情報の漏洩を検索できます。

Github Dorks

Githubは、ユーザー、リポジトリ、または組織をスコープとして指定して何かを検索することを許可します。したがって、敏感な情報の近くに表示される文字列のリストを使用して、ターゲット内の潜在的な敏感情報を簡単に検索できます

ツール(各ツールにはそのdorkのリストが含まれています):

Github Leaks

github dorksは、githubの検索オプションを使用して漏洩を検索するためにも使用されることに注意してください。このセクションは、各リポジトリをダウンロードし、その中で敏感な情報を検索するツールに専念しています(特定のコミットの深さをチェックすることも含まれます)。

ツール(各ツールにはその正規表現のリストが含まれています):

リポジトリで漏洩を探すときにgit log -pのようなコマンドを実行する場合、他のコミットを含む他のブランチが存在する可能性があることを忘れないでください!

External Forks

プルリクエストを悪用してリポジトリを妥協することが可能です。リポジトリが脆弱かどうかを知るには、主にGithub Actionsのyaml設定を読む必要があります。詳細は以下にあります

Github Leaks in deleted/internal forks

削除されたり内部のものであっても、githubリポジトリのフォークから敏感なデータを取得できる可能性があります。ここで確認してください:

Accessible Deleted Data in Github

Organization Hardening

Member Privileges

組織のメンバーに割り当てることができるデフォルトの権限があります。これらは、ページhttps://github.com/organizations/<org_name>/settings/member_privilegesまたはOrganizations APIから制御できます。

  • 基本的な権限: メンバーは、組織のリポジトリに対してNone/Read/write/Adminの権限を持ちます。推奨はNoneまたはReadです。

  • リポジトリのフォーク: 必要でない場合、メンバーが組織のリポジトリをフォークすることを許可しない方が良いです。

  • ページの作成: 必要でない場合、メンバーが組織のリポジトリからページを公開することを許可しない方が良いです。必要な場合は、公開または非公開のページを作成することを許可できます。

  • 統合アクセスリクエスト: これを有効にすると、外部のコラボレーターがこの組織とそのリソースにアクセスするためのGitHubまたはOAuthアプリへのアクセスをリクエストできるようになります。通常は必要ですが、必要でない場合は無効にする方が良いです。

  • この情報をAPIの応答で見つけられませんでした。見つけたら共有してください。

  • リポジトリの可視性の変更: 有効にすると、リポジトリに対して管理者権限を持つメンバー可視性を変更できるようになります。無効にすると、組織のオーナーのみがリポジトリの可視性を変更できます。人々に公開にすることを望まない場合は、これを無効にしてください。

  • この情報をAPIの応答で見つけられませんでした。見つけたら共有してください。

  • リポジトリの削除と移転: 有効にすると、リポジトリに対して管理者権限を持つメンバーが公開および非公開のリポジトリを削除または移転できるようになります。

  • この情報をAPIの応答で見つけられませんでした。見つけたら共有してください。

  • メンバーがチームを作成することを許可: 有効にすると、組織のメンバーは新しいチームを作成できるようになります。無効にすると、組織のオーナーのみが新しいチームを作成できます。これを無効にしておく方が良いです。

  • この情報をAPIの応答で見つけられませんでした。見つけたら共有してください。

  • このページで他の設定も可能ですが、前述のものが最もセキュリティに関連しています。

Actions Settings

いくつかのセキュリティ関連の設定は、ページhttps://github.com/organizations/<org_name>/settings/actionsから構成できます。

これらの設定は、各リポジトリでも独立して設定できることに注意してください。

  • Github actionsポリシー: どのリポジトリがワークフローを実行できるか、どのワークフローが許可されるべきかを指定できます。許可されるリポジトリを指定することを推奨し、すべてのアクションを実行することを許可しない方が良いです。

  • 外部コラボレーターからのフォークプルリクエストワークフロー: すべての外部コラボレーターに対して承認を要求することを推奨します。

  • この情報を持つAPIは見つけられませんでした。見つけたら共有してください。

  • フォークプルリクエストからのワークフローの実行: プルリクエストからのワークフローを実行することは非常に推奨されません。フォーク元のメンテナーは、ソースリポジトリに対して読み取り権限を持つトークンを使用する能力を与えられます。

  • この情報を持つAPIは見つけられませんでした。見つけたら共有してください。

  • ワークフローの権限: リポジトリの読み取り権限のみを付与することを強く推奨します。GITHUB_TOKENを使用して実行されるワークフローの悪用を避けるために、書き込みおよびプルリクエストの作成/承認権限を与えることは推奨されません。

Integrations

この情報にアクセスするためのAPIエンドポイントを知っている場合は教えてください!

  • サードパーティアプリケーションアクセスポリシー: すべてのアプリケーションへのアクセスを制限し、必要なもののみを許可することを推奨します(レビュー後)。

  • インストールされたGitHubアプリ: 必要なもののみを許可することを推奨します(レビュー後)。

Recon & Attacks abusing credentials

このシナリオでは、githubアカウントへのアクセスを取得したと仮定します。

With User Credentials

もし何らかの方法で組織内のユーザーの資格情報を持っている場合、ログインしてどの企業および組織の役割を持っているかを確認できます。生のメンバーであれば、生のメンバーが持つ権限、どのグループに属しているか、どのリポジトリに対してどの権限を持っているか、およびリポジトリがどのように保護されているかを確認できます。

2FAが使用されている可能性があるため、そのチェックを通過できる場合にのみこの情報にアクセスできることに注意してください。

user_sessionクッキーを盗むことに成功した場合(現在SameSite: Laxで設定されています)、資格情報や2FAなしでユーザーを完全に偽装できます。

役立つ場合に備えて、ブランチ保護のバイパスに関するセクションを確認してください。

With User SSH Key

Githubは、ユーザーSSHキーを設定することを許可しており、これは彼らの代わりにコードをデプロイするための認証方法として使用されます(2FAは適用されません)。

このキーを使用して、ユーザーがいくつかの権限を持つリポジトリで変更を行うことができますが、github APIにアクセスして環境を列挙するために使用することはできません。ただし、ローカル設定を列挙して、アクセスできるリポジトリやユーザーに関する情報を取得できます。

# Go to the the repository folder
# Get repo config and current user name and email
git config --list

ユーザーが自分のGitHubユーザー名としてユーザー名を設定している場合、https://github.com/<github_username>.keys で彼のアカウントに設定された 公開鍵 にアクセスできます。これを確認して、見つけた秘密鍵が使用できるかどうかを確認できます。

SSH鍵デプロイ鍵 としてリポジトリに設定することもできます。この鍵にアクセスできる人は、リポジトリからプロジェクトを起動する ことができます。通常、異なるデプロイ鍵を持つサーバーでは、ローカルファイル ~/.ssh/config が関連する鍵に関する情報を提供します。

GPG鍵

こちら で説明されているように、コミットに署名する必要がある場合や、発見される可能性があります。

現在のユーザーが鍵を持っているかどうかをローカルで確認してください:

gpg --list-secret-keys --keyid-format=long

With User Token

ユーザートークンについての基本情報を確認してくださいの紹介。

ユーザートークンは、HTTPS経由のGitのパスワードの代わりに使用できるか、基本認証を介してAPIに認証するために使用できます。付与された権限に応じて、さまざまなアクションを実行できる場合があります。

ユーザートークンは次のようになります: ghp_EfHnQFcFHX6fGIu5mpduvRiYR584kK0dX123

With Oauth Application

Github Oauthアプリケーションについての基本情報を確認してくださいの紹介。

攻撃者は、フィッシングキャンペーンの一環として、ユーザーが受け入れる可能性のある悪意のあるOauthアプリケーションを作成して、特権データ/アクションにアクセスすることがあります。

これらは、Oauthアプリケーションが要求できるスコープです。常に要求されたスコープを確認してから受け入れるべきです。

さらに、基本情報で説明されているように、組織はサードパーティアプリケーションに対して情報/リポジトリ/アクションへのアクセスを与えたり拒否したりできます

With Github Application

Githubアプリケーションについての基本情報を確認してくださいの紹介。

攻撃者は、フィッシングキャンペーンの一環として、ユーザーが受け入れる可能性のある悪意のあるGithubアプリケーションを作成して、特権データ/アクションにアクセスすることがあります。

さらに、基本情報で説明されているように、組織はサードパーティアプリケーションに対して情報/リポジトリ/アクションへのアクセスを与えたり拒否したりできます

Compromise & Abuse Github Action

Github Actionを妨害し悪用するためのいくつかの技術があります。ここで確認してください:

Abusing Github Actions

Branch Protection Bypass

  • 承認の数を要求: 複数のアカウントを妨害した場合、他のアカウントからPRを受け入れることができます。PRを作成したアカウントしか持っていない場合、自分のPRを受け入れることはできません。しかし、リポジトリ内のGithub Action環境にアクセスできる場合、GITHUB_TOKENを使用してPRを承認し、この方法で1つの承認を得ることができるかもしれません。

  • この点とCode Owners制限についての注意: 通常、ユーザーは自分のPRを承認できませんが、もしできる場合は、それを悪用して自分のPRを受け入れることができます。

  • 新しいコミットがプッシュされたときに承認を無効にする: これが設定されていない場合、正当なコードを提出し、誰かがそれを承認するのを待ってから、悪意のあるコードを追加して保護されたブランチにマージできます。

  • Code Ownersからのレビューを要求: これが有効になっていて、あなたがCode Ownerであれば、Github ActionがあなたのPRを作成し、その後自分で承認することができます。

  • CODEOWNERファイルが誤設定されている場合、Githubは文句を言いませんが、それを使用しません。したがって、誤設定されている場合は、Code Ownersの保護が適用されません。

  • 指定されたアクターがプルリクエストの要件をバイパスできるようにする: あなたがこれらのアクターの1人であれば、プルリクエストの保護をバイパスできます。

  • 管理者を含める: これが設定されていない場合、リポジトリの管理者であれば、このブランチの保護をバイパスできます。

  • PRハイジャック: 他の誰かのPRを変更して悪意のあるコードを追加し、結果として得られたPRを自分で承認してすべてをマージできるかもしれません。

  • ブランチ保護の削除: あなたがリポジトリの管理者であれば、保護を無効にし、PRをマージして保護を元に戻すことができます。

  • プッシュ保護のバイパス: リポジトリが特定のユーザーのみがブランチにプッシュ(コードをマージ)できるようにしている場合(ブランチ保護がすべてのブランチを保護している可能性がありますが、ワイルドカード*を指定しています)。

  • リポジトリに対する書き込みアクセスがあるが、ブランチ保護のためにコードをプッシュできない場合、新しいブランチを作成し、その中でコードがプッシュされたときにトリガーされるGithub Actionを作成できます。ブランチ保護はブランチが作成されるまで保護しないため、この最初のコードプッシュはGithub Actionを実行します

Bypass Environments Protections

Github環境についての基本情報を確認してくださいの紹介。

環境がすべてのブランチからアクセス可能な場合、それは保護されていないため、環境内のシークレットに簡単にアクセスできます。すべてのブランチが保護されているリポジトリ(名前を指定するか、*を使用することによって)を見つけることがあることに注意してください。その場合、コードをプッシュできるブランチを見つけ、新しいGithub Actionを作成することでシークレットを抽出できます(または1つを修正することができます)。

すべてのブランチが保護されている場合(ワイルドカード*を介して)、ブランチにコードをプッシュできるのは誰かが指定されていることに注意してください(これはブランチ保護で指定できます)し、あなたのユーザーは許可されていません。それでもカスタムGithub Actionを実行できます。なぜなら、ブランチを作成し、その上でプッシュトリガーを使用できるからです。ブランチ保護は新しいブランチへのプッシュを許可するため、Github Actionがトリガーされます

push: # Run it when a push is made to a branch
branches:
- current_branch_name #Use '**' to run when a push is made to any branch

注意してください。ブランチの作成後ブランチ保護が新しいブランチに適用され、それを変更することはできませんが、その時点で既に秘密をダンプしているでしょう。

Persistence

  • ユーザートークンを生成

  • シークレットからgithubトークンを盗む

  • ワークフローの結果ブランチ削除

  • 全ての組織に対してより多くの権限を付与

  • 情報を外部に流出させるためのウェブフックを作成

  • 外部コラボレーターを招待

  • SIEMによって使用されるウェブフック削除

  • バックドアを持つGithub Actionを作成/変更

  • シークレット値の変更を通じてコマンドインジェクションに脆弱なGithub Actionを見つける

Imposter Commits - リポジトリコミットを介したバックドア

Githubでは、フォークからリポジトリにPRを作成することが可能です。PRが受け入れられなくても、元のリポジトリ内にフォーク版のコードのためのコミットIDが作成されます。したがって、攻撃者はリポジトリの所有者によって作成されていない、見た目上正当なリポジトリから特定のコミットを使用するようにピン留めすることができるかもしれません。

これのように:

name: example
on: [push]
jobs:
commit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@c7d749a2d57b4b375d1ebcd17cfbfb60c676f18e
- shell: bash
run: |
echo 'hello world!'

For more info check https://www.chainguard.dev/unchained/what-the-fork-imposter-commits-in-github-actions-and-ci-cd

HackTricksをサポートする

Last updated