Supabase Security

Apoya a HackTricks

Información Básica

Según su página de inicio: Supabase es una alternativa de Firebase de código abierto. 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, como 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 de 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á algo como: https://jnanozjdybtpqgcwhdiz.supabase.co.

anon api keys

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

Es posible encontrar la API REST para contactar con esta API en los 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>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>

Entonces, cada vez que descubras un cliente usando supabase con el subdominio que se les 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 usando la API de supabase**.

### secret / service\_role api keys

También se generará una clave API secreta con **`role: "service_role"`**. Esta clave API debe ser secreta porque podrá eludir la **Seguridad a Nivel de Fila**.

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

### JWT Secret

También se generará un **JWT Secret** para que la aplicación pueda **crear y firmar tokens JWT personalizados**.

## Authentication

### Signups

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

Por **defecto** supabase permitirá **a nuevos usuarios crear cuentas** en tu proyecto usando 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).png" alt=""><figcaption></figcaption></figure>

### Passwords & sessions

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 Abuso: Es posible habilitar Captcha.

### SMTP Settings

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

### Advanced Settings

* Establecer el tiempo de expiración de los tokens de acceso (3600 por defecto)
* Configurar para detectar y revocar tokens de actualización potencialmente comprometidos y tiempo de espera
* MFA: Indicar cuántos factores MFA se pueden registrar a la vez por usuario (10 por defecto)
* Máximo de 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 una solicitud de autenticación dure (10s por defecto)

## Storage

<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 S3 buckets).

</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`)

## Edge Functions

Es posible **almacenar secretos** en supabase que serán **accesibles por edge functions** (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 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">\
Aprende y practica 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>

* Revisa 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 repositorios de github de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).

</details>

</div>

Last updated