FixVibe

// docs / baas security / supabase service role exposure

JavaScript-те ашылған Supabase service role кілті: бұл нені білдіреді және оны қалай табуға болады

Supabase service role кілті — сіздің дерекқорыңыздың басты кілті. Оны ұстаған кез келген адам жол деңгейіндегі қауіпсіздікті айналып өтеді, әр кестенің әр бағанын оқи алады және өзі қалаған кез келген нәрсені жаза немесе жоя алады. Ол тек сервер жағындағы кодта болуға арналған — ешқашан браузерде емес. ИИ кодтау құралы оны JavaScript бумасына жіберген кезде, дерекқорыңыз іс жүзінде жалпыға ортақ болады. Бұл мақала ағып кеткен кілтті анықтайтын JWT пішінін, ағуды шығаратын үш ИИ-құрал үлгісін, анықтаудан кейінгі бірінші сағатта не істеу керектігін және оны пайдаланушылардан бұрын автоматты түрде сканерлеу жолын түсіндіреді.

Service role кілті дегеніміз не

Supabase әр жоба үшін екі бөлек кілт шығарады: anon кілті (жаңа жобаларда жариялау кілті деп те аталады) және service_role кілті. Екеуі де сіздің жобаңыздың JWT құпиясымен қол қойылған JSON Web Token-дер. Айырмашылық — JWT пайдалы жүгіне сіңірілген role талабы — жалпыға ортақ кілт үшін anon, басты кілт үшін service_role. PostgREST, Supabase Storage және Supabase Auth барлығы service_role талабын көргенде барлығын-айналып-өту режиміне ауысады.

jwt.io сайтында кез келген Supabase кілтін декодтап, пайдалы жүкті қараңыз. Service-role JWT пішіні қателеспестен танылады:

Service-role JWT декодталған пайдалы жүгі (төменде синтаксис ерекшелігі бар блок ретінде көрсетілген).

json
{
  "iss": "supabase",
  "ref": "[project-ref]",
  "role": "service_role",
  "iat": 1700000000,
  "exp": 2000000000
}

Жаңа Supabase жобалары JWT орнына sb_secret_ префиксі бар құпия-стильдегі кілттер шығарады. Мінез-құлық бірдей — жалпыға ортақ бумада sb_secret_ бар кез келген нәрсе бірдей апатты.

ИИ кодтау құралдары service role кілтін қалай ағызады

Біз мыңдаған vibe-кодтаған қолданбаларда бірдей үш үлгіні көрдік. Әрқайсысы әзірлеуші ИИ құралынан көмек сұраудан басталады және сервис кілті бумаға кіріктірілуімен аяқталады.

1-үлгі: NEXT_PUBLIC_ префиксі бар жалғыз .env файлы

Әзірлеуші ИИ құралынан "Supabase орнатуды" сұрайды және екі кілтпен бірге жалғыз .env қабылдайды. ИИ құралы — көптеген орта айнымалылары NEXT_PUBLIC_* арқылы ашылатын корпустарда үйретілген — екеуіне де NEXT_PUBLIC_ префиксін қосады. Next.js сол префиксіне сәйкес келетін кез келген нәрсені құрастыру кезінде клиент бумасына кіріктіреді. Vercel-ге жіберіңіз, сервис кілті main.[hash].js ішінде болады.

2-үлгі: createClient шақыруында қате кілт

Әзірлеуші екі кілтті ИИ жасаған config.ts файлына қояды, және ИИ браузер жағындағы createClient() шақыруын қателесіп process.env.SUPABASE_SERVICE_ROLE_KEY мәнімен толтырады. Құрастыру айнымалыны тартады, және JWT бумаға түседі.

3-үлгі: Тұқым сценарийлерінде кодталған Service-role кілті

Әзірлеуші ИИ құралынан дерекқорға тұқым салатын сценарий жазуын сұрайды. ИИ service-role кілтін файлға тікелей кодтайды (ортадан оқу орнына), файлды репозиторийге фиксациялайды, және жалпыға ортақ GitHub репозиторийі немесе орналастырылған қолданбаның /scripts/seed.js бағыты енді кілтті ұсынып отыр.

FixVibe бума сканері ағуды қалай анықтайды

FixVibe-тің bundle-secrets тексеруі орналастырылған қолданба сілтейтін әр JavaScript файлын — кіру бөліктерін, жалқау жүктелетін бөліктерді, веб-жұмысшыларды, қызметтік жұмысшыларды — жүктейді және JWT пішініне (eyJ[base64-header].eyJ[base64-payload].[signature]) сәйкес келетін кез келген нәрсені декодтайтын анықтаушы арқылы өткізеді. Декодталған пайдалы жүкте "role": "service_role" болса, сканерлеу файл жолы және кілт пайда болатын дәл жолы бар маңызды табылған нәтиже ретінде хабарлайды. Сол тексеру жаңа sb_secret_* үлгісін де префикс бойынша сәйкестендіреді.

