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.