// docs / baas security / firebase rules scanner
Firebase reeglite skanner: leia avatud Firestore, Realtime Database ja Storage reeglid
Firebase'i rakendused ebaõnnestuvad turvalisuses ühel järjekindlal viisil: <code>allow read, write: if true;</code>-reeglid, mis jäid test-mode'i pikkstart'ist alles, mida tootmise eel ei asendatud. AI-koodimistööriistad genereerivad need reeglid sõnasõnalt dokumentatsiooninäidetest ja harva julgustavad arendajat neid kõvastama. See artikkel näitab, kuidas Firebase reeglite skanner tuvastab avatud reegleid Firestore, Realtime Database ja Cloud Storage'i jaoks projekti väljast — ja kuidas leitut parandada.
Kuidas skanner avatud Firebase reegleid leiab
Firebase teenused avaldavad teadaolevaid, ennustatavaid URL-kujusid. Ilma mandaatideta skanner saab igaühte sondeerida ja jälgida, kas anonüümsed lugemised õnnestuvad. FixVibe kontroll baas.firebase-rules käivitatakse kolme sõltumatu sondina — üks Firebase teenuse kohta:
- <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. Skanner sondeerib
https://[project-id]-default-rtdb.firebaseio.com/.json. Kui juur on anonüümselt loetav, on vastus kogu andmebaasipuu JSON-ina. Konservatiivsem test pärib.json?shallow=true, mis tagastab ainult ülataseme võtmed — kummalgi juhul on tegemist leiuga. - Cloud Storage. Skanner pärib
https://firebasestorage.googleapis.com/v0/b/[project-id].appspot.com/o. Kui vastus loetleb failinimesid ilma autentimiseta, on konteiner anonüümselt loendatav. Loendatav salvestus on leid isegi siis, kui üksikute failide allalaadimised keelatakse — ründajad loendavad konteineri, et leida äraarvatavaid failinimesid.
Kuidas test-mode'i jalga-tulistamine tegelikult välja näeb
Firebase'i pikkstartdokumentatsioon sisaldab ühte interneti enim kopeeritud reeglite plokki:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}
}
}Firebase lisas varem nendele reeglitele automaatse 30-päevase aegumise. See muutus: täna püsivad reeglid igavesti, kui arendaja neid ei asenda. AI-koodimistööriistad — koolitatud aastate dokumentatsioonil, mis sisaldab test-mode'i plokki — väljastavad selle sageli sõnasõnalt ja ütlevad arendajale "see on sinu turvareegel". See pole.
Muud variandid, mis tootmises esinevad, kuid on sama lubavad:
// 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;
- Tulevikuajatempli variant: reegel, mis lubab kõike kaugesse tulevikku ulatuvale kuupäevale. Ei aegu kunagi tõhusalt (vt esiletõstetud plokki ülal).
allow read: if true; allow write: if request.auth != null;— avalikud lugemised, iga autenditud kasutaja saab kirjutada.allow read, write: if request.auth != null;— iga sissekirjutanud kasutaja saab lugeda või kirjutada mis tahes dokumenti, sealhulgas teiste kasutajate andmeid.
Mida teha, kui skanner avatud reegli leiab
Avatud Firebase reeglid on käitusaegne hädaolukord. Parandus on samakujuline kõikides kolmes teenuses: piira iga reegel request.auth.uid-iga selgesõnalise omaniku välja vastu. Igal teenusel on oma reeglisüntaks:
Firestore
match /users/{userId} { allow read, write: if request.auth != null && request.auth.uid == userId; }. Rajasegmendi sidumine {userId} saab ainsaks dokumendiks, mida kasutaja saab puudutada.
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; } } }. Konventsioon: salvesta failid raja users/[uid]/[filename] alla ja lase rajal omandit jõustada.
service firebase.storage {
match /b/{bucket}/o {
match /users/{userId}/{allPaths=**} {
allow read, write: if request.auth.uid == userId;
}
}
}Juuruta reegleid Firebase CLI kaudu: firebase deploy --only firestore:rules, firebase deploy --only database, firebase deploy --only storage. Kinnita, et uued reeglid on tootmises, käivitades FixVibe-skannimise uuesti — leid baas.firebase-rules peaks kaduma.
firebase deploy --only firestore:rules
firebase deploy --only database
firebase deploy --only storageKuidas see võrdleb Firebase'i sisseehitatud tööriistadega
Firebase Console näitab sulle praegusi reegleid, kuid ei auditeeri neid käitusaegse käitumise suhtes. Firebase Rules simulaator laseb sul testida reeglite loogikat sünteetilise päringute vastu — kasulik, kuid kohalik. Kumbki tööriist ei ütle sulle, mida sinu tootmisreeglid tegelikult tagastavad anonüümsele ründajale avalikus internetis. Väline skanner nagu FixVibe (või Burp Suite käsitsi seadistamisega) on ainus, mis sondeerib samast nurgast, kust ründaja seda teeks. Google'i enda App Check leevendab väärkasutust, kuid ei asenda õigesti piiratud reegleid.
Korduma kippuvad küsimused
Kas skanner loeb või muudab minu Firestore andmeid?
Passiivsed skannimised saadavad teenuse kohta maksimaalselt ühe anonüümse lugemise, et kinnitada, kas reeglid seda lubavad. Skanner salvestab vastuse kuju ja andmete olemasolu — see ei lehekülganda, ei loenda dokumente ega kirjuta. Kirjutamissondid on piiratud kinnitatud domeeniomandi taha ja neid ei käivitata kunagi kinnitamata sihtmärkide vastu.
Mis siis, kui minu Firebase projekt kasutab App Check'i?
App Check lükkab autentimata päringud tagasi 403-ga. Skanner ilma App Check'i tokenita näeb igal sondil 403-i — mis on õige tulemus. App Check ei asenda reeglite õigsust (varastatud App Check'i token koos avatud reegliga lekib ikkagi andmeid), kuid see blokeerib oportunistlikud välised skannimised.
Kas skanner suudab tuvastada osalisi reegli väärseadistusi (lugemine avatud, kirjutamine suletud)?
Jah — iga reegel (allow read, allow write) sondeeritakse eraldi. Lugemissond, mis õnnestub 200 OK-iga, teatab avatud-lugemise leiust isegi siis, kui kirjutamised on keelatud. Kaks leidu on eraldi: andmete eksfiltreerimine ja andmete manipuleerimine on eraldi riskid.
Kas see töötab Firebase'i rakenduste puhul, mis on juurutatud kohandatud domeenil?
Jah. Skanner eraldab Firebase'i projekti ID juurutatud pakist, mitte domeenist. Kohandatud domeenid, app.web.app-alamdomeenid ja iseseismaktitud Firebase'i rakendused töötavad kõik samamoodi, kuni JavaScripti pakk on kättesaadav.
Järgmised sammud
Käivita tasuta FixVibe-skannimine oma tootmise URL-i vastu — kontroll baas.firebase-rules tarnitakse igas plaanis ja märgib avatud reegleid Firestores, Realtime Database'is ja Cloud Storage'is. Sügavama selgituse jaoks mustri allow read, write: if true kohta vaata Firebase allow read, write: if true selgitatud. Üldpildi saamiseks Supabase, Firebase, Clerk ja Auth0 üle, loe BaaS väärseadistuse skanner.
