FixVibe

// docs / baas security / firebase rules scanner

Scanner di regole Firebase: trova regole aperte in Firestore, Realtime Database e Storage

Le app Firebase falliscono in sicurezza in un modo coerente: regole <code>allow read, write: if true;</code> rimaste dal quickstart in test-mode, mai sostituite prima della produzione. Gli strumenti di codifica IA generano queste regole letteralmente dagli esempi della documentazione e raramente sollecitano lo sviluppatore a indurirle. Questo articolo mostra come uno scanner di regole Firebase rileva regole aperte attraverso Firestore, Realtime Database e Cloud Storage da fuori del progetto — e come correggere ciò che trova.

Come lo scanner trova regole Firebase aperte

I servizi Firebase espongono forme di URL ben note e prevedibili. Uno scanner senza credenziali può sondare ciascuno e osservare se le letture anonime hanno successo. Il check baas.firebase-rules di FixVibe esegue tre sondaggi indipendenti — uno per servizio 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. Lo scanner sonda https://[project-id]-default-rtdb.firebaseio.com/.json. Se la radice è leggibile anonimamente, la risposta è l'intero albero del database come JSON. Un test più conservativo interroga .json?shallow=true, che restituisce solo le chiavi top-level — un risultato in entrambi i casi.
  • Cloud Storage. Lo scanner interroga https://firebasestorage.googleapis.com/v0/b/[project-id].appspot.com/o. Se la risposta elenca nomi di file senza autenticazione, il bucket è elencabile anonimamente. Storage elencabile è un risultato anche quando i singoli download di file sono negati — gli attaccanti enumerano il bucket per trovare nomi di file indovinabili.

Come appare davvero il footgun del test-mode

La documentazione di quickstart di Firebase include uno dei blocchi di regole più copiati di Internet:

firebase
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

Firebase aggiungeva una scadenza automatica di 30 giorni a queste regole. Questo è cambiato: oggi le regole persistono per sempre a meno che lo sviluppatore non le sostituisca. Gli strumenti di codifica IA — addestrati su anni di documentazione che include il blocco test-mode — lo emettono spesso letteralmente e dicono allo sviluppatore "questa è la tua regola di sicurezza". Non lo è.

Altre varianti che compaiono in produzione ma sono ugualmente permissive:

firebase
// 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;
  • Una variante con timestamp futuro: una regola che permette tutto fino a una data lontana nel futuro. Non scade mai effettivamente (vedi il blocco evidenziato sopra).
  • allow read: if true; allow write: if request.auth != null; — letture pubbliche, qualsiasi utente autenticato può scrivere.
  • allow read, write: if request.auth != null; — qualsiasi utente loggato può leggere o scrivere qualsiasi documento, inclusi dati di altri utenti.

Cosa fare quando lo scanner trova una regola aperta

Le regole aperte di Firebase sono un'emergenza in produzione. La correzione ha la stessa forma in tutti e tre i servizi: limita ogni regola a request.auth.uid contro un campo proprietario esplicito. Ogni servizio ha la sua sintassi di regole:

Firestore

match /users/{userId} { allow read, write: if request.auth != null && request.auth.uid == userId; }. Il binding del segmento di percorso {userId} diventa l'unico documento che l'utente può toccare.

firebase
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.

json
{
  "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; } } }. Convenzione: memorizza i file sotto users/[uid]/[filename] e lascia che il percorso imponga la proprietà.

firebase
service firebase.storage {
  match /b/{bucket}/o {
    match /users/{userId}/{allPaths=**} {
      allow read, write: if request.auth.uid == userId;
    }
  }
}

Deploya le regole via la CLI Firebase: firebase deploy --only firestore:rules, firebase deploy --only database, firebase deploy --only storage. Verifica che le nuove regole siano in produzione rieseguendo la scansione FixVibe — il risultato baas.firebase-rules dovrebbe scomparire.

bash
firebase deploy --only firestore:rules
firebase deploy --only database
firebase deploy --only storage

Come si confronta con gli strumenti integrati di Firebase

La Firebase Console ti mostra le regole correnti ma non le audita contro il comportamento runtime. Il simulatore di regole Firebase ti permette di testare la logica delle regole contro richieste sintetiche — utile ma locale. Nessuno dei due strumenti ti dice cosa le tue regole di produzione restituiscono effettivamente a un attaccante anonimo su Internet pubblico. Uno scanner esterno come FixVibe (o Burp Suite con configurazione manuale) è l'unica cosa che sonda dallo stesso angolo di un attaccante. L<em>App Check</em> di Google mitiga labuso ma non sostituisce regole correttamente limitate.

Domande frequenti

Lo scanner legge o modifica i miei dati Firestore?

Le scansioni passive emettono al massimo una lettura anonima per servizio per confermare se le regole la permettono. Lo scanner registra la forma della risposta e la presenza di dati — non pagina, non enumera documenti e non scrive. I sondaggi di scrittura sono soggetti a verifica della proprietà del dominio e non vengono mai eseguiti contro target non verificati.

Cosa succede se il mio progetto Firebase usa App Check?

App Check rifiuta le richieste non autenticate con un 403. Uno scanner senza token App Check vedrà 403 a ogni sondaggio — che è il risultato corretto. App Check non è un sostituto della correttezza delle regole (un token App Check rubato più una regola aperta fa ancora trapelare dati), ma blocca scansioni esterne opportunistiche.

Lo scanner può rilevare configurazioni parziali (lettura aperta, scrittura chiusa)?

Sì — ogni regola (allow read, allow write) viene sondata separatamente. Un sondaggio di sola lettura che ha successo con 200 OK segnala un risultato di lettura aperta anche se le scritture sono negate. I due risultati sono distinti: esfiltrazione di dati e manipolazione di dati sono rischi separati.

Funziona per app Firebase deployate sotto un dominio personalizzato?

Sì. Lo scanner estrae l'ID del progetto Firebase dal bundle deployato, non dal dominio. Domini personalizzati, sottodomini app.web.app e app Firebase self-hosted funzionano tutti allo stesso modo finché il bundle JavaScript è raggiungibile.

Prossimi passi

Esegui una scansione FixVibe gratuita contro la tua URL di produzione — il check baas.firebase-rules è in ogni piano e segnala regole aperte in Firestore, Realtime Database e Cloud Storage. Per una spiegazione più approfondita del pattern allow read, write: if true in particolare, vedi Firebase allow read, write: if true spiegato. Per la panoramica su Supabase, Firebase, Clerk e Auth0, leggi Scanner di configurazioni errate BaaS.

// scansiona la tua superficie baas

Trova la tabella aperta prima che lo faccia qualcun altro.

Inserisci una URL di produzione. FixVibe enumera i provider BaaS con cui parla la tua app, identifica i loro endpoint pubblici e riporta cosa un client non autenticato può leggere o scrivere. Gratis, senza installazione, senza carta.

  • Piano gratuito — 3 scansioni/mese, senza carta d'iscrizione.
  • Fingerprinting BaaS passivo — nessuna verifica del dominio necessaria.
  • Supabase, Firebase, Clerk, Auth0, Appwrite e altri.
  • Prompt di correzione IA su ogni risultato — incollali in Cursor / Claude Code.
Esegui scansione BaaS gratuita

nessuna registrazione richiesta

Scanner di regole Firebase: trova regole aperte in Firestore, Realtime Database e Storage — Docs · FixVibe