Сканерлеу табылған кілтпен ешқашан аутентификацияланбайды. Ол пішінді анықтайды және ағуды хабарлайды — кілтті пайдаланарлықты дәлелдеу үшін пайдалану дерекқорыңызға рұқсатсыз қол жеткізу болар еді. Дәлел — JWT пайдалы жүгінің өзінде.

Анықталды — бірінші сағатта не істеу керек

Ағып кеткен service role кілті — орындалу уақытының төтенше жағдайы. Кілт сыпырылды деп есептеңіз — шабуылдаушылар нақты уақытта жалпыға ортақ бумаларды бақылайды. Кілтті айналдырып, соңғы әрекетті аудит жасағанша дерекқорды компроматталған деп қараңыз.

  1. Кілтті бірден айналдырыңыз. Supabase бақылау тақтасында Project Settings → API → Service role key → Reset бөліміне өтіңіз. Ескі кілт бірнеше секунд ішінде жарамсыз болады. Кілтті пайдаланатын кез келген сервис жағындағы код айналдыру аяқталғанша жаңартылып, қайта орналастырылуы керек.
  2. Соңғы дерекқор әрекетін аудиттеңіз. Бақылау тақтасында Database → Logs ашыңыз. Соңғы 7 күнге сүзгілеңіз. PII бар кестелерге қарсы әдеттен тыс SELECT * сұрауларын, ірі UPDATE немесе DELETE мәлімдемелерін және белгілі инфрақұрылымыңыздан тыс IP-лерден сұрауларды іздеңіз. Supabase әр сұрауда x-real-ip тақырыбын журналдайды.
  3. Сақтау нысандарын тексеріңіз. Storage → Logs кіріп, соңғы файл жүктеулерін қарап шығыңыз. Ағып кеткен service-role кілті жеке шелектерге де барлығын-айналып-өту қол жеткізуін береді.
  4. Кілтті бастапқы кодты басқарудан жойыңыз. Айналдырудан кейін де JWT-ны git тарихыңызда қалдыру оны жалпыға ортақ репозиторийде табуға болатынын білдіреді. Оны тарихтан тазалау үшін git filter-repo немесе BFG Repo-Cleaner пайдаланыңыз, содан кейін мәжбүрлі итеріңіз (алдымен әріптестерді ескертіңіз).
  5. Түзетуден кейін қайта сканерлеңіз. Қайта орналастырылған қолданбаға қарсы жаңа FixVibe сканерлеуін іске қосыңыз. Bundle-secrets табылған нәтижесі тазалануы керек. Ешбір бөлікте service_role JWT және sb_secret_* жолы қалмағанын растаңыз.

Ағудың алдын алу

Құрылымдық түзету — атау тәртібі және құрал деңгейіндегі қорғаныс шектегіштері:

  • Service кілтіне ешқашан NEXT_PUBLIC_*, VITE_* немесе кез келген басқа бума-кіріктіретін префиксті қоспаңыз. Атау конвенциясы — шекара, оны әр фреймворк құрметтейді.
  • Service кілтін әзірлеуші машинасында .env файлында мүлдем сақтамаңыз. Оны орналастыру кезінде құпиялар менеджерінен (Doppler, Infisical, Vercel шифрланған env айнымалылары) оқыңыз, ешқашан жергілікті фиксацияламаңыз.
  • <strong>Mark every Supabase client construction with explicit context.</strong> Files named <code>supabase/browser.ts</code> use the anon key; files named <code>supabase/server.ts</code> use the service-role key with <code>import 'server-only'</code> at the top. The <code>server-only</code> import causes a build error if a client component tries to consume the module.
  • <strong>Add a pre-commit hook that greps for JWT-shaped strings.</strong> <code>git diff --staged | grep -E 'eyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+'</code> catches both anon and service tokens before they leave your machine.
  • Құрастыру шығысын сканерлейтін CI қақпасын қосыңыз. next build-тен кейін .next/static/chunks/ шығысын service_role жолы үшін іздеңіз. Бірдеңе сәйкес келсе құрастыруды қателендіріңіз.
bash
# Pre-commit hook: refuse any staged JWT-shaped string.
git diff --staged \
  | grep -E 'eyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+' \
  && echo "JWT detected in staged changes — refusing commit" \
  && exit 1

