FixVibe

// docs / baas security / firebase rules scanner

Scanner de regras Firebase: encontre regras abertas no Firestore, Realtime Database e Storage

Apps Firebase falham em segurança de uma forma consistente: regras allow read, write: if true; que sobraram do quickstart em modo de teste, nunca substituídas antes da produção. Ferramentas de codificação com IA geram essas regras textualmente dos exemplos da documentação e raramente avisam o desenvolvedor para endurecê-las. Este artigo mostra como um scanner de regras Firebase detecta regras abertas no Firestore, Realtime Database e Cloud Storage de fora do projeto — e como corrigir o que ele encontra.

Como o scanner encontra regras Firebase abertas

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.

Como o footgun de modo de teste realmente parece

A documentação de quickstart do Firebase inclui um dos blocos de regras mais copiados da internet:

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

O Firebase costumava adicionar uma expiração automática de 30 dias nessas regras. Isso mudou: hoje as regras persistem para sempre a menos que o desenvolvedor as substitua. Ferramentas de codificação com IA — treinadas em anos de documentação que inclui o bloco de modo de teste — frequentemente o emitem textualmente e dizem ao desenvolvedor "esta é sua regra de segurança". Não é.

Outras variantes que aparecem em produção mas são igualmente permissivas:

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;
  • Uma variante de timestamp futuro: uma regra que permite tudo até uma data distante no futuro. Nunca expira efetivamente (veja o bloco destacado acima).
  • allow read: if true; allow write: if request.auth != null; — leituras públicas, qualquer usuário autenticado pode escrever.
  • allow read, write: if request.auth != null; — qualquer usuário logado pode ler ou escrever qualquer documento, incluindo dados de outros usuários.

O que fazer quando o scanner encontra uma regra aberta

Regras abertas do Firebase são uma emergência em produção. A correção tem o mesmo formato em todos os três serviços: restrinja cada regra a request.auth.uid contra um campo de dono explícito. Cada serviço tem sua própria sintaxe de regras:

Firestore

match /users/{userId} { allow read, write: if request.auth != null && request.auth.uid == userId; }. O binding de segmento de caminho {userId} se torna o único documento que o usuário pode tocar.

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

Banco de dados em tempo real

{ "rules": { "users": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid" } } } }. O wildcard $uid captura o segmento de caminho para comparação.

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

Armazenamento em nuvem

service firebase.storage { match /b/{bucket}/o { match /users/{userId}/{allPaths=**} { allow read, write: if request.auth.uid == userId; } } }. Convenção: armazene arquivos sob users/[uid]/[filename] e deixe o caminho impor a propriedade.

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

Como isso se compara às ferramentas embutidas do Firebase

O console do Firebase mostra as regras atuais mas não as audita contra o comportamento em runtime. O simulador de regras do Firebase deixa você testar a lógica de regras contra requisições sintéticas — útil mas local. Nenhuma das duas ferramentas diz o que suas regras de produção realmente retornam a um atacante anônimo na internet pública. Um scanner externo como o FixVibe (ou Burp Suite com configuração manual) é a única coisa que sonda do mesmo ângulo que um atacante faria. O próprio App Check do Google mitiga abuso mas não substitui regras corretamente restritas.

Perguntas frequentes

O scanner lê ou modifica meus dados do Firestore?

Varreduras passivas emitem no máximo uma leitura anônima por serviço para confirmar se as regras permitem. O scanner registra o formato da resposta e a presença de dados — não pagina, não enumera documentos e não escreve. Sondagens de escrita são protegidas atrás de verificação de propriedade de domínio e nunca rodam contra alvos não verificados.

E se meu projeto Firebase usa App Check?

App Check rejeita requisições não autenticadas com 403. Um scanner sem token de App Check verá 403 em cada sondagem — que é o resultado correto. App Check não é substituto para regras corretas (um token de App Check roubado mais uma regra aberta ainda vaza dados), mas bloqueia varreduras externas oportunistas.

O scanner pode detectar configurações parciais (leitura aberta, escrita fechada)?

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

Isso funciona para apps Firebase publicados sob um domínio personalizado?

Sim. O scanner extrai o ID do projeto Firebase do bundle publicado, não do domínio. Domínios personalizados, subdomínios app.web.app e apps Firebase auto-hospedados todos funcionam da mesma forma desde que o bundle JavaScript seja alcançável.

Próximos passos

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.

// varra sua superfície baas

Encontre a tabela aberta antes que outra pessoa o faça.

Coloque uma URL de produção. O FixVibe enumera os provedores BaaS com que seu app conversa, identifica seus endpoints públicos e relata o que um cliente não autenticado pode ler ou escrever. Grátis, sem instalação, sem cartão.

  • Plano gratuito — 3 varreduras/mês, sem cartão de cadastro.
  • Identificação BaaS passiva — sem necessidade de verificação de domínio.
  • Supabase, Firebase, Clerk, Auth0, Appwrite e mais.
  • Coding-agent prompts where code/config applies, plus provider-console steps for hosted BaaS fixes.
Rodar varredura BaaS gratuita →

sem necessidade de cadastro

Scanner de regras Firebase: encontre regras abertas no Firestore, Realtime Database e Storage · FixVibe