FixVibe
Covered by FixVibehigh

누락된 Supabase 행 수준 보안(RLS)을 통한 무단 데이터 액세스

Supabase 지원 애플리케이션에서 데이터 보안은 행 수준 보안(RLS)에 의존합니다. RLS가 명시적으로 활성화되지 않고 정책으로 구성되지 않은 경우 공개 익명 키를 가진 모든 사용자는 전체 데이터베이스에서 데이터를 읽거나 업데이트하거나 삭제할 수 있습니다. 이는 Supabase 클라이언트가 공개 API 키를 사용하여 초기화되는 경우가 많은 Next.js 환경에서 특히 중요합니다.

CWE-284

영향

행 수준 보안(RLS) 구현 실패로 인해 공개 테이블이 익명 경계 [S1]를 통해 노출될 때 인증되지 않은 공격자가 Supabase 데이터베이스에서 데이터를 쿼리할 수 있습니다. Next.js 애플리케이션은 일반적으로 클라이언트 측 코드에서 Supabase anon 키를 노출하므로 공격자는 이 키를 사용하여 데이터베이스에 대한 직접 REST API 호출을 수행하여 의도된 애플리케이션 로직을 우회하고 민감한 사용자 정보에 액세스할 수 있습니다. [S2].

근본 원인

기본적으로 Supabase의 Postgres 테이블에는 공개 액세스 [S1]를 방지하기 위해 행 수준 보안의 명시적인 활성화가 필요합니다. 개발자가 테이블을 생성했지만 RLS 활성화를 잊어버리거나 제한적인 정책을 정의하지 못한 경우 데이터베이스는 프로젝트의 anon 키 [S1]를 소유한 모든 사람에게 데이터를 노출할 수 있습니다. Next.js 애플리케이션에서 서버 측 렌더링 및 클라이언트 측 가져오기에는 인증된 사용자 컨텍스트가 데이터베이스 계층 [S2]에 도달하도록 주의 깊은 Supabase 클라이언트 설정이 필요합니다.

구체적인 수정

  • RLS 활성화: 앱 데이터 [S1]를 저장하는 모든 공개 테이블에 대해 ALTER TABLE "your_table_name" ENABLE ROW LEVEL SECURITY;를 실행합니다.
  • 정책 정의: CREATE POLICY "Users can see their own data" ON your_table_name FOR SELECT USING (auth.uid() = user_id); [S1]와 같이 사용자의 인증 상태에 따라 액세스를 제한하는 특정 정책을 만듭니다.
  • 보안 서버 측 클라이언트: Next.js를 사용할 때 서비스 역할 클라이언트를 서버 전용으로 유지하고 사용자 [S2]에게 데이터를 반환하기 전에 소유권 필터를 계속 적용합니다.

FixVibe가 이를 테스트하는 방법

FixVibe는 이미 baas.supabase-rls를 통해 읽기 전용 Supabase RLS 검사를 실행하고 있습니다. 스캐너는 동일한 원본 JavaScript 번들에서 Supabase 프로젝트 URL 및 공개 익명 키를 검색하고, PostgREST에 공개 테이블 메타데이터를 요청하고, 제한된 읽기 전용 선택을 시도하여 사용자 세션 없이 데이터가 노출되는지 확인합니다. 서비스 역할 자격 증명을 삽입, 업데이트, 삭제 또는 사용하지 않습니다. Repo 스캔은 ENABLE ROW LEVEL SECURITY 없이 공개 테이블을 생성하는 SQL 마이그레이션에 플래그를 지정하는 repo.supabase.missing-rls를 통해 이를 더 일찍 포착할 수도 있습니다.