FixVibe

// docs / baas security / supabase service role exposure

Ключ сэрвіснай ролі Supabase, раскрыты ў JavaScript: што гэта значыць і як яго знайсці

Ключ сэрвіснай ролі Supabase — гэта галоўны ключ да вашай базы дадзеных. Той, хто яго мае, абыходзіць Бяспеку на ўзроўні радкоў, можа прачытаць кожны слупок кожнай табліцы і можа запісаць або выдаліць усё, што пажадае. Ён прызначаны жыць выключна ў серверным кодзе — ніколі ў браўзеры. Калі ШІ-інструмент кадавання адпраўляе яго ў JavaScript-бандл, ваша база дадзеных, па сутнасці, публічная. Гэты артыкул тлумачыць форму JWT, якая ідэнтыфікуе ўцеклы ключ, тры шаблоны ШІ-інструментаў, якія прыводзяць да ўцечкі, што рабіць у першую гадзіну пасля выяўлення і як аўтаматычна сканаваць гэта раней за карыстальнікаў.

Што такое ключ сэрвіснай ролі

Supabase выдае два розныя ключы для кожнага праекта: ключ anon (таксама званы публікаваным ключом у новых праектах) і ключ service_role. Абодва з'яўляюцца JSON Web Tokens, падпісанымі сакрэтам JWT вашага праекта. Розніца — у патрабаванні role, зашытым у нагрузцы JWT — anon для публічнага ключа, service_role для майстар-ключа. PostgREST, Supabase Storage і Supabase Auth усе пераходзяць у рэжым абыходу ўсяго, калі бачаць патрабаванне service_role.

Раскадзіруйце любы ключ Supabase на jwt.io і паглядзіце на нагрузку. Форма JWT сэрвіснай ролі немагчыма зблытаць:

Раскадзіраваная нагрузка JWT сэрвіснай ролі (паказана ў выглядзе блока з падсветкай сінтаксісу ніжэй).

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

Новыя праекты Supabase выдаюць ключы ў фармаце сакрэтаў з прэфіксам sb_secret_ замест JWT. Паводзіны аднолькавыя — усё, што нясе sb_secret_ у публічным бандле, аднолькава катастрафічна.

Як ШІ-інструменты кадавання раскрываюць ключ сэрвіснай ролі

Мы бачылі тыя ж тры шаблоны ў тысячах vibe-кадаваных праграм. Кожны з іх пачынаецца з таго, што распрацоўшчык просіць дапамогі ў ШІ-інструмента, і заканчваецца тым, што сэрвісны ключ убудоўваецца ў бандл.

Шаблон 1: Адзіны файл .env з прэфіксам NEXT_PUBLIC_

Распрацоўшчык просіць ШІ-інструмент "наладзіць 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: Ключ сэрвіснай ролі жорстка прапісаны ў seed-скрыптах

Распрацоўшчык просіць ШІ-інструмент напісаць скрыпт, які запаўняе базу дадзеных. ШІ жорстка прапісвае ключ сэрвіснай ролі непасрэдна ў файле (а не чытае з асяроддзя), камітуе файл у рэпазіторый, і публічны рэпазіторый GitHub або маршрут /scripts/seed.js разгорнутай праграмы цяпер абслугоўвае ключ.

Як сканаванне бандла FixVibe выяўляе ўцечку

Праверка bundle-secrets ад FixVibe спампоўвае кожны JavaScript-файл, на які спасылаецца разгорнутая праграма — асноўныя чанкі, лаянкі лянівай загрузкі, web workers, service workers — і прапускае іх праз дэтэктар, які раскадзіруе ўсё, што адпавядае форме JWT (eyJ[base64-header].eyJ[base64-payload].[signature]). Калі раскадзіраваная нагрузка змяшчае "role": "service_role", сканаванне паведамляе пра гэта як пра крытычную знаходку з шляхам да файла і дакладным радком, дзе з'яўляецца ключ. Тая ж праверка таксама адпавядае новаму шаблону sb_secret_* па прэфіксе.

Сканаванне ніколі не аўтэнтыфікуецца з выяўленым ключом. Яно ідэнтыфікуе форму і паведамляе пра ўцечку — выкарыстанне ключа для доказу эксплуатаванасці было б несанкцыянаваным доступам да вашай базы дадзеных. Доказ знаходзіцца ў самой нагрузцы JWT.

Выяўлена — што рабіць у першую гадзіну

Уцеклы ключ сэрвіснай ролі — гэта надзвычайная сітуацыя ў часе выканання. Лічыце, што ключ ужо скрабнулі — зламыснікі сочаць за публічнымі бандламі ў рэжыме рэальнага часу. Лічыце базу дадзеных скампраметаванай, пакуль вы не ратавалі ключ і не правялі аўдыт нядаўняй актыўнасці.

  1. Неадкладна ратуйце ключ. У панэлі Supabase перайдзіце ў Project Settings → API → Service role key → Reset. Стары ключ анулюецца за секунды. Любы серверны код, які выкарыстоўвае ключ, павінен быць абноўлены і пераразгорнуты да таго, як ратацыя завершыцца.
  2. Праверце нядаўнюю актыўнасць базы дадзеных. Адкрыйце Database → Logs у панэлі. Адфільтруйце за апошнія 7 дзён. Шукайце незвычайныя запыты SELECT * супраць табліц з PII, вялікія аператары UPDATE або DELETE і запыты з IP-адрасоў па-за вашай вядомай інфраструктурай. Supabase лагуе загаловак x-real-ip на кожным запыце.
  3. Праверце аб'екты сховішча. Наведайце Storage → Logs і праглядзіце нядаўнія загрузкі файлаў. Уцеклы ключ сэрвіснай ролі дае доступ з абыходам усяго таксама да прыватных сховішчаў.
  4. Выдаліце ключ з кантролю крыніц. Нават пасля ратацыі пакіданне JWT у вашай гісторыі git азначае, што яго можна выявіць у публічным рэпазіторыі. Выкарыстоўвайце git filter-repo або BFG Repo-Cleaner, каб ачысціць яго з гісторыі, а затым прымусова push-уйце (папярэдзьце спачатку калабаратараў).
  5. Прасканіруйце паўторна пасля выпраўлення. Запусціце свежае сканаванне FixVibe супраць пераразгорнутай праграмы. Знаходка bundle-secrets павінна знікнуць. Пацвердзіце, што ніякі JWT service_role і ніякі радок sb_secret_* не застаўся ў ніякім чанку.

