FixVibe

// docs / baas security / firebase rules scanner

Firebase rules scanner: tìm rules mở của Firestore, Realtime Database và Storage

Các ứng dụng Firebase thất bại bảo mật theo một cách nhất quán: rules <code>allow read, write: if true;</code> còn sót lại từ khởi đầu chế độ thử nghiệm, không bao giờ được thay thế trước khi lên production. Các công cụ AI lập trình tạo ra các rules này nguyên văn từ ví dụ tài liệu và hiếm khi nhắc developer gia cố chúng. Bài viết này cho thấy cách một Firebase rules scanner phát hiện rules mở trên Firestore, Realtime Database và Cloud Storage từ bên ngoài dự án — và cách sửa những gì nó tìm thấy.

Cách scanner tìm rules Firebase mở

Dịch vụ Firebase mở các hình dạng URL có thể dự đoán, nổi tiếng. Một scanner không có thông tin xác thực có thể thăm dò từng dịch vụ và quan sát xem các thao tác đọc ẩn danh có thành công không. Check baas.firebase-rules của FixVibe chạy ba thăm dò độc lập — một cho mỗi dịch vụ 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. Scanner thăm dò https://[project-id]-default-rtdb.firebaseio.com/.json. Nếu gốc có thể đọc ẩn danh, phản hồi là toàn bộ cây cơ sở dữ liệu dưới dạng JSON. Một bài kiểm tra thận trọng hơn truy vấn .json?shallow=true, chỉ trả về các key cấp cao nhất — phát hiện trong cả hai trường hợp.
  • Cloud Storage. Scanner truy vấn https://firebasestorage.googleapis.com/v0/b/[project-id].appspot.com/o. Nếu phản hồi liệt kê tên file mà không cần xác thực, bucket có thể liệt kê ẩn danh. Storage có thể liệt kê là một phát hiện ngay cả khi tải xuống file riêng lẻ bị từ chối — kẻ tấn công liệt kê bucket để tìm tên file có thể đoán.

Cạm bẫy chế độ thử nghiệm thực sự trông như thế nào

Tài liệu khởi đầu của Firebase bao gồm một trong những khối rule được sao chép nhiều nhất trên internet:

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

Firebase đã từng thêm thời hạn tự động 30 ngày cho các rules này. Điều đó đã thay đổi: ngày nay các rules tồn tại mãi mãi trừ khi developer thay thế chúng. Các công cụ AI lập trình — đã được huấn luyện trên nhiều năm tài liệu bao gồm khối chế độ thử nghiệm — thường xuyên phát ra nó nguyên văn và nói với developer "đây là rule bảo mật của bạn". Không phải vậy.

Các biến thể khác xuất hiện trong production nhưng cũng dễ dãi không kém:

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;
  • Biến thể dấu thời gian tương lai: một rule cho phép mọi thứ cho đến một ngày xa trong tương lai. Không bao giờ hết hạn hiệu quả (xem khối được tô sáng ở trên).
  • allow read: if true; allow write: if request.auth != null; — đọc công khai, bất kỳ người dùng đã xác thực nào đều có thể ghi.
  • allow read, write: if request.auth != null; — bất kỳ người dùng đã đăng nhập nào đều có thể đọc hoặc ghi bất kỳ document nào, bao gồm dữ liệu của người dùng khác.

Phải làm gì khi scanner tìm thấy một rule mở

Rules Firebase mở là tình huống khẩn cấp ở runtime. Bản sửa có hình dạng tương tự trên cả ba dịch vụ: giới hạn mọi rule theo request.auth.uid đối với một trường chủ sở hữu rõ ràng. Mỗi dịch vụ có cú pháp rule riêng:

Firestore

match /users/{userId} { allow read, write: if request.auth != null && request.auth.uid == userId; }. Liên kết path-segment {userId} trở thành document duy nhất mà người dùng có thể chạm vào.

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; } } }. Quy ước: lưu file dưới users/[uid]/[filename] và để đường dẫn thực thi quyền sở hữu.

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

Triển khai rules qua Firebase CLI: firebase deploy --only firestore:rules, firebase deploy --only database, firebase deploy --only storage. Xác minh các rules mới có trong production bằng cách chạy lại lượt quét FixVibe — phát hiện baas.firebase-rules sẽ biến mất.

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

