FixVibe
Covered by FixVibehigh

Несанкционированный доступ к данным через отсутствие безопасности на уровне строк Supabase (RLS)

В приложениях, поддерживаемых Supabase, безопасность данных зависит от безопасности на уровне строк (RLS). Если RLS явно не включен и не настроен с помощью политик, любой пользователь с открытым анонимным ключом может читать, обновлять или удалять данные во всей базе данных. Это особенно важно в средах Next.js, где клиент Supabase часто инициализируется с помощью открытого ключа API.

CWE-284

Влияние

Неспособность реализовать безопасность на уровне строк (RLS) позволяет неаутентифицированным злоумышленникам запрашивать данные из базы данных Supabase, когда общедоступные таблицы доступны через анонимную границу [S1]. Поскольку приложения Next.js обычно предоставляют ключ Supabase anon в коде на стороне клиента, злоумышленник может использовать этот ключ для прямых вызовов REST API к базе данных, минуя предполагаемую логику приложения и получая доступ к конфиденциальной информации пользователя. [S2].

Основная причина

По умолчанию таблицы Postgres в Supabase требуют явной активации безопасности на уровне строк для предотвращения публичного доступа [S1]. Когда разработчик создает таблицу, но забывает включить RLS или не может определить ограничительные политики, база данных может предоставить данные любому, у кого есть ключ anon проекта [S1]. В приложениях Next.js рендеринг на стороне сервера и выборка на стороне клиента также требуют тщательной настройки клиента Supabase, чтобы контекст аутентифицированного пользователя достигал уровня базы данных [S2].

Конкретные исправления

  • Включите RLS: Выполните ALTER TABLE "your_table_name" ENABLE ROW LEVEL SECURITY; для каждой общедоступной таблицы, в которой хранятся данные приложения [S1].
  • Определение политик. Создайте специальные политики, которые ограничивают доступ на основе статуса аутентификации пользователя, например 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 уже выполняет проверку Supabase RLS только для чтения через baas.supabase-rls. Сканер обнаруживает URL-адрес проекта Supabase и открытый ключ анонима из пакетов JavaScript того же происхождения, запрашивает у PostgREST метаданные общедоступной таблицы и пытается выполнить ограниченный выбор только для чтения, чтобы подтвердить, доступны ли данные без сеанса пользователя. Он не вставляет, не обновляет, не удаляет и не использует учетные данные роли службы. Сканирование репозитория также может обнаружить это раньше с помощью repo.supabase.missing-rls, который помечает миграции SQL, которые создают общедоступные таблицы без ENABLE ROW LEVEL SECURITY.