Supabase Security

Unterstütze HackTricks

Grundlegende Informationen

Laut ihrer Landingpage: Supabase ist eine Open-Source-Alternative zu Firebase. Starte dein Projekt mit einer Postgres-Datenbank, Authentifizierung, sofortigen APIs, Edge-Funktionen, Echtzeit-Abonnements, Speicher und Vektor-Einbettungen.

Subdomain

Grundsätzlich erhält der Benutzer, wenn ein Projekt erstellt wird, eine supabase.co-Subdomain 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 herzustellen, wäre es möglich, sich zu verbinden: postgres://postgres.jnanozjdybtpqgcwhdiz:[YOUR-PASSWORD]@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 festgelegt hat.

Da die Subdomain bekannt ist und als Benutzername verwendet wird und die AWS-Regionen begrenzt sind, könnte es möglich sein, das Passwort per Brute-Force anzugreifen.

Dieser Abschnitt enthält auch Optionen zum:

  • Zurücksetzen des Datenbankpassworts

  • Konfigurieren des Verbindungs-Poolings

  • Konfigurieren von SSL: Ablehnen von Klartextverbindungen (standardmäßig sind sie 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 deinem Projekt wird etwa so aussehen: https://jnanozjdybtpqgcwhdiz.supabase.co.

anon api keys

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

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

Signup (/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>Login (/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>

Also, wann immer du einen Client entdeckst, der supabase mit dem zugewiesenen Subdomain verwendet (es ist möglich, dass ein Subdomain des Unternehmens ein CNAME über deren supabase Subdomain hat), könntest du versuchen, **ein neues Konto auf der Plattform über die supabase API zu erstellen**.

### secret / service\_role api keys

Ein geheimer API-Schlüssel wird ebenfalls mit **`role: "service_role"`** generiert. Dieser API-Schlüssel sollte geheim bleiben, da er in der Lage ist, **Row Level Security** zu umgehen.

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

### JWT Secret

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

## Authentication

### Signups

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

Standardmäßig erlaubt supabase **neuen Benutzern, Konten zu erstellen** in deinem Projekt, indem sie die zuvor erwähnten 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 erlauben"** zu aktivieren, um Personen zu erlauben, sich ohne Verifizierung ihrer E-Mail-Adresse anzumelden. Dies könnte Zugang zu **unerwarteten Daten** gewähren (sie erhalten die Rollen `public` und `authenticated`).\
Dies ist eine sehr schlechte Idee, da supabase pro aktivem Benutzer abrechnet, sodass Personen Benutzer erstellen und sich einloggen könnten und supabase dafür Gebühren erhebt:

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

### Passwords & sessions

Es ist möglich, die Mindestlänge des Passworts (standardmäßig), Anforderungen (standardmäßig keine) und die Verwendung von geleakten 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 Settings

Es ist möglich, ein SMTP zum Versenden von E-Mails einzurichten.

### Advanced Settings

* Ablaufzeit für Zugriffstokens festlegen (standardmäßig 3600)
* Erkennung und Widerruf potenziell kompromittierter Refresh-Tokens und Timeout festlegen
* MFA: Angeben, wie viele MFA-Faktoren gleichzeitig pro Benutzer registriert werden können (standardmäßig 10)
* Maximale direkte Datenbankverbindungen: Maximale Anzahl der Verbindungen, die zur Authentifizierung verwendet werden (standardmäßig 10)
* Maximale Anforderungsdauer: Maximale Zeit, die für eine Authentifizierungsanforderung zulässig ist (standardmäßig 10s)

## Storage

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

Supabase erlaubt **Dateien zu speichern** und über eine URL zugänglich zu machen (es verwendet S3-Buckets).

</div>

* Upload-Dateigrößenlimit festlegen (standardmäßig 50MB)
* Die S3-Verbindung wird mit einer URL wie dieser bereitgestellt: `https://jnanozjdybtpqgcwhdiz.supabase.co/storage/v1/s3`
* Es ist möglich, **S3-Zugangsschlüssel anzufordern**, die aus einer `access key ID` (z.B. `a37d96544d82ba90057e0e06131d0a7b`) und einem `secret access key` (z.B. `58420818223133077c2cec6712a4f909aec93b4daeedae205aa8e30d5a860628`) bestehen

## Edge Functions

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

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

Lerne & übe AWS Hacking:<img src="/.gitbook/assets/image.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/image.png" alt="" data-size="line">\
Lerne & übe GCP Hacking: <img src="/.gitbook/assets/image (2).png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/image (2).png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)

<details>

<summary>Support HackTricks</summary>

* Überprüfe die [**Abonnementpläne**](https://github.com/sponsors/carlospolop)!
* **Tritt der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folge** uns auf **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Teile Hacking-Tricks, indem du PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-Repos einreichst.

</details>

</div>

Last updated