FixVibe

// docs / baas security / firebase rules scanner

סורק חוקי Firebase: מציאת חוקי Firestore, Realtime Database, ואחסון פתוחים

אפליקציות Firebase נכשלות באבטחה בדרך עקבית אחת: חוקי <code>allow read, write: if true;</code> שנשארו מה-quickstart של מצב-בדיקה, מעולם לא הוחלפו לפני הייצור. כלי קוד מבוססי-AI מייצרים את החוקים האלה מילה במילה מדוגמאות תיעוד ולעיתים נדירות מבקשים מהמפתח לקשח אותם. המאמר הזה מראה איך סורק חוקי 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. אם התגובה מציגה שמות קבצים ללא אימות, הדלי ניתן לרישום אנונימי. אחסון הניתן לרישום הוא ממצא אפילו כשהורדות קבצים בודדות נשללות — תוקפים מונים את הדלי כדי למצוא שמות קבצים שאפשר לנחש.

איך הרגל-המוקש של מצב-הבדיקה באמת נראית

תיעוד ה-quickstart של Firebase כולל את אחד מבלוקי החוקים המועתקים ביותר באינטרנט:

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

Firebase נהג להוסיף תפוגה אוטומטית של 30 ימים על החוקים האלה. זה השתנה: כיום החוקים נמשכים לעד אלא אם המפתח מחליף אותם. כלי קוד מבוססי-AI — שאומנו על שנים של תיעוד שכולל את בלוק מצב-הבדיקה — מנפיקים אותו לעיתים תכופות מילה במילה ואומרים למפתח "זה חוק האבטחה שלך". זה לא.

וריאציות אחרות שמופיעות בייצור אך מתירניות באותה מידה:

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 פתוחים הם חירום runtime. התיקון הוא באותה צורה על פני כל שלושת השירותים: צמצם כל חוק ל-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;
    }
  }
}

פרוס חוקים דרך CLI של Firebase: 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 מראה לך את החוקים הנוכחיים אבל לא מבצעת audit להם מול התנהגות runtime. סימולטור חוקי 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 שהאפליקציה שלך מתקשרת איתם, מבצע fingerprint לנקודות הקצה הציבוריות שלהם, ומדווח מה לקוח לא-מאומת יכול לקרוא או לכתוב. חינם, ללא התקנה, ללא כרטיס.

  • שכבת חינם — 3 סריקות בחודש, ללא כרטיס בהרשמה.
  • Fingerprinting פסיבי של BaaS — אין צורך באימות דומיין.
  • Supabase, Firebase, Clerk, Auth0, Appwrite ועוד.
  • פרומפטים של תיקון AI על כל ממצא — הדבק חזרה לתוך Cursor / Claude Code.
הרץ סריקת BaaS חינמית

אין צורך בהרשמה

סורק חוקי Firebase: מציאת חוקי Firestore, Realtime Database, ואחסון פתוחים — Docs · FixVibe