Supabase Security

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert de l'équipe rouge HackTricks AWS)!

Autres façons de soutenir HackTricks :

Informations de base

Selon leur page d'accueil : Supabase est une alternative open source à Firebase. Démarrez votre projet avec une base de données Postgres, une authentification, des API instantanées, des fonctions Edge, des abonnements en temps réel, du stockage et des embeddings Vector.

Sous-domaine

Essentiellement, lorsqu'un projet est créé, l'utilisateur recevra un sous-domaine supabase.co comme : jnanozjdybtpqgcwhdiz.supabase.co

Configuration de la base de données

Ces données peuvent être consultées à partir d'un lien comme https://supabase.com/dashboard/project/<project-id>/settings/database

Cette base de données sera déployée dans une région AWS, et pour s'y connecter, il serait possible de le faire en se connectant à : postgres://postgres.jnanozjdybtpqgcwhdiz:[VOTRE-MOT-DE-PASSE]@aws-0-us-west-1.pooler.supabase.com:5432/postgres (cela a été créé dans us-west-1). Le mot de passe est un mot de passe que l'utilisateur a précédemment défini.

Par conséquent, comme le sous-domaine est connu et est utilisé comme nom d'utilisateur et que les régions AWS sont limitées, il pourrait être possible d'essayer de forcer le mot de passe.

Cette section contient également des options pour :

  • Réinitialiser le mot de passe de la base de données

  • Configurer le pool de connexions

  • Configurer SSL : Rejeter les connexions en texte clair (par défaut, elles sont activées)

  • Configurer la taille du disque

  • Appliquer des restrictions et des interdictions réseau

Configuration de l'API

Ces données peuvent être consultées à partir d'un lien comme https://supabase.com/dashboard/project/<project-id>/settings/api

L'URL pour accéder à l'API Supabase dans votre projet sera comme suit : https://jnanozjdybtpqgcwhdiz.supabase.co.

Clés d'API anonymes

Il générera également une clé d'API anonyme (rôle : "anon"), comme : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpuYW5vemRyb2J0cHFnY3doZGl6Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3MTQ5OTI3MTksImV4cCI6MjAzMDU2ODcxOX0.sRN0iMGM5J741pXav7UxeChyqBE9_Z-T0tLA9Zehvqk que l'application devra utiliser pour contacter l'API exposée dans notre exemple en

Il est possible de trouver le REST API pour contacter cette API dans la documentation, mais les points d'extrémité les plus intéressants seraient :

Inscription (/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>Connexion (/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>

Ainsi, chaque fois que vous découvrez un client utilisant supabase avec le sous-domaine qui leur a été accordé (il est possible qu'un sous-domaine de l'entreprise ait un CNAME sur leur sous-domaine supabase), vous pourriez essayer de **créer un nouveau compte sur la plateforme en utilisant l'API supabase**.

### Clés API secrètes / de rôle de service

Une clé API secrète sera également générée avec **`role: "service_role"`**. Cette clé API doit rester secrète car elle pourra contourner la **Sécurité au Niveau des Lignes**.

La clé API ressemble à ceci : `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpuYW5vemRyb2J0cHFnY3doZGl6Iiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTcxNDk5MjcxOSwiZXhwIjoyMDMwNTY4NzE5fQ.0a8fHGp3N_GiPq0y0dwfs06ywd-zhTwsm486Tha7354`

### Secret JWT

Un **Secret JWT** sera également généré afin que l'application puisse **créer et signer des jetons JWT personnalisés**.

## Authentification

### Inscriptions

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

Par **défaut**, supabase permettra aux **nouveaux utilisateurs de créer des comptes** sur votre projet en utilisant les points d'API mentionnés précédemment.

</div>

Cependant, ces nouveaux comptes, par défaut, **devront valider leur adresse e-mail** pour pouvoir se connecter au compte. Il est possible d'activer **"Autoriser les connexions anonymes"** pour permettre aux gens de se connecter sans vérifier leur adresse e-mail. Cela pourrait donner accès à des **données inattendues** (ils obtiennent les rôles `public` et `authenticated`).\
C'est une très mauvaise idée car supabase facture par utilisateur actif, donc les gens pourraient créer des utilisateurs, se connecter et supabase facturera pour ceux-ci :

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

### Mots de passe et sessions

Il est possible d'indiquer la longueur minimale du mot de passe (par défaut), les exigences (non par défaut) et d'interdire l'utilisation de mots de passe divulgués.\
Il est recommandé d'**améliorer les exigences car celles par défaut sont faibles**.

* Sessions utilisateur : Il est possible de configurer le fonctionnement des sessions utilisateur (délais d'expiration, 1 session par utilisateur...)
* Protection contre les bots et les abus : Il est possible d'activer Captcha.

### Paramètres SMTP

Il est possible de définir un SMTP pour envoyer des e-mails.

### Paramètres avancés

* Définir le temps d'expiration des jetons d'accès (3600 par défaut)
* Définir pour détecter et révoquer les jetons de rafraîchissement potentiellement compromis et le délai d'expiration
* MFA : Indiquer combien de facteurs MFA peuvent être inscrits en même temps par utilisateur (10 par défaut)
* Connexions directes maximales à la base de données : Nombre maximal de connexions utilisées pour l'authentification (10 par défaut)
* Durée maximale de la demande : Temps maximum autorisé pour qu'une demande d'authentification dure (10s par défaut)

## Stockage

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

Supabase permet de **stocker des fichiers** et de les rendre accessibles via une URL (il utilise des compartiments S3).

</div>

* Définir la limite de taille de fichier à téléverser (par défaut 50 Mo)
* La connexion S3 est donnée avec une URL comme : `https://jnanozjdybtpqgcwhdiz.supabase.co/storage/v1/s3`
* Il est possible de **demander des clés d'accès S3** qui sont formées par un `ID de clé d'accès` (par exemple `a37d96544d82ba90057e0e06131d0a7b`) et une `clé d'accès secrète` (par exemple `58420818223133077c2cec6712a4f909aec93b4daeedae205aa8e30d5a860628`)

## Fonctions Edge

Il est possible de **stocker des secrets** dans supabase également qui seront **accessibles par des fonctions Edge** (elles peuvent être créées et supprimées depuis le web, mais il n'est pas possible d'accéder directement à leur valeur).

Dernière mise à jour