@zereight/mcp-gitlab has multiple safety-control bypasses: execute_graphql read-only + allow-list bypass, unauthenticated transports, session-exhaustion DoS
Beschreibung
### Zusammenfassung @zereight/mcp-gitlab setzt GitLab einem LLM-Agenten aus, während es sich auf den schreibgeschützten Modus, eine Projekterlaubnisliste und Transportauth als Sicherheitskontrollen verlässt. Fünf Fehler besiegen diese Kontrollen. Unter dem MCP-Bedrohungsmodell können Tool-Call-Argumente / Inhalte durch nicht vertrauenswürdige Eingaben (Prompt Injection) oder einen bösartigen Client geformt werden. Bewerteter Commit: 60adcc0de5b0e96c4c2029f7a25d2775946421d8 (Paketversion 2.1.28). Source review only; PoCs sind lokal/offline. - F1 (HIGH) execution graphql besiegt BEIDE read-only mode und GITLAB ALLOWED PROJECT IDS. - F2 (HIGH, deployment-conditional) Streamable HTTP /mcp unauthenticated under cookie-jar / device-flow credentials. - F3 (MEDIUM) SSE standardmäßig nicht authentifiziert, keine Origin/Host-Validierung (DNS-Rebinding). - F4 (HIGH) unauthentifizierte Sitzung / Transporterschöpfung DoS (Token-Check ist nur syntaktisch). - F5 (LOW) CI Job Trace zurückgegeben wortwörtlich (Prompt-Injektionsfläche). ### Details F1 — index.ts:9194-9245 (Fall "execute graphql"), guard at :9196, detector in utils/graphql-query.ts. (a) Read-only bypass: graphqlQueryContainsWriteOperation() strip comments/strings then tests /(?:^|[};]\s*)(mutation|subscription)\b/. GraphQL behandelt Kommas als unbedeutend und stripGraphQLComments AndStrings entfernt sie nicht, so dass ein Dokument, das mit `,mutation{...}` beginnt, als Schreibvorgang ausgeführt wird, aber nur lesbar klassifiziert wird. (b) Allow-List-Umgehung: Der Handler ruft niemals getEffectiveProjectId() oder rejectIfProjectScopedDeployment() (im Gegensatz zu anderen Tools) auf, so dass ein roher GraphQL-Body /api/graphql mit dem Server-Token gegen jedes Projekt erreicht, auf das der Token zugreifen kann, unabhängig von GITLAB ALLOWED PROJECT IDS. execution graphql ist in readOnlyTools (tools/registry.ts:1288) aufgeführt. F2 — index.ts:1048-1052 forces REMOTE AUTHORIZATION/GITLAB MCP OAUTH only when started with a PAT or job token; hasCookie (:1029) und useOAuth (:1026) fehlen im Gate. Beginnend mit --cookie-path oder --use-oauth, geht die Validierung durch und mcpBearerAuth degradiert auf next() (:12903). Jeder /mcp-Aufrufer ist nicht authentifiziert, während buildAuthHeaders() die Live-Sitzung des Servers vorgeschaltet anhängt. F3 — index.ts:12276 requireSseAuth ist ein Durchgang, wenn SSE AUTH TOKEN deaktiviert ist (Standard), und der SSE-Transport (:12290) ohne enableDnsRebindingProtection/allowedHosts/allowedOrigins erstellt wird. Bei der Standard-Loopback-Bind kann eine bösartige Webseite DNS-rebind, um den lokalen Server mit den GitLab-Anmeldeinformationen des Betreibers zu steuern. F4 — index.ts:12387 validateToken checkt nur length>=20 und charset (keine Upstream-Verifizierung); parseAuthHeaders gibt AuthData für einen solchen String zurück; neue Sitzungen werden rein kapazitätsbezogen zugelassen (:12938, MAX SESSIONS standard 1000) und der pro-session rate limiter läuft nur, wenn bereits eine sessionId existiert. Garbage-Token initialisieren also alle Session-Slots für SESSION TIMEOUT SECONDS (Standard 3600s) -> 503 für legitime Benutzer. F5 — index.ts:10898-10911 (get pipeline job output) gibt die CI-Job-Trace wortwörtlich an das Modell zurück. Job-Logs sind von Angreifern beeinflusst ..
Quellen & weiterführende Informationen
Hier werden ausschließlich tatsächlich zu dieser Schwachstelle gespeicherte Quellenbelege angezeigt.
Was ist zur Behebung zu tun?
Auf eine behobene Version aktualisieren: 2.1.30.
Empfohlene Schritte
- Betroffene Systeme identifizieren: @zereight/mcp-gitlab.
- Exposition prüfen: Internet-Erreichbarkeit, Admin-Oberflächen, VPN, Mail- oder Webdienste.
- Update/Rollout auf behobene Version vorbereiten und priorisiert einspielen.
- Nacharbeiten dokumentieren: betroffene Assets, Maßnahme, Zeitpunkt, Restrestrisiko.
Übergangsmaßnahmen
- Zugriff auf betroffene Dienste auf vertrauenswürdige Netze einschränken.
- WAF/IDS/EDR-Regeln und Hersteller-IOCs aktivieren, sofern verfügbar.
- Nicht benötigte Funktionen, Plugins oder Dienste temporär deaktivieren.
- Administrative Zugänge besonders absichern: MFA, Passwortrotation, Session-Invalidierung.