# CI gate: fail the build if "service_role" shipped to the static bundle.
grep -RE 'service_role|sb_secret_' .next/static/chunks/ \
  && echo "Service-role credential leaked into bundle" \
  && exit 1

Жиі қойылатын сұрақтар

Шабуылдаушылар ағып кеткен Supabase service-role кілттерін шын мәнінде қаншалықты тез табады?

Жалпыға ортақ бума сканерлері жаңа орналастыруларды бірнеше минут ішінде сүзеді. Зерттеушілер бірінші орналастырудан бір сағаттан аз уақыт ішінде жаңа Supabase жобаларына қарсы жұмыс істейтін эксплоиттерді құжаттаған. Кез келген service-role ашылуын 60 күндік емес, 60 минуттық терезе ретінде қараңыз.

Кілтті айналдыру жеткілікті ме, әлде деректер шығарылуы туралы ойлауым керек пе?

Айналдыру ағып кеткен кілтті жарамсыз етеді, бірақ бұрыннан тартылған деректерді қайтармайды. Кестелеріңізде PII, төлем деректері немесе кез келген реттелетін деректер болса, GDPR (72 сағат), CCPA немесе HIPAA бойынша хабарлау міндетіңіз болуы мүмкін. Журналдарды аудит жасап, аудит күдікті қол жеткізуді көрсетсе заңды кеңесшіге хабарласыңыз.

Service-role кілті ағып кетсе RLS мені қорғай алады ма?

Жоқ. Жол деңгейіндегі қауіпсіздік service_role талабымен толығымен айналып өтіледі. Бұл — мақсат бойынша — кілт нақты әкімші операциялары үшін RLS-ті өткізіп жіберетін бэкенд кодына мүмкіндік беру үшін бар. Жұмсартушы — кілт шабуылдаушы оны оқи алатын контекстке ешқашан жетпеуін қамтамасыз ету.

Бұл жаңа Supabase жариялау / құпия кілт үлгісіне (<code>sb_publishable_</code> / <code>sb_secret_</code>) қатысты ма?

Иә — бірдей тәуекел класы. sb_secret_* кілті — жаңа жобалар үшін service-role JWT-ні алмастыратын жаңа құпия-кілт пішімі. Бумада sb_secret_* бар кез келген нәрсе ағып кеткен service-role JWT сияқты апатты. FixVibe-тің bundle-secrets анықтаушысы екі пішінді де сәйкестендіреді.

Anon / жариялау кілті туралы — ол бумада қауіпсіз бе?

Иә, мақсат бойынша. Anon кілті браузерде болуға арналған және әр Supabase веб-клиенті оны пайдаланады. Оның қауіпсіздігі толығымен әр жалпыға ортақ кестеде RLS дұрыс конфигурацияланғанына байланысты. Не тексеру керектігі үшін Supabase RLS сканері мақаласын қараңыз.

Келесі қадамдар

Өндіріс URL мекенжайыңызға қарсы FixVibe сканерлеуін іске қосыңыз — bundle-secrets тексеруі тегін, тіркеусіз және service_role ашылуын бір минуттан аз уақытта хабарлайды. Мұны RLS қабатының өз жұмысын орындап жатқанын тексеру үшін Supabase RLS сканері мақаласымен және файлға қол жеткізуді бекіту үшін Supabase сақтау шелегінің қауіпсіздік тізімі мақаласымен жұптаңыз. ИИ құралдары неге осы ағу класын осыншама сенімді түрде шығаратынының фондық ақпараты үшін ИИ кодтау құралдары неге қауіпсіздік олқылықтарын қалдырады мақаласын оқыңыз.

// baas бетіңізді сканерлеңіз

Ашық кестені біреу одан бұрын тапқанша табыңыз.

Өндіріс URL мекенжайын енгізіңіз. FixVibe сіздің қолданбаңыз сөйлесетін BaaS провайдерлерін санайды, олардың жалпыға ортақ соңғы нүктелерінің саусақ ізін алады және аутентификацияланбаған клиент не оқи немесе жаза алатынын хабарлайды. Тегін, орнатусыз, картасыз.

  • Тегін деңгей — айына 3 сканерлеу, тіркелу картасы жоқ.
  • Пассивті BaaS саусақ ізін алу — домен иелігін растау қажет емес.
  • Supabase, Firebase, Clerk, Auth0, Appwrite және басқалары.
  • Әр табылған нәтижеде ИИ түзету шақырулары — Cursor / Claude Code ішіне қайта қойыңыз.
JavaScript-те ашылған Supabase service role кілті: бұл нені білдіреді және оны қалай табуға болады — Docs · FixVibe