FixVibe

// docs / baas security / supabase service role exposure

JavaScript-এ Supabase service role key উন্মোচিত: এর অর্থ কী এবং এটি কীভাবে খুঁজে পাবেন

Supabase service role key আপনার database-এর master key। যে কেউ এটি ধারণ করে সে Row-Level Security bypass করে, প্রতিটি table-এর প্রতিটি column পড়তে পারে, এবং যা ইচ্ছা লিখতে বা delete করতে পারে। এটি একচেটিয়াভাবে server-side code-এ থাকার জন্য ডিজাইন করা — কখনোই browser-এ নয়। যখন একটি AI কোডিং টুল এটি JavaScript bundle-এ ship করে, তখন আপনার database, কার্যত, public। এই প্রবন্ধটি JWT shape যা একটি leaked key সনাক্ত করে, leak তৈরি করে এমন তিনটি AI-tool patterns, detection-এর প্রথম ঘণ্টায় কী করতে হবে, এবং ব্যবহারকারীদের আগে স্বয়ংক্রিয়ভাবে কীভাবে এটি scan করবেন তা ব্যাখ্যা করে।

Service role key কী

Supabase প্রতিটি project-এর জন্য দুটি স্বতন্ত্র keys issue করে: anon key (নতুন projects-এ publishable key বলেও পরিচিত) এবং service_role key। উভয়ই আপনার project-এর JWT secret দ্বারা signed JSON Web Tokens। পার্থক্য হল JWT payload-এ bake করা role claim — public key-এর জন্য anon, master key-এর জন্য service_role। PostgREST, Supabase Storage, এবং Supabase Auth সব service_role claim দেখলে bypass-everything mode-এ চলে যায়।

যেকোনো Supabase key jwt.io-তে decode করুন এবং payload দেখুন। একটি service-role JWT-এর আকার স্পষ্ট:

একটি service-role JWT-এর decoded payload (নিচে একটি syntax-highlighted block হিসাবে দেখানো হয়েছে)।

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

নতুন Supabase projects JWT-এর পরিবর্তে sb_secret_ prefix সহ secret-style keys issue করে। আচরণ অভিন্ন — একটি public bundle-এ sb_secret_ বহন করা যেকোনো কিছু সমানভাবে বিপর্যয়কর।

AI কোডিং টুলগুলি কীভাবে service role key leak করে

আমরা হাজার হাজার vibe-coded অ্যাপে একই তিনটি pattern দেখেছি। প্রতিটি শুরু হয় একজন developer-এর একটি AI টুল থেকে সাহায্য চাওয়া দিয়ে এবং একটি bundle-এ service key inline হওয়ার মাধ্যমে শেষ হয়।

Pattern 1: NEXT_PUBLIC_ prefix সহ একটি একক .env file

Developer AI টুলকে "Supabase setup করো" বলে এবং উভয় keys সহ একটি একক .env গ্রহণ করে। AI টুল — এমন একটি corpus-এ প্রশিক্ষিত যেখানে অধিকাংশ environment variables NEXT_PUBLIC_* দিয়ে exposed — উভয়কে NEXT_PUBLIC_ দিয়ে prefix করে। Next.js build time-এ সেই prefix-এর সাথে মেলে এমন যেকোনো কিছু client bundle-এ inline করে। Vercel-এ ship করুন, এবং service key main.[hash].js-এ আছে।

Pattern 2: createClient call-এ ভুল key

Developer উভয় keys AI-এর generate করা একটি config.ts file-এ paste করে, এবং AI ভুল করে browser-side createClient() call-কে process.env.SUPABASE_SERVICE_ROLE_KEY দিয়ে populate করে। Build variable টানে, এবং JWT bundle-এ চলে আসে।

Pattern 3: Seed scripts-এ hardcoded service-role key

Developer AI টুলকে database seed করে এমন একটি script লিখতে বলে। AI service-role key-কে সরাসরি file-এ hardcode করে (environment থেকে পড়ার পরিবর্তে), file-কে repository-তে commit করে, এবং public GitHub repo বা deployed অ্যাপের /scripts/seed.js route এখন key serve করছে।

FixVibe bundle scan কীভাবে leak detect করে

