// docs / baas security / supabase service role exposure
Kľúč servisnej role Supabase odhalený v JavaScripte: čo to znamená a ako ho nájsť
Kľúč servisnej role Supabase je hlavným kľúčom k vašej databáze. Ktokoľvek, kto ho má, obchádza Row-Level Security, môže prečítať každý stĺpec každej tabuľky a môže zapisovať alebo mazať čokoľvek si zvolí. Je navrhnutý tak, aby žil výlučne v kóde na strane servera — nikdy v prehliadači. Keď ho nástroj na kódovanie s AI odošle do JavaScript balíčka, vaša databáza je v podstate verejná. Tento článok vysvetľuje tvar JWT, ktorý identifikuje uniknutý kľúč, tri vzory AI nástrojov, ktoré produkujú únik, čo robiť v prvej hodine po detekcii, a ako to skenovať automaticky skôr, než to urobia používatelia.
Čo je kľúč servisnej role
Supabase vydáva dva odlišné kľúče pre každý projekt: kľúč anon (v novších projektoch sa nazýva aj publishable kľúč) a kľúč service_role. Oba sú JSON Web Tokeny podpísané JWT tajomstvom vášho projektu. Rozdiel je v nároku role zapečenom v JWT payloade — anon pre verejný kľúč, service_role pre hlavný kľúč. PostgREST, Supabase Storage aj Supabase Auth sa všetky prepnú do režimu obchádzania všetkého, keď uvidia nárok service_role.
Dekódujte akýkoľvek Supabase kľúč na jwt.io a pozrite sa na payload. Tvar JWT servisnej role je nezameniteľný:
Dekódovaný payload JWT servisnej role (zobrazený ako blok so zvýrazneným syntaxom nižšie).
{
"iss": "supabase",
"ref": "[project-ref]",
"role": "service_role",
"iat": 1700000000,
"exp": 2000000000
}Novšie projekty Supabase vydávajú kľúče typu secret s predponou sb_secret_ namiesto JWT. Správanie je identické — čokoľvek nesúce sb_secret_ vo verejnom balíčku je rovnako katastrofické.
Ako nástroje na kódovanie s AI nechávajú uniknúť kľúč servisnej role
Naprieč tisíckami vibe-kódovaných aplikácií sme videli rovnaké tri vzory. Každý z nich začína tým, že vývojár žiada AI nástroj o pomoc, a končí tým, že kľúč servisnej role je vložený do balíčka.
Vzor 1: Jediný .env súbor s predponou NEXT_PUBLIC_
Vývojár požiada AI nástroj, aby „nastavil Supabase", a akceptuje jediný .env s oboma kľúčmi. AI nástroj — trénovaný na korpuse, kde je väčšina environment premenných vystavená cez NEXT_PUBLIC_* — pridá predponu NEXT_PUBLIC_ obom. Next.js pri zostavení vloží čokoľvek zodpovedajúce tejto predpone do klientskeho balíčka. Nasadenie na Vercel — a kľúč servisnej role je v main.[hash].js.
Vzor 2: Nesprávny kľúč vo volaní createClient
Vývojár vloží oba kľúče do súboru config.ts, ktorý AI vygenerovalo, a AI omylom naplní volanie createClient() na strane prehliadača hodnotou process.env.SUPABASE_SERVICE_ROLE_KEY. Build premennú vtiahne dovnútra a JWT pristane v balíčku.
Vzor 3: Kľúč servisnej role pevne zapísaný v seed skriptoch
Vývojár požiada AI nástroj, aby napísal skript, ktorý naplní databázu. AI pevne zapíše kľúč servisnej role priamo do súboru (namiesto čítania z prostredia), commitne súbor do repozitára a verejné GitHub repo alebo cesta /scripts/seed.js nasadenej aplikácie teraz poskytuje kľúč.
Ako sken balíčka od FixVibe detekuje únik
Kontrola bundle-secrets od FixVibe stiahne každý JavaScript súbor, na ktorý odkazuje nasadená aplikácia — vstupné chunky, lazy-loaded chunky, web workery, service workery — a prejde ich detektorom, ktorý dekóduje čokoľvek zodpovedajúce tvaru JWT (eyJ[base64-header].eyJ[base64-payload].[signature]). Ak dekódovaný payload obsahuje "role": "service_role", sken to nahlási ako kritický nález s cestou k súboru a presným riadkom, kde sa kľúč nachádza. Tá istá kontrola tiež zhoduje novší vzor sb_secret_* podľa predpony.
Sken sa nikdy neautentizuje pomocou objaveného kľúča. Identifikuje tvar a nahlási únik — použitie kľúča na preukázanie exploitovateľnosti by bol neoprávnený prístup k vašej databáze. Dôkaz je v samotnom JWT payloade.
Detegované — čo robiť v prvej hodine
Uniknutý kľúč servisnej role je behová núdza. Predpokladajte, že kľúč bol zoškrabaný — útočníci monitorujú verejné balíčky v reálnom čase. Považujte databázu za kompromitovanú, kým nerotujete kľúč a neauditujete nedávnu aktivitu.
- Okamžite rotujte kľúč. V Supabase Dashboarde prejdite na Project Settings → API → Service role key → Reset. Starý kľúč je zneplatnený v priebehu sekúnd. Akýkoľvek kód na strane servera používajúci kľúč musí byť aktualizovaný a znova nasadený skôr, než rotácia pristane.
- Auditujte nedávnu aktivitu databázy. Otvorte Database → Logs v dashboarde. Filtrujte na posledných 7 dní. Hľadajte nezvyčajné dopyty
SELECT *proti tabuľkám s PII, veľké príkazyUPDATEaleboDELETEa požiadavky z IP adries mimo vašej známej infraštruktúry. Supabase loguje hlavičkux-real-ipna každej požiadavke. - Skontrolujte storage objekty. Navštívte Storage → Logs a prejdite si nedávne sťahovania súborov. Uniknutý kľúč servisnej role dáva prístup s obchádzaním všetkého aj k privátnym košom.
- Odstráňte kľúč zo systému správy verzií. Aj po rotácii ponechanie JWT vo vašej git histórii znamená, že je objaviteľný vo verejnom repe. Použite
git filter-repoalebo BFG Repo-Cleaner na jeho vymazanie z histórie, potom force-push (najskôr varujte spolupracovníkov). - Naskenujte znova po oprave. Spustite nový sken FixVibe proti znovu nasadenej aplikácii. Nález bundle-secrets by mal zmiznúť. Potvrďte, že žiadny JWT s
service_rolea žiadny reťazecsb_secret_*nezostáva v žiadnom chunku.
Predchádzanie úniku v prvom rade
Štrukturálna oprava je disciplína v pomenovávaní plus zábrany na úrovni nástrojov:
- Nikdy nepridávajte ku kľúču servisnej role predponu
NEXT_PUBLIC_*,VITE_*alebo akúkoľvek inú predponu, ktorá vkladá do balíčka. Konvencia pomenovania je hranicou — rešpektuje ju každý framework. - Držte kľúč servisnej role úplne mimo
.envna vývojárskom stroji. Čítajte ho zo správcu tajomstiev (Doppler, Infisical, šifrované env premenné Vercelu) pri nasadení, nikdy ho lokálne necommitujte. - <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.
- Pridajte CI bránu, ktorá skenuje výstup buildu. Po
next buildgrep výstup.next/static/chunks/na reťazecservice_role. Build nech zlyhá, ak sa čokoľvek zhoduje.
# 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Často kladené otázky
Ako rýchlo útočníci skutočne nájdu uniknuté kľúče servisnej role Supabase?
Skenery verejných balíčkov prečesávajú nové nasadenia v priebehu minút. Výskumníci zdokumentovali funkčné exploity proti novým projektom Supabase za menej než hodinu od prvého nasadenia. Považujte akékoľvek odhalenie servisnej role za 60-minútové okno, nie 60-dňové.
Stačí kľúč rotovať, alebo musím predpokladať exfiltráciu dát?
Rotácia zneplatňuje uniknutý kľúč, ale neodvráti dáta, ktoré už boli stiahnuté. Ak vaše tabuľky obsahujú PII, platobné dáta alebo akékoľvek regulované dáta, môžete mať notifikačnú povinnosť podľa GDPR (72 hodín), CCPA alebo HIPAA. Auditujte logy a poraďte sa s právnym poradcom, ak audit ukáže podozrivý prístup.
Môže ma RLS ochrániť, ak unikne kľúč servisnej role?
Nie. Row-Level Security je úplne obchádzané nárokom service_role. To je zámerné — kľúč existuje práve preto, aby umožnil backendovému kódu preskočiť RLS pre administrátorské operácie. Zmiernenie spočíva v tom, aby sa zaistilo, že kľúč nikdy nedosiahne kontext, kde by ho útočník mohol prečítať.
Vzťahuje sa to na nový model publishable / secret kľúčov Supabase (<code>sb_publishable_</code> / <code>sb_secret_</code>)?
Áno — identická trieda rizika. Kľúč sb_secret_* je nový formát secret kľúča, ktorý v novších projektoch nahrádza JWT servisnej role. Čokoľvek, čo nesie sb_secret_* v balíčku, je rovnako katastrofické ako uniknutý JWT servisnej role. Detektor bundle-secrets od FixVibe zhoduje oba tvary.
A čo anon / publishable kľúč — je v balíčku bezpečný?
Áno, podľa návrhu. Anon kľúč je určený na to, aby žil v prehliadači, a používa ho každý webový klient Supabase. Jeho bezpečnosť závisí výlučne od toho, či je RLS správne nakonfigurované na každej verejnej tabuľke. Pozrite článok Skener Supabase RLS pre to, čo skontrolovať.
Ďalšie kroky
Spustite sken FixVibe proti vašej produkčnej URL — kontrola bundle-secrets je bezplatná, bez registrácie a hlási odhalenie service_role za menej než minútu. Spárujte to s článkom Skener Supabase RLS, aby ste overili, že vrstva RLS robí svoju prácu, a s Kontrolným zoznamom zabezpečenia Supabase Storage, aby ste uzamkli prístup k súborom. Pre kontext o tom, prečo AI nástroje generujú túto triedu únikov tak spoľahlivo, si prečítajte Prečo nástroje na kódovanie s AI zanechávajú bezpečnostné medzery.
