针对 CVE-2026-19478 的非破坏性 Nuclei 检测模板。该漏洞是 GitLab GraphQL API 中的一个严重(CVSS 9.4)未认证任意方法调用缺陷,GitLab 已于 2026 年 8 月 17 日 修复。
GitLab 的 GraphQL schema 支持一个 @gl_introduced(version: "X.Y.Z") 指令,该指令将某个字段限制为仅在最低 GitLab 版本上可用。当该指令引用的版本高于当前运行实例时,GitLab 会为这个(原本未知的)字段名生成一个回退字段。该回退解析器会直接对底层 Ruby 对象(Project、User 等)调用 object.public_send(method_name)——而不会重新检查授权。
结果是:任何能访问 /api/graphql 且知道任一公开项目 fullPath(或任一公开资料的用户名)的未认证攻击者,都可以对该对象调用任何公开的无参方法。其中既包括 touch 这类只读方法,也包括 destroy / delete 这类破坏性方法,以及 deactivate / block / ban 这类会改变状态的方法。
本仓库中的模板只会调用 touch(更新 updated_at 并返回 true)——详见下文 安全性。
| 版本系列 | 受影响版本 | 修复版本 |
|---|---|---|
| 18.2.x – 18.11.x | >= 18.2, < 18.11.11 | 18.11.11 |
| 19.0.x | < 19.0.8 | 19.0.8 |
| 19.1.x | < 19.1.6 | 19.1.6 |
| 19.2.x | < 19.2.4 | 19.2.4 |
仅影响自托管的 GitLab CE/EE——GitLab.com 和 GitLab Dedicated 不受影响。
该模板特意做过去危险化处理,适用于扫描你已获授权测试的服务器集群:
touch(这是一个 ActiveRecord 方法,仅更新 updated_at 并返回 true)。destroy、delete、deactivate、block 或 ban——这些方法同样可通过该漏洞调用,且具有真正的破坏性。root 用户资料。如果两者都不可达,它只会报告“未检测到”,而不会进行猜测。请勿将此模板中的 GraphQL 查询改用于对你不拥有或未经明确书面授权测试的系统调用变更新方法。
| 步骤 | 请求 | 目的 |
|---|---|---|
| 1 | GET /api/v4/projects?visibility=public | 查找一个公开项目作为无害目标 |
| 2 | POST /api/graphql — 对该项目执行 touch @gl_introduced(version: "999.0.0") | 触发回退字段解析器;存在漏洞的实例返回 "touch": true |
| 3(回退) | POST /api/graphql — 对 user(username: "root") 执行相同查询 | 仅在第 1 步未找到公开项目时使用 |
已修补的实例会直接拒绝未知字段("... doesn't exist on type ..."),因此模板的匹配器要求同时满足:出现正向的 touch 信号且没有该拒绝消息。
# single target
nuclei -t CVE-2026-19478.yaml -u https://gitlab.example.com
# validate the template itself
nuclei -t CVE-2026-19478.yaml -validate
# a list of targets, JSON output
nuclei -t CVE-2026-19478.yaml -l targets.txt -j -o results.json
需要 nuclei v3(该模板使用了 v3 模板引擎中引入的 http: 协议块和类 jq 的 json 提取器,无法在 nuclei v2.x 上加载)。
[CVE-2026-19478] [http] [critical] https://gitlab.example.com/api/graphql
请升级到 18.11.11、19.0.8、19.1.6 或 19.2.4(或更高版本)。完整公告请参阅 GitLab 的 19.2.4 补丁版本发布说明。
该模板仅用于防御性安全目的——扫描你拥有或已明确获授权测试的基础设施。在未经授权的情况下对系统运行此模板(或所链接的 PoC)在大多数司法管辖区均属违法行为。作者对滥用行为不承担任何责任。