Supabase Security

Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Grundlegende Informationen

Gemäß ihrer Startseite: Supabase ist eine Open-Source-Alternative zu Firebase. Starten Sie Ihr Projekt mit einer Postgres-Datenbank, Authentifizierung, sofortigen APIs, Edge Functions, Echtzeit-Abonnements, Speicher und Vektoreinbettungen.

Subdomäne

Im Grunde erhält der Benutzer bei der Erstellung eines Projekts eine Supabase.co-Subdomäne wie: jnanozjdybtpqgcwhdiz.supabase.co

Datenbankkonfiguration

Diese Daten können über einen Link wie https://supabase.com/dashboard/project/<project-id>/settings/database abgerufen werden

Diese Datenbank wird in einer AWS-Region bereitgestellt, und um eine Verbindung dazu herzustellen, wäre es möglich, dies über die Verbindung zu tun: postgres://postgres.jnanozjdybtpqgcwhdiz:[DEIN PASSWORT]@aws-0-us-west-1.pooler.supabase.com:5432/postgres (dies wurde in us-west-1 erstellt). Das Passwort ist ein Passwort, das der Benutzer zuvor eingegeben hat.

Daher, da die Subdomäne bekannt ist und als Benutzername verwendet wird und die AWS-Regionen begrenzt sind, könnte es möglich sein, zu versuchen, das Passwort brute forcen.

Dieser Abschnitt enthält auch Optionen zum:

  • Zurücksetzen des Datenbankpassworts

  • Konfigurieren des Verbindungspoolings

  • Konfigurieren von SSL: Ablehnen von Klartextverbindungen (standardmäßig aktiviert)

  • Konfigurieren der Festplattengröße

  • Anwenden von Netzwerkbeschränkungen und Sperren

API-Konfiguration

Diese Daten können über einen Link wie https://supabase.com/dashboard/project/<project-id>/settings/api abgerufen werden

Die URL zum Zugriff auf die Supabase-API in Ihrem Projekt wird wie folgt aussehen: https://jnanozjdybtpqgcwhdiz.supabase.co.

Anonyme API-Schlüssel

Es wird auch einen anon API-Schlüssel generieren (Rolle: "anon"), wie z.B.: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpuYW5vemRyb2J0cHFnY3doZGl6Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3MTQ5OTI3MTksImV4cCI6MjAzMDU2ODcxOX0.sRN0iMGM5J741pXav7UxeChyqBE9_Z-T0tLA9Zehvqk, den die Anwendung verwenden muss, um den in unserem Beispiel freigegebenen API-Schlüssel zu kontaktieren.

Es ist möglich, die API-REST zu finden, um diese API in den Dokumenten zu kontaktieren, aber die interessantesten Endpunkte wären:

Registrierung (/auth/v1/signup)

