FixVibe

// docs / baas security / supabase service role exposure

Supabase service-role ključ izpostavljen v JavaScriptu: kaj pomeni in kako ga najti

Supabase service-role ključ je glavni ključ do vaše baze podatkov. Vsakdo, ki ga ima, obide varnost na ravni vrstic, lahko prebere vsak stolpec vsake tabele in zapiše ali izbriše, kar koli želi. Zasnovan je, da živi izključno v strežniški kodi — nikoli v brskalniku. Ko ga UI-orodje izda v JavaScript-snop, je vaša baza podatkov dejansko javna. Ta članek pojasnjuje obliko JWT, ki identificira odtekel ključ, tri vzorce UI-orodij, ki povzročijo odtekanje, kaj storiti v prvi uri po zaznavi in kako ga samodejno skenirati, preden to storijo uporabniki.

Kaj je service-role ključ

Supabase izda dva različna ključa za vsak projekt: ključ anon (v novejših projektih imenovan tudi objavljivi ključ) in ključ service_role. Oba sta žetona JSON Web Token, podpisana s skrivnostjo JWT vašega projekta. Razlika je v zahtevku role, vpečenem v vsebino JWT — anon za javni ključ, service_role za glavni ključ. PostgREST, Supabase Storage in Supabase Auth vsi preklopijo v način obhoda vsega, ko vidijo zahtevek service_role.

Dešifrirajte poljuben Supabase-ključ na jwt.io in si oglejte vsebino. Oblika service-role JWT-ja je nezgrešljiva:

Dešifrirana vsebina service-role JWT (spodaj prikazana kot označen blok).

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

Novejši Supabase-projekti izdajajo skrivnostne ključe s predpono sb_secret_ namesto JWT. Vedenje je enako — vse, kar nosi sb_secret_ v javnem snopu, je enako katastrofalno.

Kako UI-orodja za kodiranje odlivajo service-role ključ

V tisočih vibe-coded aplikacijah smo videli iste tri vzorce. Vsak se začne s tem, da razvijalec UI-orodje prosi za pomoč, in konča s tem, da je service-key vključen v snop.

Vzorec 1: Ena datoteka .env s predpono NEXT_PUBLIC_

Razvijalec UI-orodje prosi, naj „postavi Supabase" in sprejme eno samo .env z obema ključema. UI-orodje — naučeno na korpusu, kjer je večina okoljskih spremenljivk izpostavljenih prek NEXT_PUBLIC_* — oba opremi s predpono NEXT_PUBLIC_. Next.js v času gradnje vse, kar ustreza tej predponi, vključi v odjemalski snop. Izdaja v Vercel, in service-key je v main.[hash].js.

Vzorec 2: Napačen ključ v klicu createClient

Razvijalec oba ključa prilepi v datoteko config.ts, ki jo je generiral UI, in UI v klic createClient() na strani brskalnika pomotoma vstavi process.env.SUPABASE_SERVICE_ROLE_KEY. Gradnja spremenljivko potegne noter in JWT konča v snopu.

Vzorec 3: Service-role ključ trdo kodiran v sejalnih skriptah

Razvijalec UI-orodje prosi, naj napiše skripto, ki napolni bazo podatkov. UI service-role ključ trdo kodira neposredno v datoteko (namesto branja iz okolja), datoteko zaveže v repozitorij, in javni GitHub-repozitorij ali pot /scripts/seed.js izdane aplikacije sedaj streže ključ.

Kako FixVibov pregled snopa zazna odtekanje

FixVibov pregled bundle-secrets prenese vsako JavaScript-datoteko, na katero se sklicuje izdana aplikacija — vstopne kose, lenivo nalagane kose, web-worker, service-worker — in jih spusti skozi detektor, ki dešifrira vse, kar ustreza obliki JWT (eyJ[base64-header].eyJ[base64-payload].[signature]). Če dešifrirana vsebina vsebuje "role": "service_role", pregled to sporoči kot kritično najdbo s potjo datoteke in natančno vrstico, kjer se ključ pojavi. Isti pregled prek predpone ujame tudi novejši vzorec sb_secret_*.

Pregled se z najdenim ključem nikoli ne avtenticira. Prepozna obliko in sporoči odtekanje — uporaba ključa za dokazovanje izkoristljivosti bi bila nepooblaščen dostop do vaše baze podatkov. Dokaz je v sami vsebini JWT.

Zaznano — kaj storiti v prvi uri

Odtekel service-role ključ je izvajalna nuja. Predpostavite, da je bil ključ že pobran — napadalci spremljajo javne snope v realnem času. Bazo obravnavajte kot kompromitirano, dokler ključa ne zavrtite in ne pregledate nedavne dejavnosti.

  1. Takoj zavrtite ključ. V nadzorni plošči Supabase pojdite na Project Settings → API → Service role key → Reset. Star ključ je razveljavljen v nekaj sekundah. Vsaka strežniška koda, ki uporablja ključ, mora biti posodobljena in znova izdana pred rotacijo.
  2. Preglejte nedavno dejavnost baze podatkov. Odprite Database → Logs v nadzorni plošči. Filtrirajte zadnjih 7 dni. Iščite nenavadne poizvedbe SELECT * proti tabelam s PII, velike izjave UPDATE ali DELETE in zahteve z IP-jev zunaj vaše znane infrastrukture. Supabase pri vsaki zahtevi zapiše glavo x-real-ip.
  3. Preverite objekte shrambe. Obiščite Storage → Logs in preglejte nedavne prenose datotek. Odtekel service-role ključ daje dostop „obhod vsega" tudi do zasebnih veder.
  4. Odstranite ključ iz nadzora različic. Tudi po rotaciji JWT-ja v zgodovini Gita pomeni, da je odkrit v javnem repozitoriju. Uporabite git filter-repo ali BFG Repo-Cleaner, da ga zbrišete iz zgodovine, nato izvedite force-push (najprej opozorite sodelavce).
  5. Ponovno skenirajte po popravku. Zaženite svež FixVibe-pregled proti znova izdani aplikaciji. Najdba bundle-secrets bi morala izginiti. Potrdite, da v nobenem kosu ne ostane noben service_role JWT in noben niz sb_secret_*.