FixVibe-এর bundle-secrets check deployed অ্যাপ দ্বারা referenced প্রতিটি JavaScript file download করে — entry chunks, lazy-loaded chunks, web workers, service workers — এবং সেগুলিকে একটি detector-এর মধ্য দিয়ে চালায় যা JWT shape (eyJ[base64-header].eyJ[base64-payload].[signature])-এর সাথে মেলে এমন যেকোনো কিছু decode করে। যদি decoded payload-এ "role": "service_role" থাকে, তাহলে scan এটি file path এবং key কোথায় প্রদর্শিত হয় সেই সঠিক line সহ একটি critical finding হিসাবে রিপোর্ট করে। একই check prefix দ্বারা নতুন sb_secret_* pattern-ও match করে।

Scan কখনো আবিষ্কৃত key দিয়ে authenticate করে না। এটি shape সনাক্ত করে এবং leak রিপোর্ট করে — exploitability প্রমাণ করতে key ব্যবহার করা আপনার database-এ unauthorised access হবে। প্রমাণ JWT payload-এ নিজেই আছে।

Detected — প্রথম ঘণ্টায় কী করবেন

একটি leaked service role key একটি runtime emergency। ধরে নিন key scrape হয়ে গেছে — আক্রমণকারীরা real time-এ public bundles monitor করে। যতক্ষণ আপনি key rotate করেন এবং সাম্প্রতিক activity audit করেন ততক্ষণ database-কে compromised হিসাবে বিবেচনা করুন।

  1. Key অবিলম্বে rotate করুন। Supabase Dashboard-এ, Project Settings → API → Service role key → Reset-এ যান। পুরানো key সেকেন্ডের মধ্যে invalidated হয়। Key ব্যবহার করা যেকোনো service-side কোড rotation আসার আগে update এবং redeploy হতে হবে।
  2. সাম্প্রতিক database activity audit করুন। Dashboard-এ Database → Logs খুলুন। গত 7 দিনে filter করুন। PII সহ tables-এর বিরুদ্ধে অস্বাভাবিক SELECT * queries, বড় UPDATE বা DELETE statements, এবং আপনার পরিচিত infrastructure-এর বাইরে IPs থেকে requests খুঁজুন। Supabase প্রতিটি request-এ x-real-ip header log করে।
  3. Storage objects check করুন। Storage → Logs-এ যান এবং সাম্প্রতিক file downloads পর্যালোচনা করুন। একটি leaked service-role key private buckets-এও bypass-everything access দেয়।
  4. Source control থেকে key সরান। Rotation-এর পরেও, JWT-কে আপনার git history-তে রেখে দেওয়ার অর্থ এটি public repo-তে আবিষ্কার্য। History থেকে এটি scrub করতে git filter-repo বা BFG Repo-Cleaner ব্যবহার করুন, তারপর force-push করুন (প্রথমে collaborators-দের সতর্ক করুন)।
  5. Fix-এর পরে আবার scan করুন। Redeployed অ্যাপের বিরুদ্ধে একটি fresh FixVibe scan চালান। Bundle-secrets finding clear হওয়া উচিত। Confirm করুন যে কোনো chunk-এ কোনো service_role JWT এবং কোনো sb_secret_* string অবশিষ্ট নেই।

প্রথম স্থানে leak প্রতিরোধ করা

Structural fix হল নামকরণ শৃঙ্খলা এবং tool-level guardrails:

  • Service key কে কখনোই NEXT_PUBLIC_*, VITE_*, বা অন্য কোনো bundle-inlining prefix দিয়ে prefix করবেন না। Naming convention হল সীমানা — প্রতিটি framework এটিকে সম্মান করে।
  • Developer machine-এ .env থেকে service key সম্পূর্ণভাবে বাইরে রাখুন। Deploy-এ এটি একটি secret manager (Doppler, Infisical, Vercel encrypted env vars) থেকে পড়ুন, এটি কখনো locally commit করবেন না।
  • <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.
  • Build output scan করে এমন একটি CI gate যোগ করুন। next build-এর পরে, .next/static/chunks/ output-এ service_role string-এর জন্য grep করুন। যদি কিছু মেলে তাহলে build fail করুন।
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

প্রায়শই জিজ্ঞাসিত প্রশ্ন

আক্রমণকারীরা leaked Supabase service-role keys কত দ্রুত খুঁজে পায়?

Public-bundle scanners মিনিটের মধ্যে নতুন deployments trawl করে। গবেষকরা প্রথম deploy থেকে এক ঘণ্টার কম সময়ে নতুন Supabase projects-এর বিরুদ্ধে working exploits নথিভুক্ত করেছেন। যেকোনো service-role exposure-কে 60-মিনিট window হিসাবে বিবেচনা করুন, 60-দিন নয়।

