FixVibe

// docs / baas security / firebase rules scanner

Escáner de reglas de Firebase: detecta reglas abiertas en Firestore, Realtime Database y Storage

Las aplicaciones de Firebase fallan en seguridad de una forma consistente: reglas allow read, write: if true; que quedaron del arranque rápido de modo prueba, nunca reemplazadas antes de producción. Las herramientas de codificación con IA generan estas reglas literalmente desde los ejemplos de la documentación y rara vez piden al desarrollador endurecerlas. Este artículo muestra cómo un escáner de reglas de Firebase detecta reglas abiertas en Firestore, Realtime Database y Cloud Storage desde fuera del proyecto — y cómo corregir lo que encuentre.

Cómo el escáner encuentra reglas abiertas de Firebase

Firebase services are reachable at predictable public addresses, so a scanner with no credentials can check each one the way an anonymous visitor would. FixVibe's Firebase check covers all three services independently:

  • Firestore. FixVibe finds the project from the deployed app's own Firebase configuration and reports collections that anonymous visitors can read.
  • Realtime Database. FixVibe reports a database whose data anonymous visitors can read — often the whole tree at once.
  • Cloud Storage. FixVibe reports buckets that anonymous visitors can list. Listable storage is a finding even when individual downloads are denied, because it lets attackers find guessable filenames.

Cómo se ve realmente el footgun de modo prueba

La documentación de arranque rápido de Firebase incluye uno de los bloques de reglas más copiados de internet:

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

Firebase solía añadir una caducidad automática de 30 días a estas reglas. Eso cambió: hoy las reglas persisten para siempre a menos que el desarrollador las reemplace. Las herramientas de codificación con IA — habiendo entrenado en años de documentación que incluye el bloque de modo prueba — frecuentemente lo emiten textualmente y le dicen al desarrollador "esta es tu regla de seguridad". No lo es.

Otras variantes que aparecen en producción pero son igualmente permisivas:

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 marca de tiempo futura: una regla que permite todo hasta una fecha lejana en el futuro. Nunca expira efectivamente (consulta el bloque resaltado arriba).
  • allow read: if true; allow write: if request.auth != null; — lecturas públicas, cualquier usuario autenticado puede escribir.
  • allow read, write: if request.auth != null; — cualquier usuario autenticado puede leer o escribir cualquier documento, incluyendo datos de otros usuarios.

Qué hacer cuando el escáner encuentra una regla abierta

Las reglas abiertas de Firebase son una emergencia en tiempo de ejecución. La corrección tiene la misma forma en los tres servicios: acota cada regla a request.auth.uid contra un campo de propietario explícito. Cada servicio tiene su propia sintaxis de reglas:

Firestore

match /users/{userId} { allow read, write: if request.auth != null && request.auth.uid == userId; }. El binding de segmento de ruta {userId} se convierte en el único documento que el usuario puede tocar.

firebase
match /users/{userId} {
  allow read, write: if request.auth != null
                     && request.auth.uid == userId;
}

Base de datos en tiempo real

{ "rules": { "users": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid" } } } }. El comodín $uid captura el segmento de ruta para la comparación.

json
{
  "rules": {
    "users": {
      "$uid": {
        ".read":  "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}

Almacenamiento en la nube

service firebase.storage { match /b/{bucket}/o { match /users/{userId}/{allPaths=**} { allow read, write: if request.auth.uid == userId; } } }. Convención: guarda los archivos bajo users/[uid]/[filename] y deja que la ruta imponga la propiedad.

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

Deploy rules via the Firebase CLI: firebase deploy --only firestore:rules, firebase deploy --only database, firebase deploy --only storage. Verify the new rules are in production by re-running the FixVibe scan — the open-rules finding should clear.

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

Cómo se compara esto con las herramientas integradas de Firebase

La consola de Firebase muestra las reglas actuales pero no las audita contra el comportamiento en tiempo de ejecución. El simulador de reglas de Firebase te permite probar la lógica de las reglas contra solicitudes sintéticas — útil pero local. Ninguna de las dos herramientas te dice lo que tus reglas de producción realmente devuelven a un atacante anónimo en internet público. Un escáner externo como FixVibe (o Burp Suite con configuración manual) es lo único que sondea desde el mismo ángulo que un atacante. El propio App Check de Google mitiga el abuso pero no sustituye a reglas correctamente acotadas.

Preguntas frecuentes

¿Lee o modifica el escáner mis datos de Firestore?

Los escaneos pasivos emiten como máximo una lectura anónima por servicio para confirmar si las reglas lo permiten. El escáner registra la forma de la respuesta y la presencia de datos — no pagina, no enumera documentos y no escribe. Los sondeos de escritura están restringidos por la verificación de propiedad de dominio y nunca se ejecutan contra objetivos no verificados.

¿Qué pasa si mi proyecto de Firebase usa App Check?

App Check rechaza las solicitudes no autenticadas con un 403. Un escáner sin token de App Check verá 403 en cada sondeo — lo cual es el resultado correcto. App Check no es un sustituto de reglas correctas (un token de App Check robado más una regla abierta todavía filtra datos), pero sí bloquea los escaneos externos oportunistas.

¿Puede el escáner detectar configuraciones parciales (lectura abierta, escritura cerrada)?

Yes. Open read access and open write access are reported as separate findings, because data exfiltration and data manipulation are separate risks.

¿Funciona esto para aplicaciones Firebase desplegadas bajo un dominio personalizado?

Sí. El escáner extrae el ID del proyecto Firebase del bundle desplegado, no del dominio. Los dominios personalizados, subdominios app.web.app y aplicaciones Firebase auto-hospedadas funcionan todos de la misma forma, siempre que el bundle de JavaScript sea accesible.

Próximos pasos

Run a free FixVibe scan against your production URL — the Firebase rules check runs on every plan and flags open rules across Firestore, Realtime Database, and Cloud Storage. For a deeper explainer on the allow read, write: if true pattern specifically, see Firebase allow read, write: if true explained. For the umbrella view across Supabase, Firebase, Clerk, and Auth0, read BaaS misconfiguration scanner.

// escanea tu superficie de baas

Encuentra la tabla abierta antes que otra persona lo haga.

Introduce una URL de producción. FixVibe enumera los proveedores de BaaS con los que habla tu aplicación, identifica sus endpoints públicos y reporta lo que un cliente no autenticado puede leer o escribir. Gratis, sin instalación, sin tarjeta.

  • Plan gratuito — 3 escaneos al mes, sin tarjeta de registro.
  • Identificación pasiva de BaaS — no se requiere verificación de dominio.
  • Supabase, Firebase, Clerk, Auth0, Appwrite y más.
  • Coding-agent prompts where code/config applies, plus provider-console steps for hosted BaaS fixes.
Escáner de reglas de Firebase: detecta reglas abiertas en Firestore, Realtime Database y Storage · FixVibe