FixVibe

// 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).

json
{
  "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.

  1. 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.
  2. Auditeeri hiljutist andmebaasitegevust. Ava Dashboardis Database → Logs. Filtreeri viimase 7 päeva järgi. Otsi ebatavalisi SELECT *-päringuid PII-d sisaldavate tabelite vastu, suuri UPDATE- või DELETE-lauseid ja päringuid IP-aadressidelt, mis ei kuulu sinu teada infrastruktuuri. Supabase logib iga päringuga x-real-ip-päise.
  3. 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.
  4. 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-repo või BFG Repo-Cleanerit, et see ajaloost pühkida, ja siis tee force-push (hoiata enne kaastöölisi).
  5. 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 ega sb_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 stringi service_role otsides. Lase ehitusel ebaõnnestuda, kui midagi vastab.
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

Korduma 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.

// skanni oma baas-pinda

Leia avatud tabel enne, kui keegi teine seda teeb.

Anna ette tootmise URL. FixVibe loendab BaaS-pakkujad, kellega sinu rakendus suhtleb, võtab nende avalikest otspunktidest sõrmejäljed ja teatab, mida autentimata klient lugeda või kirjutada saab. Tasuta, paigaldust ei vaja, kaarti ei vaja.

  • Tasuta tase — 3 skannimist kuus, registreerimiseks kaarti ei vaja.
  • Passiivne BaaS-sõrmejäljevõtmine — domeeni kinnitamist ei vaja.
  • Supabase, Firebase, Clerk, Auth0, Appwrite ja palju muud.
  • AI-paranduskäskluse leid igale leiule — kleebi tagasi Cursor / Claude Code'i.
Käivita tasuta BaaS-skannimine

registreerimist ei nõuta

Supabase service-role'i võti paljastunud JavaScriptis: mida see tähendab ja kuidas seda leida — Docs · FixVibe