Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

フィードお問い合わせプライバシー© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
gitlab-gitaly-fetch-ssrf — GitLab CE 19.4.1のGitaly fetch SSRFに関するPoCおよびラボ: GitHub/Bitbucketインポーターがresolved_addressのピン留めをスキップするため、認証済みユーザーがDNSを再バインドして内部ホストを取得できる。 | Kitploit
ツール/GitHubGitHub/abraxas/gitlab-gitaly-fetch-ssrf
脆弱性分析エクスプロイトウェブアプリケーション悪用セキュリティ仮想化ペネトレーションテストレッドチーミングラボと実践
GitHubabraxas/gitlab-gitaly-fetch-ssrf

gitlab-gitaly-fetch-ssrf

GitLab CE 19.4.1のGitaly fetch SSRFに関するPoCおよびラボ: GitHub/Bitbucketインポーターがresolved_addressのピン留めをスキップするため、認証済みユーザーがDNSを再バインドして内部ホストを取得できる。

リポジトリを見る
215日前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

Abraxas Labs - gitlab-gitaly-fetch-ssrf

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  gitlab-gitaly-fetch-ssrf

gitlab-gitaly-fetch-ssrf

GitLab CE 19.4.1 - GitLab Inc.

GitHub Enterprise / Bitbucket Server インポート(およびそのフラグが有効な場合の Direct Transfer)は Projects::ImportService#get_resolved_address をスキップする。Repository#fetch_as_mirror は resolved_address: "" をデフォルトとする。Gitaly の FetchRemote / CreateRepositoryFromURL はクローン先ホスト名を再解決する。UrlBlocker はすでにパブリック A レコードを許可していた。リバインドすれば、git-HTTP オブジェクトがインポート先プロジェクトに到達する。

GitHub Enterprise インポートを実行できるサインイン済みユーザーは、Gitaly に UrlBlocker がピン留めした IP とはもはや異なるホストを git-fetch させることができる。

IDCVE 未採番
CWECWE-918, CWE-367
CVSSHigh: 7.7 CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:L/A:N
製品GitLab CE
影響を受けるバージョン19.4.1-ce.0(v19.4.1-ee ツリー上の 26212baacadb)
認証認証済みユーザー、GitHub Enterprise / Bitbucket Server インポーター
ライセンスGNU Affero GPL v3.0
ラボ127.0.0.1 のみ

攻撃者ができること

GitHub Enterprise インポートを、攻撃者が制御するホスト名に向ける。Rails の UrlBlocker.validate! はパブリック A レコードを許可する。ParallelImporter.imports_repository? が true のため、ImportService はピン留めしない。RepositoryImporter#fetch_as_mirror は空の resolved_address で Gitaly を呼び出す。Gitaly はその名前が現在指す先を git HTTP でフェッチする。インポートされたリポジトリにはそのオブジェクトが含まれる。

オールインワンの omnibus では、これはワーカーのループバックである。http://127.0.0.1 を直接指定したクローンホスト名はフェイルクローズする。URL によるリポジトリインポートはすでにピン留めしている。Direct Transfer には bulk_import_enabled が必要(セルフマネージドのデフォルトは false)。

同じ製品の類似の残存問題: Gitea HTTPS インポートのピン留め欠落、webhook 0.0.0.0/8。

発見の経緯

19.4.1 のパッチノートを読み、次にインポーターを読んだ。Projects::ImportService#get_resolved_address はホスト名を検証済み IP に書き換え、それを Gitaly に渡す。GitHub と Bitbucket Server の並列インポーターは imports_repository? を設定し、その経路をスキップする。

project.repository.fetch_as_mirror(project.unsafe_import_url, refmap: refmap, forced: true)

fetch_as_mirror は resolved_address: "" をデフォルトとする。Direct Transfer の repository_pipeline.rb は validate! を呼び出しながら戻り値を破棄している。

私は素の gitlab/gitlab-ce:19.4.1-ce.0 を立ち上げた。CE の import_sources は空で始まるため、ラボでは GitHub を有効化する。POST /api/v4/import/github を github_hostname=http://ghe.lab:18080 で送信する。GitLab の netns 内のキャッチャーは偽の GHE JSON と git http-backend を話す。シードリポジトリのブロブ WITNESS は GITLAB-GITALY-FETCH-SSRF-WITNESS である。

GET /api/v4/projects/1/repository/files/WITNESS/raw?ref=master が witness を返した。Gitaly ログ: root/ghe-ssrf に対する FetchRemote の grpc.code=OK。キャッチャー: git/2.55 の info/refs と git-upload-pack。ネガティブテストの github_hostname=http://127.0.0.1:18080 は 400 Invalid URL となる。

すでに記録済みの回り道: シード CveLabRoot9! は WeakPasswords で拒否される(root 部分文字列)。19.4 ではそのチェックを 64 文字で回避する。Faraday はキャッチャーではないパブリック IP に接続できないため、ハーネスは 1.1.1.1:18080 を REDIRECT しつつ UrlBlocker にはパブリック A を見せ続ける。git-HTTP は GET /repos/org/repo が DNS を切り替える前に勝つことがある。GitLab はインポート途中で 502 を返し、その後ファイルはそこにある。リバースシェル。芝居。オラクルはインポートされたブロブと Gitaly の FetchRemote である。

ラボ

cd lab
./run.sh

対象は http://127.0.0.1:18410 のみ。GitLab CE は数 GB の RAM を要求する。許可されたラボのみ。

negative-loopback status=400 Invalid URL
witness-import status=201 import_status=scheduled
file-final http=200 body='GITLAB-GITALY-FETCH-SSRF-WITNESS'
SUCCESS GITLAB-GITALY-FETCH-SSRF imported-witness git-fetch-no-pin GITLAB-GITALY-FETCH-SSRF-WITNESS

残存する問題

def import_repository
  project.ensure_repository
  refmap = Gitlab::GithubImport.refmap
  project.repository.fetch_as_mirror(project.unsafe_import_url, refmap: refmap, forced: true)

URL によるリポジトリインポートがすでに行っているように、get_resolved_address を fetch_as_mirror に渡すこと。Direct Transfer でも UrlBlocker.validate! を破棄しないこと。

参考資料

  • gitlab.com/gitlab-org/gitlab タグ v19.4.1-ee
  • repository_importer.rb · repository.rb · import_service.rb
  • 同じ製品: gitlab-gitea-import-ssrf · gitlab-webhook-0net-ssrf
  • CWE-918 · CWE-367

ライセンス

GNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。

ツールをダウンロード