// docs / baas security / supabase service role exposure
JavaScript'te ifşa olan Supabase service role anahtarı: ne anlama geldiği ve nasıl bulunacağı
Supabase service role anahtarı veritabanınızın ana anahtarıdır. Onu elinde tutan herkes Row-Level Security'yi atlar, her tablonun her sütununu okuyabilir ve seçtiği her şeyi yazabilir veya silebilir. Yalnızca sunucu tarafı kodda yaşaması için tasarlanmıştır — asla tarayıcıda değil. Bir yapay zeka kodlama aracı onu JavaScript paketine gönderdiğinde, veritabanınız aslında halka açıktır. Bu makale, sızdırılmış bir anahtarı tanımlayan JWT şeklini, sızıntıyı üreten üç yapay zeka aracı desenini, tespit sonrası ilk saatte ne yapılacağını ve kullanıcılar yapmadan önce otomatik olarak nasıl taranacağını açıklar.
Service role anahtarı nedir
Supabase her proje için iki farklı anahtar verir: anon anahtarı (daha yeni projelerde yayınlanabilir anahtar olarak da adlandırılır) ve service_role anahtarı. İkisi de projenizin JWT secret'ı ile imzalanmış JSON Web Token'lardır. Fark, JWT yüküne gömülmüş role claim'idir — public anahtar için anon, ana anahtar için service_role. PostgREST, Supabase Storage ve Supabase Auth, service_role claim'ini gördüklerinde her şeyi atlama moduna geçer.
Herhangi bir Supabase anahtarını jwt.io'da çözün ve yüke bakın. Bir service-role JWT'sinin şekli açıkça tanınabilir:
Bir service-role JWT'sinin çözülmüş yükü (aşağıda sözdizimi vurgulu bir blok olarak gösterilmiştir).
{
"iss": "supabase",
"ref": "[project-ref]",
"role": "service_role",
"iat": 1700000000,
"exp": 2000000000
}Daha yeni Supabase projeleri, JWT yerine sb_secret_ önekiyle gizli anahtar tarzı anahtarlar verir. Davranış aynıdır — public bir pakette sb_secret_ taşıyan herhangi bir şey eşit derecede felakettir.
Yapay zeka kodlama araçları service role anahtarını nasıl sızdırır
Binlerce vibe-coded uygulamada aynı üç deseni gördük. Her biri bir geliştiricinin yapay zeka aracından yardım istemesiyle başlar ve service anahtarının bir pakete satır içi alınmasıyla biter.
Desen 1: NEXT_PUBLIC_ önekli tek bir .env dosyası
Geliştirici yapay zeka aracına "Supabase'i kur" der ve her iki anahtarı içeren tek bir .env kabul eder. Çoğu ortam değişkeninin NEXT_PUBLIC_* üzerinden ifşa edildiği bir derlem üzerinde eğitilmiş yapay zeka aracı — her ikisini de NEXT_PUBLIC_ ile öneklendirir. Next.js bu önekle eşleşen her şeyi build zamanında istemci paketine satır içi alır. Vercel'e gönderin ve service anahtarı main.[hash].js içindedir.
Desen 2: createClient çağrısında yanlış anahtar
Geliştirici her iki anahtarı da yapay zekanın oluşturduğu bir config.ts dosyasına yapıştırır ve yapay zeka, tarayıcı tarafı createClient() çağrısını yanlışlıkla process.env.SUPABASE_SERVICE_ROLE_KEY ile doldurur. Build değişkeni çeker ve JWT pakete iner.
Desen 3: Seed scriptlerinde sabit kodlanmış service-role anahtarı
Geliştirici yapay zeka aracından veritabanını seed eden bir script yazmasını ister. Yapay zeka service-role anahtarını doğrudan dosyaya sabit kodlar (ortamdan okumak yerine), dosyayı repoya commit eder ve public GitHub repo'su veya dağıtılmış uygulamanın /scripts/seed.js rotası artık anahtarı sunar.
FixVibe paket taraması sızıntıyı nasıl tespit eder
FixVibe'ın bundle-secrets kontrolü, dağıtılmış uygulama tarafından referans verilen her JavaScript dosyasını indirir — giriş parçaları, lazy yüklenen parçalar, web worker'lar, service worker'lar — ve bunları JWT şekline (eyJ[base64-header].eyJ[base64-payload].[signature]) uyan her şeyi çözen bir dedektörden geçirir. Çözülmüş yük "role": "service_role" içeriyorsa, tarama dosya yolu ve anahtarın göründüğü tam satırla birlikte bunu kritik bir bulgu olarak raporlar. Aynı kontrol önek bazlı olarak yeni sb_secret_* desenini de eşleştirir.
Tarama keşfedilen anahtarla asla kimlik doğrulamaz. Şekli tanımlar ve sızıntıyı raporlar — sömürülebilirliği kanıtlamak için anahtarı kullanmak veritabanınıza yetkisiz erişim olur. Kanıt JWT yükünün kendisindedir.
Tespit edildi — ilk saatte ne yapmalı
Sızdırılan bir service role anahtarı bir çalışma zamanı acil durumudur. Anahtarın kazındığını varsayın — saldırganlar public paketleri gerçek zamanlı izler. Anahtarı döndürene ve son aktiviteyi denetleyene kadar veritabanını ele geçirilmiş olarak değerlendirin.
- Anahtarı hemen döndürün. Supabase Dashboard'da Project Settings → API → Service role key → Reset'e gidin. Eski anahtar saniyeler içinde geçersizleştirilir. Anahtarı kullanan herhangi bir sunucu tarafı kod, rotasyon inmeden önce güncellenip yeniden dağıtılmalıdır.
- Son veritabanı aktivitesini denetleyin. Dashboard'da Database → Logs'u açın. Son 7 güne filtreleyin. PII içeren tablolara karşı olağandışı
SELECT *sorgularına, büyükUPDATEveyaDELETEifadelerine ve bilinen altyapınızın dışındaki IP'lerden gelen isteklere bakın. Supabase her isteğex-real-ipbaşlığını loglar. - Storage nesnelerini kontrol edin. Storage → Logs'u ziyaret edin ve son dosya indirmelerini gözden geçirin. Sızdırılan bir service-role anahtarı, private kovalara da her şeyi atlama erişimi verir.
- Anahtarı sürüm kontrolünden kaldırın. Rotasyondan sonra bile JWT'yi git geçmişinizde bırakmak, public repo'da keşfedilebilir olduğu anlamına gelir. Geçmişten silmek için
git filter-repoveya BFG Repo-Cleaner kullanın, sonra force-push yapın (önce işbirlikçileri uyarın). - Düzeltmeden sonra yeniden tarayın. Yeniden dağıtılan uygulamaya karşı yeni bir FixVibe taraması çalıştırın. Bundle-secrets bulgusu temizlenmiş olmalı. Hiçbir parçada
service_roleJWT'sinin ve hiçbirsb_secret_*dizesinin kalmadığını teyit edin.
Sızıntıyı en başında önlemek
Yapısal düzeltme adlandırma disiplini artı araç düzeyinde önlemlerdir:
- Service anahtarını asla
NEXT_PUBLIC_*,VITE_*veya pakete satır içi alma yapan başka bir önekle öneklendirmeyin. Adlandırma kuralı sınırdır — her framework buna saygı duyar. - Service anahtarını geliştirici makinesinde
.enviçinden tamamen uzak tutun. Onu dağıtımda bir secret manager'dan (Doppler, Infisical, Vercel şifrelenmiş env vars) okuyun, yerel olarak asla commit etmeyin. - <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 çıktısını tarayan bir CI kapısı ekleyin.
next build'den sonra.next/static/chunks/çıktısınıservice_roledizesi için grep'leyin. Herhangi bir şey eşleşirse build'i başarısız yapın.
# 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 1Sık sorulan sorular
Saldırganlar sızdırılan Supabase service-role anahtarlarını ne kadar hızlı buluyor?
Public-bundle tarayıcıları yeni dağıtımları dakikalar içinde tarar. Araştırmacılar, ilk dağıtımdan bir saatten kısa sürede yeni Supabase projelerine karşı çalışan exploit'leri belgeledi. Herhangi bir service-role ifşasını 60 günlük değil, 60 dakikalık bir pencere olarak değerlendirin.
Anahtarı döndürmek yeterli mi yoksa veri sızdırıldığını varsaymalı mıyım?
Rotasyon sızdırılan anahtarı geçersiz kılar ama zaten çekilmiş veriyi geri almaz. Tablolarınız PII, ödeme verileri veya herhangi bir düzenlemeye tabi veri içeriyorsa, GDPR (72 saat), CCPA veya HIPAA kapsamında bildirim yükümlülüğünüz olabilir. Logları denetleyin ve denetim şüpheli erişimi gösteriyorsa hukuki danışmanlığa başvurun.
Service-role anahtarı sızarsa RLS beni koruyabilir mi?
Hayır. Row-Level Security, service_role claim'i tarafından tamamen atlanır. Bu tasarım gereğidir — anahtar tam olarak backend kodunun yönetim işlemleri için RLS'i atlayabilmesi amacıyla vardır. Hafifletme, anahtarın bir saldırganın okuyabileceği bir bağlama asla ulaşmamasını sağlamaktır.
Bu yeni Supabase yayınlanabilir / gizli anahtar modeli (<code>sb_publishable_</code> / <code>sb_secret_</code>) için geçerli mi?
Evet — aynı risk sınıfı. sb_secret_* anahtarı, daha yeni projeler için service-role JWT'sinin yerini alan yeni gizli anahtar formatıdır. Bir pakette sb_secret_* taşıyan herhangi bir şey, sızdırılmış bir service-role JWT kadar felakettir. FixVibe'ın bundle-secrets dedektörü her iki şekli de eşleştirir.
Peki ya anon / yayınlanabilir anahtar — bu pakette güvenli mi?
Evet, tasarım gereği. Anon anahtarı tarayıcıda yaşamak için tasarlanmıştır ve her Supabase web istemcisinin kullandığı şeydir. Güvenliği tamamen RLS'in her public tabloda doğru yapılandırılmasına bağlıdır. Ne kontrol etmeniz gerektiği için Supabase RLS tarayıcısı makalesine bakın.
Sonraki adımlar
Üretim URL'nize karşı bir FixVibe taraması çalıştırın — bundle-secrets kontrolü ücretsizdir, kayıt gerekmez ve service_role ifşasını bir dakikadan kısa sürede raporlar. Bunu RLS katmanının işini yapıp yapmadığını doğrulamak için Supabase RLS tarayıcısı makalesiyle ve dosya erişimini kilitlemek için Supabase storage bucket güvenlik kontrol listesi ile eşleştirin. Yapay zeka araçlarının bu sızıntı sınıfını neden bu kadar güvenilir şekilde ürettiğine dair arka plan için Yapay zeka kodlama araçları neden güvenlik açıkları bırakır bölümünü okuyun.