``` POST /auth/v1/signup HTTP/2 Host: id.io.net Content-Length: 90 X-Client-Info: supabase-js-web/2.39.2 Sec-Ch-Ua: "Not-A.Brand";v="99", "Chromium";v="124" Sec-Ch-Ua-Mobile: ?0 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpuYW5vemRyb2J0cHFnY3doZGl6Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3MTQ5OTI3MTksImV4cCI6MjAzMDU2ODcxOX0.sRN0iMGM5J741pXav7UxeChyqBE9_Z-T0tLA9Zehvqk User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.60 Safari/537.36 Content-Type: application/json;charset=UTF-8 Apikey: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpuYW5vemRyb2J0cHFnY3doZGl6Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3MTQ5OTI3MTksImV4cCI6MjAzMDU2ODcxOX0.sRN0iMGM5J741pXav7UxeChyqBE9_Z-T0tLA9Zehvqk Sec-Ch-Ua-Platform: "macOS" Accept: */* Origin: https://cloud.io.net Sec-Fetch-Site: same-site Sec-Fetch-Mode: cors Sec-Fetch-Dest: empty Referer: https://cloud.io.net/ Accept-Encoding: gzip, deflate, br Accept-Language: en-GB,en-US;q=0.9,en;q=0.8 Priority: u=1, i

{"email":"test@exmaple.com","password":"SomeCOmplexPwd239."}

</details>

<details>

<summary>Anmeldung (/auth/v1/token?grant_type=password)</summary>

POST /auth/v1/token?grant_type=password HTTP/2 Host: hypzbtgspjkludjcnjxl.supabase.co Content-Length: 80 X-Client-Info: supabase-js-web/2.39.2 Sec-Ch-Ua: "Not-A.Brand";v="99", "Chromium";v="124" Sec-Ch-Ua-Mobile: ?0 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpuYW5vemRyb2J0cHFnY3doZGl6Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3MTQ5OTI3MTksImV4cCI6MjAzMDU2ODcxOX0.sRN0iMGM5J741pXav7UxeChyqBE9_Z-T0tLA9Zehvqk User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.60 Safari/537.36 Content-Type: application/json;charset=UTF-8 Apikey: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpuYW5vemRyb2J0cHFnY3doZGl6Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3MTQ5OTI3MTksImV4cCI6MjAzMDU2ODcxOX0.sRN0iMGM5J741pXav7UxeChyqBE9_Z-T0tLA9Zehvqk Sec-Ch-Ua-Platform: "macOS" Accept: / Origin: https://cloud.io.net Sec-Fetch-Site: same-site Sec-Fetch-Mode: cors Sec-Fetch-Dest: empty Referer: https://cloud.io.net/ Accept-Encoding: gzip, deflate, br Accept-Language: en-GB,en-US;q=0.9,en;q=0.8 Priority: u=1, i

{"email":"test@exmaple.com","password":"SomeCOmplexPwd239."}

</details>

So, wann immer Sie einen Client entdecken, der Supabase mit dem ihm gewährten Subdomain verwendet (es ist möglich, dass eine Subdomain des Unternehmens über ihrer Supabase-Subdomain ein CNAME hat), könnten Sie versuchen, **ein neues Konto in der Plattform über die Supabase-API zu erstellen**.

### Geheime / service\_role API-Schlüssel

Ein geheimer API-Schlüssel wird auch mit **`role: "service_role"`** generiert. Dieser API-Schlüssel sollte geheim gehalten werden, da er in der Lage sein wird, die **Zeilen-Ebene-Sicherheit** zu umgehen.

Der API-Schlüssel sieht so aus: `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpuYW5vemRyb2J0cHFnY3doZGl6Iiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTcxNDk5MjcxOSwiZXhwIjoyMDMwNTY4NzE5fQ.0a8fHGp3N_GiPq0y0dwfs06ywd-zhTwsm486Tha7354`

### JWT Secret

Ein **JWT Secret** wird auch generiert, damit die Anwendung **benutzerdefinierte JWT-Token erstellen und signieren** kann.

## Authentifizierung

### Registrierungen

<div data-gb-custom-block data-tag="hint" data-style='success'>

Standardmäßig erlaubt Supabase **neuen Benutzern, Konten** in Ihrem Projekt zu erstellen, indem sie die zuvor genannten API-Endpunkte verwenden.

</div>

Diese neuen Konten müssen jedoch standardmäßig **ihre E-Mail-Adresse validieren**, um sich in das Konto einloggen zu können. Es ist möglich, **"Anonyme Anmeldungen zulassen"** zu aktivieren, um Personen das Einloggen ohne Überprüfung ihrer E-Mail-Adresse zu ermöglichen. Dies könnte Zugriff auf **unerwartete Daten** gewähren (sie erhalten die Rollen `public` und `authenticated`).\
Dies ist eine sehr schlechte Idee, da Supabase pro aktiven Benutzer Gebühren erhebt, sodass Personen Benutzer erstellen und sich einloggen könnten und Supabase für diese Gebühren erheben würde:

<figure><img src="../.gitbook/assets/image (1).png" alt=""><figcaption></figcaption></figure>

### Passwörter & Sitzungen

Es ist möglich, die minimale Passwortlänge anzugeben (standardmäßig), Anforderungen (standardmäßig nicht) und das Verwenden von durchgesickerten Passwörtern zu verbieten.\
Es wird empfohlen, die Anforderungen zu verbessern, da die Standardanforderungen schwach sind.

* Benutzersitzungen: Es ist möglich zu konfigurieren, wie Benutzersitzungen funktionieren (Timeouts, 1 Sitzung pro Benutzer...)
* Bot- und Missbrauchsschutz: Es ist möglich, Captcha zu aktivieren.

### SMTP-Einstellungen

Es ist möglich, einen SMTP einzurichten, um E-Mails zu senden.

### Erweiterte Einstellungen

* Ablaufzeit für Zugriffstoken festlegen (standardmäßig 3600)
* Festlegen, um potenziell kompromittierte Auffrischungstoken zu erkennen und zu widerrufen und Timeout
* MFA: Angeben, wie viele MFA-Faktoren pro Benutzer gleichzeitig eingeschrieben werden können (standardmäßig 10)
* Maximale direkte Datenbankverbindungen: Maximale Anzahl von Verbindungen, die zur Authentifizierung verwendet werden (standardmäßig 10)
* Maximale Anforderungsdauer: Maximale Zeit, die für eine Authentifizierungsanforderung zulässig ist (standardmäßig 10s)

## Speicher

<div data-gb-custom-block data-tag="hint" data-style='success'>

Supabase erlaubt es, **Dateien zu speichern** und über eine URL darauf zuzugreifen (es verwendet S3-Buckets).

</div>

* Legen Sie das Upload-Dateigrößenlimit fest (Standardwert beträgt 50 MB)
* Die S3-Verbindung wird mit einer URL wie dieser bereitgestellt: `https://jnanozjdybtpqgcwhdiz.supabase.co/storage/v1/s3`
* Es ist möglich, **S3-Zugriffsschlüssel** anzufordern, die aus einer `Zugriffsschlüssel-ID` (z. B. `a37d96544d82ba90057e0e06131d0a7b`) und einem `geheimen Zugriffsschlüssel` (z. B. `58420818223133077c2cec6712a4f909aec93b4daeedae205aa8e30d5a860628`) bestehen

## Edge-Funktionen

Es ist auch möglich, **Geheimnisse** in Supabase zu speichern, die von Edge-Funktionen **zugänglich sind** (sie können über das Web erstellt und gelöscht werden, aber es ist nicht möglich, direkt auf ihren Wert zuzugreifen).

Last updated