// docs / baas security / firebase rules scanner
Firebase rules scanner: βρες ανοιχτούς κανόνες σε Firestore, Realtime Database και Storage
Οι εφαρμογές Firebase αποτυγχάνουν σε θέματα ασφάλειας με έναν συνεπή τρόπο: κανόνες <code>allow read, write: if true;</code> που έχουν απομείνει από το test-mode quickstart, χωρίς να αντικατασταθούν ποτέ πριν την παραγωγή. Τα εργαλεία κωδικοποίησης με ΤΝ παράγουν αυτούς τους κανόνες αυτολεξεί από τα παραδείγματα της τεκμηρίωσης και σπάνια προτρέπουν τον προγραμματιστή να τους θωρακίσει. Αυτό το άρθρο δείχνει πώς ένας Firebase rules scanner ανιχνεύει ανοιχτούς κανόνες σε Firestore, Realtime Database και Cloud Storage από έξω από το project — και πώς να διορθώσεις αυτό που βρίσκει.
Πώς ο scanner βρίσκει ανοιχτούς κανόνες Firebase
Οι υπηρεσίες Firebase εκθέτουν γνωστές, προβλέψιμες μορφές URL. Ένας scanner χωρίς credentials μπορεί να διερευνήσει κάθε μία και να παρατηρήσει εάν οι ανώνυμες αναγνώσεις πετυχαίνουν. Ο έλεγχος baas.firebase-rules του FixVibe τρέχει σε τρεις ανεξάρτητες διερευνήσεις — μία ανά υπηρεσία 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 διερευνά το
https://[project-id]-default-rtdb.firebaseio.com/.json. Εάν η ρίζα είναι αναγνώσιμη ανώνυμα, η απάντηση είναι ολόκληρο το δέντρο της βάσης δεδομένων ως JSON. Μια πιο συντηρητική δοκιμή ερωτά το.json?shallow=true, που επιστρέφει μόνο τα κλειδιά ανώτατου επιπέδου — εύρημα και στις δύο περιπτώσεις. - Cloud Storage. Ο scanner ερωτά το
https://firebasestorage.googleapis.com/v0/b/[project-id].appspot.com/o. Εάν η απάντηση παραθέτει ονόματα αρχείων χωρίς authentication, το bucket είναι ανώνυμα απαριθμήσιμο. Το απαριθμήσιμο storage είναι εύρημα ακόμα και όταν τα downloads μεμονωμένων αρχείων αρνούνται — οι επιτιθέμενοι απαριθμούν το bucket για να βρουν μαντεύσιμα ονόματα αρχείων.
Πώς πραγματικά μοιάζει το footgun του test-mode
Η τεκμηρίωση quickstart του Firebase περιλαμβάνει ένα από τα πιο αντιγραμμένα μπλοκ κανόνων στο διαδίκτυο:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}
}
}Παλαιότερα το Firebase πρόσθετε αυτόματη λήξη 30 ημερών σε αυτούς τους κανόνες. Αυτό άλλαξε: σήμερα οι κανόνες παραμένουν για πάντα εκτός αν ο προγραμματιστής τους αντικαταστήσει. Τα εργαλεία κωδικοποίησης με ΤΝ — έχοντας εκπαιδευτεί σε χρόνια τεκμηρίωσης που περιλαμβάνει το μπλοκ test-mode — συχνά το εκπέμπουν αυτολεξεί και λένε στον προγραμματιστή «αυτός είναι ο κανόνας ασφαλείας σου». Δεν είναι.
Άλλες παραλλαγές που εμφανίζονται στην παραγωγή αλλά είναι εξίσου ανεκτικές:
// 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;
- Μια παραλλαγή με μελλοντικό timestamp: ένας κανόνας που επιτρέπει τα πάντα μέχρι μια ημερομηνία πολύ στο μέλλον. Δεν λήγει ποτέ ουσιαστικά (δες το επισημασμένο μπλοκ παραπάνω).
allow read: if true; allow write: if request.auth != null;— δημόσιες αναγνώσεις, οποιοσδήποτε πιστοποιημένος χρήστης μπορεί να γράφει.allow read, write: if request.auth != null;— οποιοσδήποτε συνδεδεμένος χρήστης μπορεί να διαβάσει ή να γράψει οποιοδήποτε document, συμπεριλαμβανομένων των δεδομένων άλλων χρηστών.
Τι να κάνεις όταν ο scanner βρίσκει έναν ανοιχτό κανόνα
Οι ανοιχτοί κανόνες Firebase είναι έκτακτη ανάγκη runtime. Η διόρθωση έχει την ίδια μορφή και στις τρεις υπηρεσίες: εστίασε κάθε κανόνα στο request.auth.uid εναντίον ενός ρητού πεδίου ιδιοκτήτη. Κάθε υπηρεσία έχει τη δική της σύνταξη κανόνων:
Firestore
match /users/{userId} { allow read, write: if request.auth != null && request.auth.uid == userId; }. Η δέσμευση τμήματος διαδρομής {userId} γίνεται το μόνο document που μπορεί να αγγίξει ο χρήστης.
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; } } }. Σύμβαση: αποθήκευσε αρχεία κάτω από users/[uid]/[filename] και άσε τη διαδρομή να επιβάλει την ιδιοκτησία.
service firebase.storage {
match /b/{bucket}/o {
match /users/{userId}/{allPaths=**} {
allow read, write: if request.auth.uid == userId;
}
}
}Κάνε deploy τους κανόνες μέσω του Firebase CLI: firebase deploy --only firestore:rules, firebase deploy --only database, firebase deploy --only storage. Επαλήθευσε ότι οι νέοι κανόνες είναι στην παραγωγή ξανατρέχοντας τη σάρωση FixVibe — το εύρημα baas.firebase-rules θα πρέπει να εξαφανιστεί.
firebase deploy --only firestore:rules
firebase deploy --only database
firebase deploy --only storageΠώς συγκρίνεται αυτό με τα ενσωματωμένα εργαλεία του Firebase
Η Firebase Console σου δείχνει τους τρέχοντες κανόνες αλλά δεν τους ελέγχει εναντίον της συμπεριφοράς runtime. Ο Firebase Rules simulator σου επιτρέπει να δοκιμάσεις τη λογική κανόνων εναντίον συνθετικών αιτημάτων — χρήσιμο αλλά τοπικό. Κανένα από τα δύο εργαλεία δεν σου λέει τι πραγματικά επιστρέφουν οι κανόνες παραγωγής σου σε έναν ανώνυμο επιτιθέμενο στο δημόσιο διαδίκτυο. Ένας εξωτερικός scanner όπως το FixVibe (ή το Burp Suite με χειροκίνητη ρύθμιση) είναι το μόνο πράγμα που διερευνά από την ίδια γωνία που θα διερευνούσε ένας επιτιθέμενος. Το ίδιο το App Check της Google μετριάζει την κατάχρηση αλλά δεν υποκαθιστά τους σωστά εστιασμένους κανόνες.
Συχνές ερωτήσεις
Διαβάζει ή τροποποιεί ο scanner τα δεδομένα Firestore μου;
Οι παθητικές σαρώσεις εκδίδουν το πολύ μία ανώνυμη ανάγνωση ανά υπηρεσία για να επιβεβαιώσουν εάν οι κανόνες την επιτρέπουν. Ο scanner καταγράφει τη μορφή της απάντησης και την παρουσία δεδομένων — δεν κάνει pagination, δεν απαριθμεί documents και δεν γράφει. Οι διερευνήσεις εγγραφής είναι φραγμένες πίσω από επαληθευμένη ιδιοκτησία τομέα και δεν τρέχουν ποτέ εναντίον μη επαληθευμένων στόχων.
Τι γίνεται εάν το Firebase project μου χρησιμοποιεί App Check;
Το App Check απορρίπτει μη πιστοποιημένα αιτήματα με 403. Ένας scanner χωρίς token App Check θα δει 403 σε κάθε διερεύνηση — που είναι το σωστό αποτέλεσμα. Το App Check δεν υποκαθιστά την ορθότητα κανόνων (ένα κλεμμένο token App Check μαζί με ανοιχτό κανόνα εξακολουθεί να διαρρέει δεδομένα), αλλά μπλοκάρει ευκαιριακές εξωτερικές σαρώσεις.
Μπορεί ο scanner να εντοπίσει μερικές εσφαλμένες ρυθμίσεις κανόνων (ανάγνωση ανοιχτή, εγγραφή κλειστή);
Ναι — κάθε κανόνας (allow read, allow write) διερευνάται ξεχωριστά. Μια διερεύνηση μόνο ανάγνωσης που πετυχαίνει με 200 OK αναφέρει εύρημα ανοιχτής ανάγνωσης ακόμα και αν οι εγγραφές αρνούνται. Τα δύο ευρήματα είναι διακριτά: η εκπομπή δεδομένων και η χειραγώγηση δεδομένων είναι ξεχωριστοί κίνδυνοι.
Λειτουργεί αυτό για εφαρμογές Firebase που έχουν γίνει deploy σε προσαρμοσμένο τομέα;
Ναι. Ο scanner εξάγει το Firebase project ID από το deployed bundle, όχι από τον τομέα. Οι προσαρμοσμένοι τομείς, τα subdomain app.web.app και οι εφαρμογές Firebase που φιλοξενούνται μόνες τους λειτουργούν όλα με τον ίδιο τρόπο εφόσον το JavaScript bundle είναι προσβάσιμο.
Επόμενα βήματα
Τρέξε μια δωρεάν σάρωση FixVibe εναντίον του URL παραγωγής σου — ο έλεγχος baas.firebase-rules είναι σε κάθε πλάνο και επισημαίνει ανοιχτούς κανόνες σε Firestore, Realtime Database και Cloud Storage. Για βαθύτερη επεξήγηση σχετικά με το μοτίβο allow read, write: if true ειδικά, δες Εξήγηση του Firebase allow read, write: if true. Για τη συνολική εικόνα σε Supabase, Firebase, Clerk και Auth0, διάβασε Scanner εσφαλμένων ρυθμίσεων BaaS.
