FixVibe

// docs / baas security / firebase rules scanner

Firebase 규칙 스캐너: 열린 Firestore, Realtime Database, Storage 규칙 찾기

Firebase 앱은 일관된 방식으로 보안에 실패합니다: 테스트 모드 빠른 시작에서 남은 allow read, write: if true; 규칙이 프로덕션 전에 결코 교체되지 않습니다. AI 코딩 도구는 이러한 규칙을 문서 예제에서 그대로 생성하며 개발자에게 강화하도록 거의 안내하지 않습니다. 이 기사는 Firebase 규칙 스캐너가 Firestore, Realtime Database, Cloud Storage에 걸쳐 프로젝트 외부에서 열린 규칙을 어떻게 탐지하는지 — 그리고 발견된 것을 어떻게 고치는지를 보여줍니다.

스캐너가 열린 Firebase 규칙을 찾는 방법

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.

테스트 모드 함정이 실제로 어떤 모습인지

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 규칙은 런타임 비상 사태입니다. 수정은 세 서비스 모두 동일한 모양입니다: 모든 규칙을 명시적 소유자 필드에 대해 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;
}

실시간 데이터베이스

{ "rules": { "users": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid" } } } }. $uid 와일드카드는 비교를 위해 경로 세그먼트를 캡처합니다.

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

클라우드 스토리지

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;
    }
  }
}

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

Firebase 내장 도구와의 비교

Firebase Console은 현재 규칙을 보여주지만 런타임 동작에 대해 감사하지 않습니다. Firebase Rules 시뮬레이터는 합성 요청에 대해 규칙 로직을 테스트할 수 있게 합니다 — 유용하지만 로컬입니다. 두 도구 모두 프로덕션 규칙이 공개 인터넷의 익명 공격자에게 실제로 무엇을 반환하는지 알려주지 않습니다. FixVibe(또는 수동 구성이 있는 Burp Suite) 같은 외부 스캐너만이 공격자와 동일한 각도에서 탐사합니다. Google 자체 App Check는 남용을 완화하지만 올바르게 범위가 좁혀진 규칙을 대체하지 않습니다.

자주 묻는 질문

스캐너가 내 Firestore 데이터를 읽거나 수정하나요?

수동 스캔은 규칙이 허용하는지 확인하기 위해 서비스당 최대 한 번의 익명 읽기를 발행합니다. 스캐너는 응답 모양과 데이터의 존재를 기록합니다 — 페이지를 매기지 않고, 문서를 열거하지 않으며, 쓰지 않습니다. 쓰기 탐사는 확인된 도메인 소유권 뒤에서 게이트되며, 확인되지 않은 대상에 대해 결코 실행되지 않습니다.

Firebase 프로젝트가 App Check를 사용하면 어떻게 되나요?

App Check는 인증되지 않은 요청을 403으로 거부합니다. App Check 토큰이 없는 스캐너는 모든 탐사에서 403을 봅니다 — 이것이 올바른 결과입니다. App Check는 규칙 정확성의 대체물이 아니지만(도난당한 App Check 토큰 + 열린 규칙은 여전히 데이터를 유출함), 기회주의적인 외부 스캔을 차단합니다.

스캐너가 부분적인 규칙 설정 오류(읽기 열림, 쓰기 닫힘)를 탐지할 수 있나요?

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

사용자 정의 도메인 하에 배포된 Firebase 앱에 대해 작동하나요?

예. 스캐너는 도메인이 아닌 배포된 번들에서 Firebase 프로젝트 ID를 추출합니다. 사용자 정의 도메인, app.web.app 서브도메인, 자체 호스팅된 Firebase 앱은 JavaScript 번들이 도달 가능한 한 모두 동일한 방식으로 작동합니다.

다음 단계

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.

// baas 표면 스캔

다른 누군가가 발견하기 전에 열린 테이블을 찾으세요.

프로덕션 URL을 입력하세요. FixVibe는 앱이 통신하는 BaaS 제공자를 열거하고, 공개 엔드포인트의 지문을 채취하며, 인증되지 않은 클라이언트가 무엇을 읽거나 쓸 수 있는지 보고합니다. 무료, 설치 불필요, 카드 불필요.

  • 무료 티어 — 월 3회 스캔, 가입 시 카드 불필요.
  • 수동 BaaS 지문 채취 — 도메인 소유권 확인 불필요.
  • Supabase, Firebase, Clerk, Auth0, Appwrite 등.
  • Coding-agent prompts where code/config applies, plus provider-console steps for hosted BaaS fixes.
Firebase 규칙 스캐너: 열린 Firestore, Realtime Database, Storage 규칙 찾기 · FixVibe