Supabase Security

htARTE (HackTricks AWS Red Team Expert)에서 AWS 해킹을 처음부터 전문가까지 배우세요!

HackTricks를 지원하는 다른 방법:

기본 정보

랜딩 페이지에 따르면 Supabase는 오픈 소스 Firebase 대안입니다. 프로젝트를 포스트그레스 데이터베이스, 인증, 즉시 API, 엣지 함수, 실시간 구독, 저장소 및 벡터 임베딩과 함께 시작할 수 있습니다.

서브도메인

기본적으로 프로젝트가 생성되면 사용자는 다음과 같은 supabase.co 서브도메인을 받게 됩니다: jnanozjdybtpqgcwhdiz.supabase.co

데이터베이스 구성

이 데이터는 https://supabase.com/dashboard/project/<project-id>/settings/database와 같은 링크를 통해 액세스할 수 있습니다.

데이터베이스는 AWS 지역에 배포되며, 이에 연결하기 위해 다음과 같이 연결할 수 있습니다: postgres://postgres.jnanozjdybtpqgcwhdiz:[YOUR-PASSWORD]@aws-0-us-west-1.pooler.supabase.com:5432/postgres (이것은 us-west-1에서 생성되었습니다). 비밀번호는 사용자가 이전에 설정한 비밀번호입니다.

따라서 서브도메인이 알려진 것이고 사용자 이름으로 사용되며 AWS 지역이 제한되어 있기 때문에 비밀번호를 무차별 대입할 수 있습니다.

이 섹션에는 다음을 구성할 수 있는 옵션이 포함되어 있습니다:

  • 데이터베이스 비밀번호 재설정

  • 연결 풀링 구성

  • SSL 구성: 평문 연결 거부 (기본적으로 활성화됨)

  • 디스크 크기 구성

  • 네트워크 제한 및 금지 적용

API 구성

이 데이터는 https://supabase.com/dashboard/project/<project-id>/settings/api와 같은 링크를 통해 액세스할 수 있습니다.

프로젝트에서 Supabase API에 액세스하는 URL은 다음과 같을 것입니다: https://jnanozjdybtpqgcwhdiz.supabase.co.

익명 API 키

또한 응용 프로그램이 API에 연락하기 위해 사용해야 하는 익명 API 키(role: "anon")가 생성될 것입니다. 예를 들어: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpuYW5vemRyb2J0cHFnY3doZGl6Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3MTQ5OTI3MTksImV4cCI6MjAzMDU2ODcxOX0.sRN0iMGM5J741pXav7UxeChyqBE9_Z-T0tLA9Zehvqk이며, 이 예에서 응용 프로그램이 노출된 API 키를 사용해야 합니다.

이 API에 연락하기 위한 API REST를 찾을 수 있으며, 문서에서 가장 흥미로운 엔드포인트는 다음과 같습니다:

가입 (/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>로그인 (/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>

그래서, 클라이언트가 부여받은 서브도메인을 사용하여 supabase를 사용하는 것을 발견할 때 (회사의 서브도메인이 supabase 서브도메인을 덮어쓸 수 있음), **supabase API를 사용하여 플랫폼에 새 계정을 생성**해 볼 수 있습니다.

### 시크릿 / 서비스_롤 API 키

**`role: "service_role"`**으로 생성된 시크릿 API 키도 생성됩니다. 이 API 키는 **행 수준 보안을 우회할 수 있기 때문에 비밀이어야** 합니다.

API 키는 다음과 같이 보입니다: `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImpuYW5vemRyb2J0cHFnY3doZGl6Iiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTcxNDk5MjcxOSwiZXhwIjoyMDMwNTY4NzE5fQ.0a8fHGp3N_GiPq0y0dwfs06ywd-zhTwsm486Tha7354`

### JWT 시크릿

**JWT 시크릿**도 생성되어 애플리케이션이 **사용자 지정 JWT 토큰을 생성하고 서명**할 수 있습니다.

## 인증

### 가입

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

**기본적으로** supabase는 **새 사용자가 이전에 언급된 API 엔드포인트를 사용하여 프로젝트에 계정을 생성할 수 있도록** 허용합니다.

</div>

그러나 이러한 새 계정은 **기본적으로 이메일 주소를 확인해야만 로그인할 수 있습니다**. 이메일 주소 확인 없이 로그인할 수 있도록 **"익명 로그인 허용"**을 활성화할 수 있습니다. 이렇게 하면 **예기치 않은 데이터에 액세스**할 수 있습니다(역할 `public` 및 `authenticated`을 받음).\
이것은 매우 나쁜 아이디어입니다. 왜냐하면 supabase는 활성 사용자당 요금을 부과하므로 사람들이 사용자를 만들고 로그인하면 supabase가 그에 대해 요금을 청구할 수 있습니다:

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

### 비밀번호 및 세션

최소 비밀번호 길이(기본값), 요구 사항(기본값 없음) 및 유출된 비밀번호 사용 금지를 지정할 수 있습니다.\
기본값이 약한 요구 사항이므로 **요구 사항을 개선하는 것이 좋습니다**.

* 사용자 세션: 사용자 세션 작동 방식을 구성할 수 있습니다(타임아웃, 사용자당 1개 세션...)
* 봇 및 남용 방지: Captcha를 활성화할 수 있습니다.

### SMTP 설정

이메일을 보내기 위해 SMTP를 설정할 수 있습니다.

### 고급 설정

* 액세스 토큰 만료 시간 설정(기본값은 3600)
* 잠재적으로 손상된 리프레시 토큰을 감지하고 폐기하고 타임아웃 설정
* MFA: 사용자 당 동시에 등록할 수 있는 MFA 요소 수 지정(기본값은 10)
* 최대 직접 데이터베이스 연결 수: 인증에 사용되는 최대 연결 수(기본값은 10)
* 최대 요청 기간: 인증 요청이 지속될 수 있는 최대 시간(기본값은 10초)

## 저장소

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

Supabase는 **파일을 저장**하고 URL을 통해 액세스할 수 있도록 허용합니다(S3 버킷을 사용합니다).

</div>

* 업로드 파일 크기 제한 설정(기본값은 50MB)
* S3 연결은 다음과 같은 URL로 제공됩니다: `https://jnanozjdybtpqgcwhdiz.supabase.co/storage/v1/s3`
* `access key ID` (예: `a37d96544d82ba90057e0e06131d0a7b`) 및 `secret access key` (예: `58420818223133077c2cec6712a4f909aec93b4daeedae205aa8e30d5a860628`)로 구성된 S3 액세스 키를 **요청**할 수 있습니다.

## 엣지 함수

supabase에 **비밀을 저장**할 수도 있으며 이는 **엣지 함수에서 액세스할 수 있습니다**(웹에서 생성 및 삭제할 수 있지만 값을 직접 액세스할 수는 없습니다).

最終更新