So sánh với các công cụ tích hợp của Firebase

Firebase Console hiển thị các rules hiện tại nhưng không kiểm toán chúng so với hành vi runtime. Trình mô phỏng Firebase Rules cho phép bạn kiểm tra logic rule với các yêu cầu tổng hợp — hữu ích nhưng cục bộ. Không công cụ nào cho bạn biết rules production của bạn thực sự trả về gì cho một kẻ tấn công ẩn danh trên internet công khai. Một scanner bên ngoài như FixVibe (hoặc Burp Suite với cấu hình thủ công) là điều duy nhất thăm dò từ cùng góc độ mà kẻ tấn công sẽ làm. App Check của chính Google giảm thiểu lạm dụng nhưng không thay thế cho các rules được giới hạn đúng.

Câu hỏi thường gặp

Scanner có đọc hoặc sửa đổi dữ liệu Firestore của tôi không?

Các lượt quét thụ động phát tối đa một thao tác đọc ẩn danh cho mỗi dịch vụ để xác nhận xem rules có cho phép không. Scanner ghi lại hình dạng phản hồi và sự hiện diện của dữ liệu — nó không phân trang, không liệt kê documents và không ghi. Các thăm dò ghi được kiểm soát phía sau xác minh quyền sở hữu tên miền và không bao giờ chạy đối với mục tiêu chưa xác minh.

Điều gì xảy ra nếu dự án Firebase của tôi dùng App Check?

App Check từ chối các yêu cầu chưa xác thực với 403. Một scanner không có token App Check sẽ thấy 403 trong mọi thăm dò — đó là kết quả đúng. App Check không phải là sự thay thế cho tính đúng đắn của rule (một token App Check bị đánh cắp cộng với một rule mở vẫn rò rỉ dữ liệu), nhưng nó chặn các lượt quét bên ngoài cơ hội.

Scanner có thể phát hiện cấu hình sai rule một phần (đọc mở, ghi đóng) không?

Có — mỗi rule (allow read, allow write) được thăm dò riêng. Một thăm dò chỉ đọc thành công với 200 OK báo cáo một phát hiện đọc mở ngay cả khi ghi bị từ chối. Hai phát hiện là khác biệt: trích xuất dữ liệu và thao túng dữ liệu là rủi ro riêng biệt.

Cái này có hoạt động với các ứng dụng Firebase được triển khai dưới tên miền tùy chỉnh không?

Có. Scanner trích xuất project ID Firebase từ bundle đã triển khai, không phải từ tên miền. Tên miền tùy chỉnh, subdomain app.web.app và các ứng dụng Firebase tự host đều hoạt động theo cùng cách miễn là bundle JavaScript có thể truy cập được.

Các bước tiếp theo

Chạy một lượt quét FixVibe miễn phí với URL production của bạn — check baas.firebase-rules có trên mọi gói và đánh dấu rules mở trên Firestore, Realtime Database và Cloud Storage. Để có lời giải thích sâu hơn về mẫu allow read, write: if true cụ thể, xem Giải thích Firebase allow read, write: if true. Để có cái nhìn tổng quát trên Supabase, Firebase, Clerk và Auth0, đọc BaaS misconfiguration scanner.

// quét bề mặt baas của bạn

Tìm bảng dữ liệu mở trước khi người khác tìm thấy.

Dán vào một URL production. FixVibe sẽ liệt kê các nhà cung cấp BaaS mà ứng dụng của bạn kết nối tới, fingerprint các endpoint công khai của họ và báo cáo những gì một client chưa xác thực có thể đọc hoặc ghi. Miễn phí, không cần cài đặt, không cần thẻ.

  • Gói miễn phí — 3 lượt quét/tháng, không cần thẻ khi đăng ký.
  • Fingerprinting BaaS thụ động — không cần xác minh tên miền.
  • Supabase, Firebase, Clerk, Auth0, Appwrite và nhiều nữa.
  • Prompt sửa lỗi bằng AI trên mỗi phát hiện — dán lại vào Cursor / Claude Code.
Chạy quét BaaS miễn phí

không cần đăng ký

Firebase rules scanner: tìm rules mở của Firestore, Realtime Database và Storage — Docs · FixVibe