Supabase Sentinel
Farenhytee/supabase-sentinelClaude Skill для комплексного аудита Supabase-проектов: проверяет RLS-политики, утечки ключей, обходы авторизации и уязвимости хранилища. 27 антипаттернов на основе CVE-2025-48757 и 10 исследований. Безопасен для продакшена.
Установка
git clone https://github.com/Farenhytee/supabase-sentinel.gitREADME
🛡️ Supabase Sentinel
Claude Skill для аудита безопасности вашего Supabase-проекта.
Добавьте его в Claude Code, Cursor или любую среду на базе Claude. Скажите «проверь мой Supabase-проект» — и получите подробный отчёт о безопасности с готовым SQL для исправлений за минуты, а не дни.
Более 170 приложений Lovable были взломаны. 20,1 млн строк оказались открыты в стартапах YC. 45% кода, сгенерированного ИИ, содержит уязвимости из OWASP Top 10. Встроенный Security Advisor Supabase лишь проверяет, включён ли RLS — Supabase Sentinel проверяет, работает ли он на самом деле.
Что делает скилл
Supabase Sentinel выполняет 7-этапный аудит безопасности любого Supabase-проекта:
- Сканирует кодовую базу на предмет открытых ключей
service_role, захардкоженных JWT и секретов, попавших в git - Интроспектирует схему базы данных — таблицы, RLS-политики, представления, функции, бакеты хранилища
- Сопоставляет с 27 известными паттернами уязвимостей, взятыми из CVE-2025-48757, 10 опубликованных исследований и тысяч задокументированных взломов
- Динамически зондирует API с помощью техники
Prefer: tx=rollback(данные не изменяются, безопасно для продакшена) - Тестирует ghost auth — могут ли злоумышленники создавать неподтверждённые аккаунты и получать доступ к данным?
- Формирует оценочный отчёт безопасности с понятными объяснениями и конкретными сценариями атак
- Генерирует готовый SQL для исправлений — скопировал, вставил, готово
Быстрый старт
Вариант 1: Claude Code / Cursor
Скопируйте папку скилла в свой проект:
# Клонировать в директорию skills вашего проекта
git clone https://github.com/Farenhytee/supabase-sentinel.git .claude/skills/supabase-sentinel
# Или в общую директорию skills
git clone https://github.com/Farenhytee/supabase-sentinel.git ~/claude-skills/supabase-sentinelЗатем просто спросите Claude:
Audit my Supabase project for security issues
Claude автоматически обнаружит учётные данные Supabase из .env-файлов, выполнит полный аудит и представит отчёт.
Вариант 2: Claude.ai (с computer use)
- Скачайте репозиторий как ZIP
- Загрузите его в диалог Claude.ai с включённым computer use
- Напишите: «Use the Supabase Sentinel skill to audit my Supabase project»
- Укажите URL и ключи Supabase по запросу
Вариант 3: Вручную (любой AI-ассистент)
Скопируйте содержимое SKILL.md в системный промпт или диалог, затем следуйте рабочему процессу, указав учётные данные Supabase.
Что обнаруживает скилл
Критические уязвимости
| Паттерн | Описание |
|---|---|
RLS_DISABLED | Таблицы без Row-Level Security — полностью открыты для интернета |
SERVICE_ROLE_EXPOSED | Ключ service_role во фронтенд-коде — обходит ВСЮ защиту |
POLICIES_BUT_NO_RLS | Политики написаны, но RLS так и не включён — ложное ощущение безопасности |
WRITE_USING_TRUE | INSERT/UPDATE/DELETE с USING(true) — любой может изменять данные |
Высокая степень риска
| Паттерн | Описание |
|---|---|
USING_TRUE_SELECT | Все строки читаемы анонимными пользователями в чувствительных таблицах |
VIEW_NO_SECURITY_INVOKER | Представления обходят RLS, выполняясь от имени суперпользователя |
SECURITY_DEFINER_EXPOSED | Функции в публичной схеме обходят RLS и доступны через API |
USER_METADATA_IN_POLICY | Политики ссылаются на метаданные, изменяемые пользователем — эскалация привилегий |
UPDATE_NO_WITHCHECK | Политики UPDATE без WITH CHECK — риск массового присвоения |
GHOST_AUTH | Неподтверждённые email-регистрации дают аутентифицированные сессии |
STORAGE_NO_RLS | Бакет хранилища без политик контроля доступа |
JWT_SECRET_EXPOSED | Утечка секрета подписи JWT — можно подделать токен любого пользователя |
Средняя степень риска
| Паттерн | Описание |
|---|---|
RLS_NO_POLICIES | RLS включён, но политики отсутствуют — весь доступ молча блокируется (баг) |
POLICY_NO_ROLE_SCOPE | Политика применяется ко всем ролям, включая анонимных |
MULTIPLE_PERMISSIVE | Несколько разрешающих политик объединяются через OR — побеждает наиболее мягкая |
RLS_PERFORMANCE | auth.uid() не кешируется — деградация производительности, потенциальный DoS |
PUBLIC_BUCKET | Бакет хранилища публично доступен без авторизации |
SENSITIVE_COLUMNS | Столбцы с именами password, api_key и т.п. открыты через API |
| + ещё 9 паттернов | Полный список — в references/anti-patterns.md |
Пример вывода
╔════════════════════════════════════════════════════════╗
║ SUPABASE SENTINEL SECURITY REPORT ║
╠════════════════════════════════════════════════════════╣
║ Project: https://myapp.supabase.co ║
║ Scanned: 2026-03-15 14:30 UTC ║
║ Score: 35/100 🔴 ║
║ Summary: 12 tables, 8 policies, 7 findings ║
╚════════════════════════════════════════════════════════╝
🔴 CRITICAL — users: RLS Disabled
Risk: Anyone on the internet can read your entire users table
Attack: Open browser DevTools → copy anon key → curl the API → dump all emails, names, metadata
Proof: curl returns [{"id":"...","email":"user@real.com",...}]
Fix:
ALTER TABLE public.users ENABLE ROW LEVEL SECURITY;
CREATE POLICY "users_select_own"
ON public.users FOR SELECT TO authenticated
USING ((SELECT auth.uid()) = id);
🟠 HIGH — profiles: SELECT policy uses USING(true)
Risk: All user profiles are readable by anyone, including anonymous users
Attack: Enumerate all profiles via the API to harvest user data
...
✅ PASSING: orders, payments, invoices, subscriptions (4 tables properly secured)
Структура файлов
supabase-sentinel/
├── SKILL.md # Основной скилл — 7-этапный рабочий процесс аудита (333 строки)
├── references/
│ ├── audit-queries.md # 20 SQL-запросов для интроспекции схемы
│ ├── anti-patterns.md # 27 паттернов уязвимостей с уровнем риска, методом обнаружения и исправлением
│ ├── fix-templates.md # SQL-шаблоны исправлений — 7 паттернов RLS, хранилище, авторизация, превентивные меры
│ └── vibe-coding-context.md # CVE-2025-48757, исследования, анализ платформ
├── assets/
│ └── ...