Preprečevanje odtekanja v izhodišču

Strukturni popravek je disciplina poimenovanja plus varovala na ravni orodij:

  • Service-key nikoli ne opremite s predpono NEXT_PUBLIC_*, VITE_* ali katero koli drugo predpono, ki ga vključi v snop. Konvencija poimenovanja je meja — vsako ogrodje jo upošteva.
  • Service-key na razvojnem stroju popolnoma izpustite iz .env. Pri uvedbi ga preberite iz upravitelja skrivnosti (Doppler, Infisical, šifrirane okoljske spremenljivke Vercel), nikoli ga lokalno ne zavežite.
  • <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.
  • Dodajte vrata CI, ki pregledajo izhod gradnje. Po next build v izhodu .next/static/chunks/ poiščite niz service_role. Če se kaj ujema, gradnjo zavrnite.
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

Pogosto zastavljena vprašanja

Kako hitro napadalci dejansko najdejo odtekle Supabase service-role ključe?

Skenerji javnih snopov nove uvedbe brskajo v nekaj minutah. Raziskovalci so dokumentirali delujoče izkoristke proti novim Supabase-projektom v manj kot eni uri od prve izdaje. Vsako razkritje service-role obravnavajte kot 60-minutno okno, ne 60-dnevno.

Ali zadošča rotacija ključa, ali moram predpostaviti odtekanje podatkov?

Rotacija razveljavi odtekel ključ, vendar ne razveljavi že potegnjenih podatkov. Če vaše tabele vsebujejo PII, plačilne podatke ali kakšne regulirane podatke, imate morda dolžnost obveščanja po GDPR (72 ur), CCPA ali HIPAA. Preglejte dnevnike in se posvetujte s pravnim svetovalcem, če pregled pokaže sumljiv dostop.

Ali me RLS lahko zaščiti, če odteče service-role ključ?

Ne. Varnost na ravni vrstic v celoti obide zahtevek service_role. Tako je zasnovano — ključ obstaja prav zato, da strežniški kodi omogoči preskok RLS za skrbniške operacije. Blažitev je v tem, da poskrbite, da ključ nikoli ne pride v kontekst, kjer ga lahko prebere napadalec.

Ali to velja za novi Supabase-model objavljivih / skrivnostnih ključev (<code>sb_publishable_</code> / <code>sb_secret_</code>)?

Da — enak razred tveganja. Ključ sb_secret_* je novi format skrivnostnega ključa, ki za novejše projekte nadomešča service-role JWT. Karkoli, kar nosi sb_secret_* v snopu, je enako katastrofalno kot odtekel service-role JWT. FixVibov detektor bundle-secrets ujame obe obliki.

Kaj pa anon- / objavljivi ključ — je ta v snopu varen?

Da, po zasnovi. Anon-ključ je namenjen brskalniku in ga uporablja vsak Supabase-spletni odjemalec. Njegova varnost je v celoti odvisna od pravilne nastavitve RLS na vsaki javni tabeli. Glejte članek Skener Supabase RLS za to, kaj je treba preveriti.

Naslednji koraki

Zaženite FixVibe-pregled proti svojemu produkcijskemu URL-ju — pregled bundle-secrets je brezplačen, brez prijave in sporoči razkritje service_role v manj kot minuti. To združite s člankom Skener Supabase RLS, da preverite, da plast RLS opravlja svoje delo, in s Kontrolnim seznamom za varnost vedra Supabase Storage, da zaklenete dostop do datotek. Za ozadje, zakaj UI-orodja tako zanesljivo generirajo to vrsto odtekanja, preberite Zakaj UI-orodja za kodiranje puščajo varnostne vrzeli.

// preglejte svojo baas-površino

Najdite odprto tabelo, preden jo kdo drug.

Vnesite produkcijski URL. FixVibe ugotovi, s katerimi BaaS-ponudniki vaša aplikacija govori, prepozna njihove javne končne točke in poroča, kaj lahko nepristni odjemalec prebere ali zapiše. Brezplačno, brez namestitve, brez kartice.

  • Brezplačni paket — 3 skeniranja na mesec, brez kartice ob prijavi.
  • Pasivno prstno odtisovanje BaaS — preverjanje lastništva domene ni potrebno.
  • Supabase, Firebase, Clerk, Auth0, Appwrite in več.
  • Pozivi za UI-popravke pri vsakem najdenem problemu — prilepite nazaj v Cursor / Claude Code.
Supabase service-role ključ izpostavljen v JavaScriptu: kaj pomeni in kako ga najti — Docs · FixVibe