// docs / baas security / firebase rules scanner
Scanner aturan Firebase: temukan aturan Firestore, Realtime Database, dan Storage yang terbuka
Aplikasi Firebase gagal dalam keamanan dengan satu cara yang konsisten: aturan <code>allow read, write: if true;</code> yang tersisa dari quickstart mode test, tidak pernah diganti sebelum produksi. AI coding tools menghasilkan aturan-aturan ini verbatim dari contoh dokumentasi dan jarang meminta pengembang untuk mengeraskannya. Artikel ini menunjukkan bagaimana scanner aturan Firebase mendeteksi aturan terbuka di Firestore, Realtime Database, dan Cloud Storage dari luar proyek โ dan cara memperbaiki apa yang ditemukannya.
Bagaimana scanner menemukan aturan Firebase yang terbuka
Layanan Firebase mengekspos bentuk URL yang terkenal dan dapat diprediksi. Scanner tanpa kredensial dapat menyondir setiap dari mereka dan mengamati apakah baca anonim berhasil. Check baas.firebase-rules FixVibe berjalan dalam tiga sondir independen โ satu per layanan Firebase:
- <strong>Firestore.</strong> The scanner extracts the project ID from the deployed app's bundle (it's in <code>firebase.initializeApp({ projectId: ... })</code>), then issues <code>GET https://firestore.googleapis.com/v1/projects/[project-id]/databases/(default)/documents/[collection]:listDocuments</code> against common collection names. A <code>200 OK</code> with documents in the response means <code>allow read</code> is permissive.
- Realtime Database. Scanner menyondir
https://[project-id]-default-rtdb.firebaseio.com/.json. Jika root dapat dibaca secara anonim, response adalah seluruh pohon database sebagai JSON. Uji yang lebih konservatif men-query.json?shallow=true, yang mengembalikan kunci tingkat atas saja โ tetap merupakan temuan dengan cara mana pun. - Cloud Storage. Scanner men-query
https://firebasestorage.googleapis.com/v0/b/[project-id].appspot.com/o. Jika response menampilkan daftar nama file tanpa autentikasi, bucket dapat di-list anonim. Storage yang dapat di-list adalah temuan bahkan ketika unduhan file individu ditolak โ penyerang mengenumerasi bucket untuk menemukan nama file yang dapat ditebak.
Seperti apa footgun mode test sebenarnya
Dokumentasi quickstart Firebase mencakup salah satu blok aturan yang paling banyak disalin di internet:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}
}
}Firebase dulu menambahkan kadaluarsa otomatis 30 hari pada aturan-aturan ini. Itu berubah: hari ini aturan persisten selamanya kecuali pengembang menggantinya. AI coding tools โ terlatih pada tahun-tahun dokumentasi yang mencakup blok mode test โ sering mengeluarkannya secara verbatim dan memberitahu pengembang "ini adalah aturan keamanan Anda." Itu bukan.
Varian lain yang muncul dalam produksi tetapi sama permisifnya:
// future-date variant โ equivalent to "if true" allow read, write: if request.time < timestamp.date(2099, 1, 1); // authenticated-user variant โ any signed-in user reads and writes anything allow read: if true; allow write: if request.auth != null; // any-auth variant โ any signed-in user owns every document allow read, write: if request.auth != null;
- Varian dengan timestamp masa depan: aturan yang mengizinkan semuanya sampai tanggal yang jauh di masa depan. Tidak pernah benar-benar kadaluarsa (lihat blok yang disorot di atas).
allow read: if true; allow write: if request.auth != null;โ baca publik, setiap user terautentikasi dapat menulis.allow read, write: if request.auth != null;โ setiap user yang masuk dapat membaca atau menulis dokumen apa pun, termasuk data user lain.
Apa yang harus dilakukan ketika scanner menemukan aturan terbuka
Aturan Firebase yang terbuka adalah keadaan darurat runtime. Perbaikannya berbentuk sama di ketiga layanan: batasi setiap aturan ke request.auth.uid terhadap field pemilik eksplisit. Setiap layanan memiliki sintaks aturannya sendiri:
Firestore
match /users/{userId} { allow read, write: if request.auth != null && request.auth.uid == userId; }. Pengikatan segmen path {userId} menjadi satu-satunya dokumen yang dapat disentuh user.
match /users/{userId} {
allow read, write: if request.auth != null
&& request.auth.uid == userId;
}Realtime Database
<code>{ "rules": { "users": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid" } } } }</code>. The <code>$uid</code> wildcard captures the path segment for comparison.
{
"rules": {
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
}
}Cloud Storage
service firebase.storage { match /b/{bucket}/o { match /users/{userId}/{allPaths=**} { allow read, write: if request.auth.uid == userId; } } }. Konvensi: simpan file di bawah users/[uid]/[filename] dan biarkan path menegakkan kepemilikan.
service firebase.storage {
match /b/{bucket}/o {
match /users/{userId}/{allPaths=**} {
allow read, write: if request.auth.uid == userId;
}
}
}Deploy aturan via Firebase CLI: firebase deploy --only firestore:rules, firebase deploy --only database, firebase deploy --only storage. Verifikasi aturan baru ada di produksi dengan menjalankan kembali scan FixVibe โ temuan baas.firebase-rules seharusnya hilang.
firebase deploy --only firestore:rules
firebase deploy --only database
firebase deploy --only storageBagaimana ini dibandingkan dengan tool bawaan Firebase
Firebase Console menunjukkan aturan saat ini tetapi tidak mengaudit terhadap perilaku runtime. Simulator Firebase Rules memungkinkan Anda menguji logika aturan terhadap request sintetis โ berguna tapi lokal. Tidak ada tool yang memberi tahu Anda apa yang sebenarnya dikembalikan aturan produksi Anda kepada penyerang anonim di internet publik. Scanner eksternal seperti FixVibe (atau Burp Suite dengan konfigurasi manual) adalah satu-satunya yang menyondir dari sudut yang sama dengan penyerang. App Check milik Google sendiri memitigasi penyalahgunaan tetapi tidak menggantikan aturan yang dibatasi dengan benar.
Pertanyaan yang sering diajukan
Apakah scanner membaca atau memodifikasi data Firestore saya?
Scan pasif mengeluarkan paling banyak satu baca anonim per layanan untuk mengonfirmasi apakah aturan mengizinkannya. Scanner mencatat bentuk response dan keberadaan data โ ia tidak melakukan paginasi, tidak mengenumerasi dokumen, dan tidak menulis. Sondir tulis diperketat di balik verifikasi kepemilikan domain dan tidak pernah berjalan terhadap target yang belum diverifikasi.
Bagaimana jika proyek Firebase saya menggunakan App Check?
App Check menolak request yang tidak terautentikasi dengan 403. Scanner tanpa token App Check akan melihat 403 pada setiap sondir โ yang merupakan hasil yang benar. App Check bukan pengganti untuk kebenaran aturan (token App Check yang dicuri ditambah aturan terbuka tetap membocorkan data), tetapi ia memblokir scan eksternal oportunistik.
Dapatkah scanner mendeteksi miskonfigurasi aturan parsial (baca terbuka, tulis tertutup)?
Ya โ setiap aturan (allow read, allow write) disondir secara terpisah. Sondir hanya-baca yang berhasil dengan 200 OK melaporkan temuan baca-terbuka bahkan jika tulis ditolak. Kedua temuan berbeda: eksfiltrasi data dan manipulasi data adalah risiko terpisah.
Apakah ini bekerja untuk aplikasi Firebase yang di-deploy di bawah domain kustom?
Ya. Scanner mengekstrak project ID Firebase dari bundle yang ter-deploy, bukan dari domain. Domain kustom, subdomain app.web.app, dan aplikasi Firebase self-hosted semuanya bekerja dengan cara yang sama selama bundle JavaScript dapat dijangkau.
Langkah berikutnya
Jalankan scan FixVibe gratis terhadap URL produksi Anda โ check baas.firebase-rules dikirim di setiap paket dan menandai aturan terbuka di Firestore, Realtime Database, dan Cloud Storage. Untuk penjelasan lebih dalam tentang pola allow read, write: if true secara spesifik, lihat Firebase allow read, write: if true dijelaskan. Untuk tinjauan menyeluruh lintas Supabase, Firebase, Clerk, dan Auth0, baca Scanner miskonfigurasi BaaS.