Прадухіленне ўцечкі ў першую чаргу

Структурнае выпраўленне — дысцыпліна іменавання плюс інструментальныя агароджы:

  • Ніколі не прэфіксуйце сэрвісны ключ NEXT_PUBLIC_*, VITE_* або любым іншым прэфіксам убудавання ў бандл. Канвенцыя іменавання — гэта мяжа — кожны фрэймворк яе паважае.
  • Трымайце сэрвісны ключ цалкам па-за .env на машыне распрацоўшчыка. Чытайце яго з мэнэджара сакрэтаў (Doppler, Infisical, зашыфраваныя пераменныя асяроддзя Vercel) пры разгортванні, ніколі не камітуйце яго лакальна.
  • <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 выкарыстайце grep супраць .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?

Сканеры публічных бандлаў абыходзяць новыя разгортванні за хвіліны. Даследчыкі задакументавалі працоўныя эксплойты супраць новых праектаў Supabase менш чым за гадзіну ад першага разгортвання. Лічыце любое раскрыццё сэрвіснай ролі як 60-хвіліннае акно, а не 60-дзённае.

Ці дастаткова ратацыі ключа, ці я павінен меркаваць эксфільтрацыю дадзеных?

Ратацыя анулюе ўцеклы ключ, але не адмяняе дадзеныя, ужо здабытыя. Калі вашы табліцы змяшчаюць PII, плацежныя дадзеныя або любыя рэгуляваныя дадзеныя, у вас можа быць абавязак паведаміць паводле GDPR (72 гадзіны), CCPA або HIPAA. Праверце логі і параіцеся з юрыстам, калі аўдыт пакажа падазроны доступ.

Ці можа RLS абараніць мяне, калі ключ сэрвіснай ролі ўцячэ?

Не. Бяспека на ўзроўні радкоў цалкам абыходзіцца патрабаваннем service_role. Гэта па задуме — ключ існуе менавіта для таго, каб дазволіць сервернаму коду абысці RLS для адміністрацыйных аперацый. Змякчэнне — пераканацца, што ключ ніколі не дасягае кантэксту, дзе зламыснік можа яго прачытаць.

Ці тычыцца гэта новай мадэлі публікаванага / сакрэтнага ключа Supabase (<code>sb_publishable_</code> / <code>sb_secret_</code>)?

Так — той жа клас рызыкі. Ключ sb_secret_* — гэта новы фармат сакрэтнага ключа, які замяняе JWT сэрвіснай ролі для новых праектаў. Усё, што нясе sb_secret_* у бандле, гэтак жа катастрафічна, як уцеклы JWT сэрвіснай ролі. Дэтэктар bundle-secrets ад FixVibe адпавядае абедзвюм формам.

А як наконт ключа anon / публікаванага — ці бяспечны ён у бандле?

Так, па задуме. Ключ anon прызначаны жыць у браўзеры і з'яўляецца тым, што выкарыстоўвае кожны web-кліент Supabase. Яго бяспека цалкам залежыць ад правільнай канфігурацыі RLS на кожнай публічнай табліцы. Гл. артыкул Сканер Supabase RLS для таго, што трэба праверыць.

Наступныя крокі

Запусціце сканаванне FixVibe супраць вашага прадукцыйнага URL — праверка bundle-secrets бясплатная, без рэгістрацыі і паведамляе пра раскрыццё service_role менш чым за хвіліну. Спалучайце гэта з артыкулам Сканер Supabase RLS, каб праверыць, што пласт RLS выконвае сваю працу, і Кантрольны спіс бяспекі сховішча Supabase, каб заблакаваць доступ да файлаў. Для фону пра тое, чаму ШІ-інструменты так надзейна генеруюць гэты клас уцечак, прачытайце Чаму ШІ-інструменты кадавання пакідаюць прабелы ў бяспецы.

// скануйце вашу baas-паверхню

Знайдзіце адкрытую табліцу раней, чым гэта зробіць хтосьці іншы.

Увядзіце прадукцыйны URL. FixVibe пералічыць пастаўшчыкоў BaaS, з якімі ўзаемадзейнічае ваша праграма, здыме адбіткі з іх публічных канчатковых кропак і паведаміць, што неаўтарызаваны кліент можа прачытаць або запісаць. Бясплатна, без устаноўкі, без карты.

  • Бясплатны тарыф — 3 сканаванні ў месяц, без карты пры рэгістрацыі.
  • Пасіўнае зняцце адбіткаў BaaS — не патрэбна праверка валодання даменам.
  • Supabase, Firebase, Clerk, Auth0, Appwrite і іншыя.
  • Падказкі выпраўлення ШІ для кожнай знаходкі — устаўце назад у Cursor / Claude Code.
Запусціць бясплатнае сканаванне BaaS

рэгістрацыя не патрабуецца

Ключ сэрвіснай ролі Supabase, раскрыты ў JavaScript: што гэта значыць і як яго знайсці — Docs · FixVibe