// 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:
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:
// 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.
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.
{
"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.
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.
firebase deploy --only firestore:rules
firebase deploy --only database
firebase deploy --only storageComo 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.
