FixVibe

// docs / baas security / firebase rules scanner

Сканер правил Firebase: найдите открытые правила Firestore, Realtime Database и Storage

Приложения Firebase терпят неудачу в безопасности одним и тем же последовательным образом: правила <code>allow read, write: if true;</code>, оставшиеся от быстрого старта в тестовом режиме, никогда не заменяются перед продакшеном. ИИ-инструменты кодирования генерируют эти правила дословно из примеров документации и редко побуждают разработчика их усилить. Эта статья показывает, как сканер правил Firebase обнаруживает открытые правила в Firestore, Realtime Database и Cloud Storage извне проекта — и как исправить то, что он находит.

Как сканер находит открытые правила Firebase

Сервисы Firebase предоставляют хорошо известные, предсказуемые формы URL. Сканер без учётных данных может зондировать каждый из них и наблюдать, успешны ли анонимные чтения. Проверка 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. Сканер зондирует https://[project-id]-default-rtdb.firebaseio.com/.json. Если корень читается анонимно, ответ — это всё дерево базы данных в виде JSON. Более консервативный тест запрашивает .json?shallow=true, который возвращает только ключи верхнего уровня — находка в любом случае.
  • Cloud Storage. Сканер запрашивает https://firebasestorage.googleapis.com/v0/b/[project-id].appspot.com/o. Если ответ перечисляет имена файлов без аутентификации, корзина является анонимно перечисляемой. Перечисляемое хранилище — это находка, даже когда отдельные загрузки файлов отклоняются — злоумышленники перечисляют корзину, чтобы найти угадываемые имена файлов.

Как на самом деле выглядит подводный камень тестового режима

Документация быстрого старта Firebase включает один из самых копируемых блоков правил в интернете:

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

Firebase раньше добавлял автоматический 30-дневный срок действия к этим правилам. Это изменилось: сегодня правила сохраняются навсегда, если разработчик их не заменит. ИИ-инструменты кодирования — обученные на годах документации, которая включает блок тестового режима — часто выдают его дословно и говорят разработчику «это ваше правило безопасности». Это не так.

Другие варианты, которые появляются в продакшене, но одинаково разрешающие:

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;
  • Вариант с будущей временной меткой: правило, которое позволяет всё до даты в далёком будущем. Никогда фактически не истекает (см. выделенный блок выше).
  • allow read: if true; allow write: if request.auth != null; — публичные чтения, любой аутентифицированный пользователь может писать.
  • allow read, write: if request.auth != null; — любой вошедший пользователь может читать или писать любой документ, включая данные других пользователей.

Что делать, когда сканер находит открытое правило

Открытые правила Firebase — это аварийная ситуация времени выполнения. Исправление имеет одну и ту же форму во всех трёх сервисах: ограничьте каждое правило request.auth.uid против явного поля владельца. Каждый сервис имеет свой синтаксис правил:

Firestore

match /users/{userId} { allow read, write: if request.auth != null && request.auth.uid == userId; }. Привязка сегмента пути {userId} становится единственным документом, к которому пользователь может прикоснуться.

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; } } }. Соглашение: храните файлы по адресу users/[uid]/[filename] и позвольте пути обеспечить владение.

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

Разверните правила через Firebase CLI: firebase deploy --only firestore:rules, firebase deploy --only database, firebase deploy --only storage. Проверьте, что новые правила в продакшене, повторно запустив сканирование FixVibe — находка baas.firebase-rules должна очиститься.

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

Как это сравнивается с встроенными инструментами Firebase

Консоль Firebase показывает вам текущие правила, но не проверяет их относительно поведения времени выполнения. Симулятор правил Firebase позволяет тестировать логику правил против синтетических запросов — полезно, но локально. Ни один инструмент не говорит вам, что ваши продакшен-правила на самом деле возвращают анонимному злоумышленнику в публичном интернете. Внешний сканер вроде FixVibe (или Burp Suite с ручной конфигурацией) — это единственное, что зондирует с того же угла, с которого злоумышленник. Собственный App Check от Google смягчает злоупотребление, но не заменяет правильно ограниченные правила.

Часто задаваемые вопросы

Будет ли сканер читать или изменять мои данные Firestore?

Пассивные сканирования выдают не более одного анонимного чтения на сервис, чтобы подтвердить, разрешают ли правила. Сканер записывает форму ответа и наличие данных — он не разбивает на страницы, не перечисляет документы и не пишет. Зонды записи защищены подтверждённым владением доменом и никогда не запускаются против непроверенных целей.

Что, если мой проект Firebase использует App Check?

App Check отклоняет неаутентифицированные запросы с 403. Сканер без токена App Check увидит 403 на каждом зонде — это правильный результат. App Check не является заменой правильности правил (украденный токен App Check плюс открытое правило всё равно утекает данные), но он блокирует случайные внешние сканирования.

Может ли сканер обнаруживать частичные неправильные настройки правил (чтение открыто, запись закрыта)?

Да — каждое правило (allow read, allow write) зондируется отдельно. Только-для-чтения зонд, который успешен с 200 OK, сообщает о находке открытого чтения, даже если записи отклоняются. Две находки разные: эксфильтрация данных и манипуляция данными — это отдельные риски.

Работает ли это для приложений Firebase, развёрнутых под пользовательским доменом?

Да. Сканер извлекает идентификатор проекта Firebase из развёрнутого бандла, а не из домена. Пользовательские домены, поддомены app.web.app и самостоятельно размещённые приложения Firebase работают одинаково, пока JavaScript-бандл доступен.

Следующие шаги

Запустите бесплатное сканирование 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 прочитайте Сканер неправильных настроек BaaS.

// сканируйте вашу baas-поверхность

Найдите открытую таблицу раньше, чем это сделает кто-то другой.

Введите производственный URL. FixVibe перечислит поставщиков BaaS, с которыми взаимодействует ваше приложение, снимет отпечатки с их публичных конечных точек и сообщит, что неавторизованный клиент может прочитать или записать. Бесплатно, без установки, без карты.

  • Бесплатный тариф — 3 сканирования в месяц, без карты при регистрации.
  • Пассивное снятие отпечатков BaaS — не требуется проверка владения доменом.
  • Supabase, Firebase, Clerk, Auth0, Appwrite и другие.
  • Подсказки исправления ИИ для каждой находки — вставьте обратно в Cursor / Claude Code.
Сканер правил Firebase: найдите открытые правила Firestore, Realtime Database и Storage — Docs · FixVibe