Supabase Security

Aprende hacking en AWS desde cero hasta convertirte en un experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Información Básica

Según su página de inicio: Supabase es una alternativa de código abierto a Firebase. Inicia tu proyecto con una base de datos Postgres, Autenticación, APIs instantáneas, Funciones de borde, Suscripciones en tiempo real, Almacenamiento e Incrustaciones vectoriales.

Subdominio

Básicamente, cuando se crea un proyecto, el usuario recibirá un subdominio de 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 conectando a: postgres://postgres.jnanozjdybtpqgcwhdiz:[TU-CONTRASEÑA]@aws-0-us-west-1.pooler.supabase.com:5432/postgres (esto se creó en us-west-1). La contraseña es una contraseña que el usuario haya establecido previamente.

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

Esta sección también contiene opciones para:

  • Restablecer la contraseña de la base de datos

  • Configurar agrupamiento de conexiones

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

  • Configurar tamaño de disco

  • Aplicar restricciones de red y prohibiciones

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 de API anónimas

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

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

Registro (/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 a un cliente usando 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 de API secretas / de servicio

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

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

### Secreto JWT

También se generará un **Secreto JWT** 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 **los nuevos usuarios creen cuentas** en tu proyecto utilizando los puntos finales de la 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 registros 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`).\
Esto 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 ellos:

<figure><img src="../.gitbook/assets/image (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 prohibir 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.

### Configuración SMTP

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

### Configuraciones Avanzadas

* Establecer tiempo de vencimiento 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 inscribirse a la vez por usuario (10 por defecto)
* Conexiones Directas Máximas a la Base de Datos: Número máximo de conexiones utilizadas para la 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)

## 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 de S3).

</div>

* Establecer el límite de tamaño de archivo para cargar (por defecto es 50MB)
* La conexión de S3 se da con una URL como: `https://jnanozjdybtpqgcwhdiz.supabase.co/storage/v1/s3`
* Es posible **solicitar claves de acceso de S3** que están formadas por un `ID de clave de acceso` (por ejemplo, `a37d96544d82ba90057e0e06131d0a7b`) y una `clave de acceso secreta` (por ejemplo, `58420818223133077c2cec6712a4f909aec93b4daeedae205aa8e30d5a860628`)

## Funciones de Borde

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

Última actualización