// docs / baas security / supabase service role exposure
Supabase service-role'i võti paljastunud JavaScriptis: mida see tähendab ja kuidas seda leida
Supabase service-role'i võti on sinu andmebaasi peavõti. Selle omanik möödub Row-Level Security'st, suudab lugeda iga tabeli iga veeru ja võib kirjutada või kustutada, mida tahab. See on mõeldud elama eranditult serveripoolses koodis — mitte kunagi brauseris. Kui AI-koodimistööriist saadab selle JavaScripti pakki, on sinu andmebaas tegelikult avalik. See artikkel selgitab JWT-kuju, mis lekkinud võtme tuvastab, kolme AI-tööriista mustrit, mis lekke tekitavad, mida teha esimesel tunnil pärast tuvastamist ja kuidas seda automaatselt skannida enne, kui kasutajad seda teevad.
Mis on service-role'i võti
Supabase väljastab igale projektile kaks erinevat võtit: anon-võti (mida uuemates projektides nimetatakse ka avaldatavaks võtmeks) ja service_role-võti. Mõlemad on JSON Web Tokenid, mis on allkirjastatud sinu projekti JWT-saladusega. Erinevus seisneb JWT kasuliku koormuse sisse küpsetatud role-väites — anon avaliku võtme jaoks, service_role peavõtme jaoks. PostgREST, Supabase Storage ja Supabase Auth lülituvad kõik möödumis-režiimi, kui nad näevad service_role-väidet.
Dekodeeri mis tahes Supabase'i võti aadressil jwt.io ja vaata kasulikku koormust. Service-role'i JWT kuju on eksimatu:
Service-role'i JWT dekodeeritud kasulik koormus (näidatud süntaksiga rõhutatud plokina allpool).
{
"iss": "supabase",
"ref": "[project-ref]",
"role": "service_role",
"iat": 1700000000,
"exp": 2000000000
}Uuemad Supabase-projektid väljastavad secret-tüüpi võtmeid eesliitega sb_secret_ JWT-i asemel. Käitumine on identne — mis tahes sb_secret_-iga avalikus pakis on sama katastroofiline.
Kuidas AI-koodimistööriistad service-role'i võtme lekitavad
Oleme näinud samu kolme mustrit tuhandetes vibe-koodisuse rakendustes. Iga neist algab arendaja palve AI-tööriistalt abi saamise eest ja lõpeb sellega, et service-võti on pakis sisse jätkatud.
Muster 1: Üks .env-fail eesliitega NEXT_PUBLIC_
Arendaja palub AI-tööriistalt "Supabase'i seadistust" ja võtab vastu ühe .env mõlema võtmega. AI-tööriist — koolitatud korpusel, kus enamik keskkonnamuutujaid avaldatakse NEXT_PUBLIC_* kaudu — annab mõlemale eesliite NEXT_PUBLIC_. Next.js jätkab kõik, mis sellele eesliitele vastab, ehitusajal klient-pakki sisse. Avalda Vercelisse ja service-võti on failis main.[hash].js.
Muster 2: Vale võti createClient-kutses
Arendaja kleebib mõlemad võtmed AI genereeritud config.ts-faili ja AI täidab kogemata brauseripoolse createClient()-kutse väärtusega process.env.SUPABASE_SERVICE_ROLE_KEY. Ehitus tõmbab muutuja sisse ja JWT jõuab pakki.
Muster 3: Service-role'i võti on seemne-skriptides kõvasti kodeeritud
Arendaja palub AI-tööriistal kirjutada skripti, mis andmebaasi seemnedab. AI kodeerib service-role'i võtme otse faili (mitte keskkonnast lugedes), kommitib faili repositooriumi ja avalik GitHubi repo või juurutatud rakenduse /scripts/seed.js-rada serveerib nüüd võtit.
Kuidas FixVibe pakiskannimine lekke tuvastab
FixVibe bundle-secrets-kontroll laeb alla iga JavaScripti faili, millele juurutatud rakendus viitab — entry-tükid, lazy-laaditavad tükid, web workerid, service workerid — ja jooksutab need läbi detektori, mis dekodeerib kõike, mis vastab JWT-kujule (eyJ[base64-header].eyJ[base64-payload].[signature]). Kui dekodeeritud kasulik koormus sisaldab "role": "service_role", teatab skannimine sellest kriitilise leiuna koos failiraja ja täpse reaga, kus võti esineb. Sama kontroll vastab ka uuemale sb_secret_*-mustrile eesliite järgi.
Skannimine ei autendi ennast kunagi leitud võtmega. See tuvastab kuju ja teatab lekkest — võtme kasutamine ärakasutatavuse tõestamiseks oleks loata juurdepääs sinu andmebaasile. Tõend on JWT kasulikus koormuses endas.
Tuvastatud — mida teha esimesel tunnil
Lekkinud service-role'i võti on käitusaegne hädaolukord. Eelda, et võti on juba kogutud — ründajad jälgivad avalikke pakke reaalajas. Käsitle andmebaasi kompromiteerituna, kuni oled võtme pööranud ja hiljutise tegevuse auditeerinud.
- Pööra võti kohe. Supabase Dashboardis mine Project Settings → API → Service role key → Reset. Vana võti muutub sekunditega kehtetuks. Iga serveripoolne kood, mis võtit kasutab, tuleb enne pööramise jõustumist uuendada ja uuesti juurutada.
- Auditeeri hiljutist andmebaasitegevust. Ava Dashboardis Database → Logs. Filtreeri viimase 7 päeva järgi. Otsi ebatavalisi
SELECT *-päringuid PII-d sisaldavate tabelite vastu, suuriUPDATE- võiDELETE-lauseid ja päringuid IP-aadressidelt, mis ei kuulu sinu teada infrastruktuuri. Supabase logib iga päringugax-real-ip-päise. - Kontrolli salvestuse objekte. Külasta Storage → Logs ja vaata hiljutisi failide allalaadimisi. Lekkinud service-role'i võti annab möödumis-juurdepääsu ka privaatsetele konteineritele.
- Eemalda võti versioonihalduspuust. Isegi pärast pööramist tähendab JWT-i jätmine giti ajalukku, et see on avalikust repost leitav. Kasuta
git filter-repovõi BFG Repo-Cleanerit, et see ajaloost pühkida, ja siis tee force-push (hoiata enne kaastöölisi). - Skanni uuesti pärast parandust. Käivita uus FixVibe-skannimine uuesti juurutatud rakenduse vastu. Bundle-secrets-leid peaks kaduma. Kinnita, et üheski tükis ei jää ühtegi
service_role-JWT-i egasb_secret_*-stringi.
Lekke vältimine eos
Struktuurne lahendus on nimetamisdistsipliin pluss tööriistataseme kaitseribad:
- Ära kunagi anna service-võtmele eesliidet
NEXT_PUBLIC_*,VITE_*ega ühtegi muud pakki-sissejätkavat eesliidet. Nimetamiskonventsioon on piir — iga raamistik austab seda. - Hoia service-võti arendaja masinas üldse
.env-ist väljas. Loe see juurutusel saladuste haldurist (Doppler, Infisical, Verceli krüpteeritud env-muutujad), ära kunagi kommiti seda kohapeal. - <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.
- Lisa CI-värav, mis skannib ehituse väljundi. Pärast
next build-i grepi.next/static/chunks/-väljundit stringiservice_roleotsides. Lase ehitusel ebaõnnestuda, kui midagi vastab.
# 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 1Korduma kippuvad küsimused
Kui kiiresti leiavad ründajad tegelikult lekkinud Supabase service-role'i võtmeid?
Avalike pakkide skannerid sõeluvad uusi juurutusi minutitega. Teadlased on dokumenteerinud töötavaid ärakasutusi uute Supabase-projektide vastu vähem kui tunni jooksul esimesest juurutusest. Käsitle iga service-role'i paljastust 60-minutilise akna, mitte 60-päevasena.
Kas võtme pööramine on piisav või tuleb eeldada andmete eksfiltreerimist?
Pööramine muudab lekkinud võtme kehtetuks, kuid ei võta tagasi juba välja tõmmatud andmeid. Kui sinu tabelid sisaldavad PII-d, makseandmeid või muid reguleeritud andmeid, võib sul olla teavitamiskohustus GDPR-i (72 tundi), CCPA või HIPAA alusel. Auditeeri logid ja konsulteeri õigusnõustajaga, kui audit näitab kahtlast juurdepääsu.
Kas RLS saab mind kaitsta, kui service-role'i võti lekib?
Ei. Row-Level Security-st minnakse service_role-väitega täielikult mööda. See on sihilik — võti eksisteerib just selleks, et backend-kood saaks administreerimisoperatsioonidel RLS-ist mööda minna. Leevendus seisneb selles, et tagada, et võti ei jõua kunagi konteksti, kus ründaja saab seda lugeda.
Kas see kehtib uuele Supabase avaldatava / salajase võtme mudelile (<code>sb_publishable_</code> / <code>sb_secret_</code>)?
Jah — identne riskiklass. sb_secret_*-võti on uus salaja võtme formaat, mis asendab uuemates projektides service-role'i JWT-i. Mis tahes sb_secret_*-iga pakis on sama katastroofiline kui lekkinud service-role'i JWT. FixVibe bundle-secrets-detektor vastab mõlemale kujule.
Aga anon / avaldatav võti — kas see on pakis turvaline?
Jah, sihilikult. Anon-võti on mõeldud brauseris elama ja seda kasutavad kõik Supabase'i veebikliendid. Selle turvalisus sõltub täielikult sellest, et RLS oleks igal avalikul tabelil õigesti seadistatud. Vaata artiklit Supabase RLS-skanner selle kohta, mida kontrollida.
Järgmised sammud
Käivita FixVibe-skannimine oma tootmise URL-i vastu — bundle-secrets-kontroll on tasuta, registreerimist pole vaja ja teatab service_role-paljastusest vähem kui minuti jooksul. Ühenda see artikliga Supabase RLS-skanner, et kontrollida, kas RLS-kiht oma tööd teeb, ja artikliga Supabase salvestuskonteinerite turvalisuse kontrollnimekiri, et failidele juurdepääs lukku panna. Tausta saamiseks, miks AI-tööriistad seda lekkeklassi nii usaldusväärselt tekitavad, loe Miks AI-koodimistööriistad jätavad turvaaugud.