key rotate করা কি যথেষ্ট, নাকি আমাকে data exfiltration ধরে নিতে হবে?

Rotation leaked key invalidate করে কিন্তু ইতিমধ্যে টানা ডেটা undo করে না। যদি আপনার tables-এ PII, payment data, বা কোনো regulated data থাকে, তাহলে আপনার GDPR (72 ঘণ্টা), CCPA, বা HIPAA-এর অধীনে notification obligation থাকতে পারে। Logs audit করুন এবং যদি audit সন্দেহজনক access দেখায় তাহলে legal counsel-এর পরামর্শ নিন।

service-role key leak হলে RLS কি আমাকে রক্ষা করতে পারে?

না। Row-Level Security service_role claim দ্বারা সম্পূর্ণভাবে bypass হয়। এটি design অনুসারে — key ঠিক এই কারণেই বিদ্যমান যাতে backend কোড admin operations-এর জন্য RLS skip করতে পারে। Mitigation হল key যাতে কখনো এমন একটি context-এ না পৌঁছায় যেখানে একজন আক্রমণকারী এটি পড়তে পারে তা নিশ্চিত করা।

এটি কি নতুন Supabase publishable / secret key model (<code>sb_publishable_</code> / <code>sb_secret_</code>)-এ প্রযোজ্য?

হ্যাঁ — অভিন্ন risk class। sb_secret_* key হল নতুন secret-key format যা নতুন projects-এর জন্য service-role JWT-কে প্রতিস্থাপন করে। একটি bundle-এ sb_secret_* বহন করা যেকোনো কিছু একটি leaked service-role JWT-এর মতোই বিপর্যয়কর। FixVibe-এর bundle-secrets detector উভয় shapes match করে।

anon / publishable key সম্পর্কে কী — এটি কি bundle-এ নিরাপদ?

হ্যাঁ, design অনুসারে। Anon key-কে browser-এ থাকার জন্য design করা হয়েছে এবং এটি প্রতিটি Supabase web client যা ব্যবহার করে। এর নিরাপত্তা সম্পূর্ণভাবে প্রতিটি public table-এ সঠিকভাবে configured RLS-এর উপর নির্ভর করে। কী check করতে হবে তার জন্য Supabase RLS scanner প্রবন্ধ দেখুন।

পরবর্তী পদক্ষেপ

আপনার production URL-এর বিরুদ্ধে একটি FixVibe scan চালান — bundle-secrets check ফ্রি, কোনো signup নয়, এবং এক মিনিটের কম সময়ে service_role exposure রিপোর্ট করে। RLS layer তার কাজ করছে তা যাচাই করতে এটি Supabase RLS scanner প্রবন্ধের সাথে যুক্ত করুন, এবং file access lock করতে Supabase storage bucket security checklist। AI টুলগুলি কেন এই leak class এত নির্ভরযোগ্যভাবে তৈরি করে তার পটভূমির জন্য, AI কোডিং টুলগুলি কেন security gaps ছেড়ে দেয় পড়ুন।

// আপনার baas পৃষ্ঠ scan করুন

অন্য কেউ আগে খুঁজে পাওয়ার আগে খোলা table খুঁজে বের করুন।

একটি প্রোডাকশন URL দিন। FixVibe আপনার অ্যাপ যে BaaS providers-এর সাথে কথা বলে সেগুলি গণনা করে, তাদের public endpoints-এর fingerprint নেয়, এবং রিপোর্ট করে যে একটি unauthenticated client কী পড়তে বা লিখতে পারে। ফ্রি, কোনো install নেই, কোনো কার্ড নেই।

  • ফ্রি tier — 3 scans / মাস, signup-এর জন্য কার্ড নেই।
  • Passive BaaS fingerprinting — domain verification প্রয়োজন নেই।
  • Supabase, Firebase, Clerk, Auth0, Appwrite, এবং আরও অনেক।
  • প্রতিটি finding-এ AI fix prompts — Cursor / Claude Code-এ paste করুন।
একটি ফ্রি BaaS scan চালান

signup প্রয়োজন নেই

JavaScript-এ Supabase service role key উন্মোচিত: এর অর্থ কী এবং এটি কীভাবে খুঁজে পাবেন — Docs · FixVibe