Supabase Security

Support HackTricks

Información Básica

Según su página de inicio: Supabase es una alternativa de código abierto a Firebase. Comienza tu proyecto con una base de datos Postgres, Autenticación, APIs instantáneas, Funciones Edge, suscripciones en tiempo real, Almacenamiento y embeddings vectoriales.

Subdominio

Básicamente, cuando se crea un proyecto, el usuario recibirá un subdominio supabase.co como: jnanozjdybtpqgcwhdiz.supabase.co

Configuración de la base de datos

Estos datos se pueden acceder desde un enlace como https://supabase.com/dashboard/project/<project-id>/settings/database

Esta base de datos se desplegará en alguna región de AWS, y para conectarse a ella sería posible hacerlo conectándose a: postgres://postgres.jnanozjdybtpqgcwhdiz:[YOUR-PASSWORD]@aws-0-us-west-1.pooler.supabase.com:5432/postgres (esto fue creado en us-west-1). La contraseña es una contraseña que el usuario puso previamente.

Por lo tanto, dado que el subdominio es conocido y se usa como nombre de usuario y las regiones de AWS son limitadas, podría ser posible intentar fuerza bruta la contraseña.

Esta sección también contiene opciones para:

  • Restablecer la contraseña de la base de datos

  • Configurar el agrupamiento de conexiones

  • Configurar SSL: Rechazar conexiones en texto plano (por defecto están habilitadas)

  • Configurar el tamaño del disco

  • Aplicar restricciones y prohibiciones de red

Configuración de la API

Estos datos se pueden acceder desde un enlace como https://supabase.com/dashboard/project/<project-id>/settings/api

La URL para acceder a la API de supabase en tu proyecto será como: https://jnanozjdybtpqgcwhdiz.supabase.co.

claves api anon

También generará una clave API anon (role: "anon"), como: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpuYW5vemRyb2J0cHFnY3doZGl6Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3MTQ5OTI3MTksImV4cCI6MjAzMDU2ODcxOX0.sRN0iMGM5J741pXav7UxeChyqBE9_Z-T0tLA9Zehvqk que la aplicación necesitará usar para contactar la clave API expuesta en nuestro ejemplo en

Es posible encontrar la API REST para contactar esta API en la docs, pero los endpoints más interesantes serían:

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>Iniciar sesión (/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>

Entonces, cada vez que descubras un cliente que utiliza supabase con el subdominio que se le otorgó (es posible que un subdominio de la empresa tenga un CNAME sobre su subdominio de supabase), podrías intentar **crear una nueva cuenta en la plataforma utilizando la API de supabase**.

### claves api secretas / service\_role

Una clave API secreta también se generará con **`role: "service_role"`**. Esta clave API debe ser secreta porque podrá eludir **Row Level Security**.

La clave API se ve así: `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpuYW5vemRyb2J0cHFnY3doZGl6Iiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTcxNDk5MjcxOSwiZXhwIjoyMDMwNTY4NzE5fQ.0a8fHGp3N_GiPq0y0dwfs06ywd-zhTwsm486Tha7354`

### Secreto JWT

Un **secreto JWT** también se generará para que la aplicación pueda **crear y firmar tokens JWT personalizados**.

## Autenticación

### Registros

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

Por **defecto**, supabase permitirá **que nuevos usuarios creen cuentas** en tu proyecto utilizando los endpoints de API mencionados anteriormente.

</div>

Sin embargo, estas nuevas cuentas, por defecto, **necesitarán validar su dirección de correo electrónico** para poder iniciar sesión en la cuenta. Es posible habilitar **"Permitir inicios de sesión anónimos"** para permitir que las personas inicien sesión sin verificar su dirección de correo electrónico. Esto podría otorgar acceso a **datos inesperados** (obtienen los roles `public` y `authenticated`).\
Esta es una muy mala idea porque supabase cobra por usuario activo, por lo que las personas podrían crear usuarios e iniciar sesión y supabase cobrará por esos:

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

### Contraseñas y sesiones

Es posible indicar la longitud mínima de la contraseña (por defecto), requisitos (no por defecto) y deshabilitar el uso de contraseñas filtradas.\
Se recomienda **mejorar los requisitos ya que los predeterminados son débiles**.

* Sesiones de usuario: Es posible configurar cómo funcionan las sesiones de usuario (tiempos de espera, 1 sesión por usuario...)
* Protección contra bots y abusos: Es posible habilitar Captcha.

### Configuraciones SMTP

Es posible establecer un SMTP para enviar correos electrónicos.

### Configuraciones avanzadas

* Establecer tiempo de expiración para tokens de acceso (3600 por defecto)
* Establecer para detectar y revocar tokens de actualización potencialmente comprometidos y tiempo de espera
* MFA: Indicar cuántos factores MFA pueden ser inscritos a la vez por usuario (10 por defecto)
* Máx. Conexiones directas a la base de datos: Número máximo de conexiones utilizadas para autenticación (10 por defecto)
* Duración máxima de la solicitud: Tiempo máximo permitido para que dure una solicitud de autenticación (10s por defecto)

## Almacenamiento

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

Supabase permite **almacenar archivos** y hacerlos accesibles a través de una URL (utiliza buckets S3).

</div>

* Establecer el límite de tamaño de archivo de carga (el predeterminado es 50MB)
* La conexión S3 se proporciona con una URL como: `https://jnanozjdybtpqgcwhdiz.supabase.co/storage/v1/s3`
* Es posible **solicitar una clave de acceso S3** que se forma por un `access key ID` (por ejemplo, `a37d96544d82ba90057e0e06131d0a7b`) y una `secret access key` (por ejemplo, `58420818223133077c2cec6712a4f909aec93b4daeedae205aa8e30d5a860628`)

## Funciones Edge

Es posible **almacenar secretos** en supabase también, que serán **accesibles por funciones edge** (se pueden crear y eliminar desde la web, pero no es posible acceder a su valor directamente).

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

Aprende y practica Hacking en AWS:<img src="../.gitbook/assets/image (1).png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../.gitbook/assets/image (1).png" alt="" data-size="line">\
Aprende y practica Hacking en GCP: <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>Apoya a HackTricks</summary>

* Consulta los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.

</details>

</div>

Last updated