Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
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é.

FluxContactConfidentialité© 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
GitHub
punitdarji/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
41il y a 1 moisPas 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é

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 :

# 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

                    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)

# 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
Télécharger l’outil