
프로젝트의 RLS 잘못된 구성, 노출된 키, 인증 우회, 스토리지 취약점을 감사하는 Claude Skill입니다. CVE-2025-48757 및 10건의 보안 연구에서 도출된 27가지 안티 패턴입니다. 프로덕션 환경에서 안전합니다.
데이터베이스 백엔드의 보안 취약점을 감사하는 Claude Skill입니다.
Claude Code, Cursor 또는 Claude 기반 환경에 넣기만 하세요. "audit my database"라고 말하면 정확한 수정 코드가 포함된 종합 보안 보고서를 단 며칠이 아닌 몇 분 만에 받을 수 있습니다.
170개 이상의 Lovable 앱이 침해되었습니다. YC 스타트업 전반에서 2,010만 개의 행이 노출되었습니다. 약 87,000개의 MongoDB 인스턴스가 MongoBleed(CVE-2025-14847, CISA KEV)에 취약한 상태로 남아 있었습니다. 2025년 단일 사고로 180만 개의 Firebase 비밀번호가 유출되었습니다. AI 생성 코드의 45%가 OWASP Top 10 취약점을 유발합니다. Database Sentinel은 보안 구성이 실제로 작동하는지 — 단순히 존재하는지만이 아니라 — 테스트합니다.
Database Sentinel은 프로젝트에서 사용하는 백엔드에 대해 7단계 보안 감사를 수행합니다:
tx=rollback, 카나리 컬렉션, 옵트인 MongoBleed 탐지기)크로스 백엔드 추론은 단일 백엔드 스캐너가 놓치는 문제를 포착합니다 (예: JWT 검증 없이 Postgres API가 신뢰하는 Firebase Auth UID).
| 단계 | 백엔드 | 상태 |
|---|---|---|
| 1 | Supabase | ✅ 구현됨 |
| 2 | MongoDB (자체 호스팅 + Atlas) | ✅ 구현됨 |
| 3 | Firebase (Firestore / RTDB / Storage / Functions / Remote Config) | 🚧 계획됨 |
| 4 | PostgreSQL (자체 호스팅, pgBouncer 포함) | 🚧 계획됨 |
| 5 | MySQL (자체 호스팅) | 🚧 계획됨 |
| 6 | 크로스 백엔드 상호작용 분석 | 🚧 계획됨 |
| 7 | 배포 + 다듬기 | 🚧 계획됨 |
Database Sentinel은 이전에 Supabase Sentinel(단일 백엔드)이었습니다. 멀티 백엔드 확장의 Phase 1 중에 이름이 변경되었습니다. compat/supabase-sentinel/의 하위 호환 셰임이 최소 다음 마이너 릴리스까지 기존 스킬 이름을 유지합니다 — 기존 사용자는 회귀가 없습니다.
스킬을 프로젝트의 skills 디렉토리 또는 중앙 디렉토리에 클론하세요:
git clone https://github.com/Farenhytee/database-sentinel.git ~/claude-skills/database-sentinel
그런 다음 Claude에게 요청하세요:
Audit my database
Database Sentinel은 프로젝트가 사용하는 백엔드를 감지하고 관련 감사를 실행한 후 통합 보고서를 생성합니다. 여러 백엔드가 존재하는 경우(Firebase Auth + Postgres 데이터 등), 보고서에는 Phase 6가 완료되면 크로스 백엔드 상호작용 섹션이 포함됩니다.
특정 백엔드만 감사하려면 명시적으로 요청하세요:
Audit my Supabase project
Audit my MongoDB instance
디스패처가 범위를 좁힙니다.
SKILL.md 내용과 해당 backends/<name>/workflow.md를 시스템 프롬프트에 복사하세요. 자격 증명으로 7단계를 진행하세요.
| 심각도 | 패턴 | 설명 |
|---|---|---|
| 🔴 CRITICAL | SB-001 RLS_DISABLED | Row-Level Security가 없는 테이블 — 인터넷에 완전히 노출됨 |
| 🔴 CRITICAL | SB-002 SERVICE_ROLE_EXPOSED | 프론트엔드 코드의 service_role 키 — 모든 보안 우회 |
| 🔴 CRITICAL | SB-003 POLICIES_BUT_NO_RLS | 정책은 작성되었지만 RLS가 활성화되지 않음 — 가짜 보안 |
| 🔴 CRITICAL | SB-005 WRITE_USING_TRUE | USING(true)가 있는 INSERT/UPDATE/DELETE — 누구나 수정 가능 |
| 🟠 HIGH | SB-006 USING_TRUE_SELECT | 민감한 테이블의 모든 행을 익명 사용자가 읽을 수 있음 |
| 🟠 HIGH | SB-007 VIEW_NO_SECURITY_INVOKER | 뷰가 RLS를 우회하고 superuser로 실행됨 |
| 🟠 HIGH | SB-008 SECURITY_DEFINER_EXPOSED | public 스키마의 함수가 RLS를 우회하고 API로 호출 가능 |
| 🟠 HIGH | SB-009 USER_METADATA_IN_POLICY | 정책이 사용자 수정 가능 메타데이터를 참조 — 권한 상승 |
| 🟠 HIGH | SB-010 UPDATE_NO_WITHCHECK | WITH CHECK가 없는 UPDATE 정책 — 대량 할당 위험 |
| 🟠 HIGH | SB-011 GHOST_AUTH | 확인되지 않은 이메일 가입이 인증된 세션을 부여함 |
| 🟠 HIGH | SB-012 STORAGE_NO_RLS | 스토리지 버킷에 액세스 제어 정책 누락 |
| 🟠 HIGH | SB-013 JWT_SECRET_EXPOSED | JWT 서명 시크릿 유출 — 모든 사용자의 토큰 위조 가능 |
| 🟡 MEDIUM | + 15개 추가 패턴 | backends/supabase/anti-patterns.md 참조 |
| 심각도 | 패턴 | 설명 |
|---|---|---|
| 🔴 CRITICAL | MG-SH-001 MongoBleed (CVE-2025-14847, CISA KEV) | 조작된 압축 패킷을 통한 인증 전 힙 메모리 노출. 공개 당시 약 87K 인스턴스 노출. |
| 🔴 CRITICAL | MG-SH-002 인증 비활성화 | 인증 없이 실행되는 mongod — Meow 랜섬웨어 공격 표면 |
| 🔴 CRITICAL | MG-SH-003 인터넷 노출 mongod | --bind_ip_all + 27017 도달 가능 — MG-SH-002와 결합 시 완전한 침해 |
| 🔴 CRITICAL | MG-AT-001 Atlas 허용 목록 0.0.0.0/0 | Atlas 클러스터가 인터넷 어디에서나 도달 가능 |
| 🟠 HIGH | MG-SH-004 localhost 인증 우회 + 컨테이너 exec | enableLocalhostAuthBypass true + docker exec 액세스 |
| 🟠 HIGH | MG-SH-005 서버 사이드 JS 활성화 | $where / $function / mapReduce 도달 가능 — NoSQL-RCE 표면 |
| 🟠 HIGH | MG-SH-006 TLS 미필수 | 와이어 상 평문 트래픽 |
| 🟠 HIGH | MG-SH-007 앱 사용자의 권한 있는 역할 | 앱이 root / dbAdminAnyDatabase 등으로 연결 |
| 🟠 HIGH | MG-SH-008 자체 수정 가능 역할 문서 | findByIdAndUpdate(id, req.body) + 검증기 없음 + 역할 필드 |
| 🟠 HIGH | MG-AT-002 DB 패스스루 역할의 Atlas Function | HTTPS를 통한 NoSQL 인젝션 — Data API 폐지 이후 확산 |
| 🟠 HIGH | MG-AT-003 코드에 남은 Atlas Data API | 2025년 9월 30일 폐지; 손상되었고 덜 감사되는 Functions로 교체되었을 가능성 |
| 🟡 MEDIUM | MG-SH-009 Mongoose < 8.9.5 | CVE-2024-53900 / CVE-2025-23061 — populate-match $where 인젝션 |
| 🟡 MEDIUM | + 8개 추가 패턴 | backends/mongodb/anti-patterns.md 참조 |
MongoBleed 네트워크 프로브(backends/mongodb/mongobleed-probe.md)는 런타임 시 악용 가능성을 확인하는 단일 패킷 탐지기를 제공합니다 — mongo:7.0.20(취약) 및 mongo:7.0.28(패치됨)에서 검증됨. 읽기 전용이며 두 번의 옵트인 확인 뒤에 있으며 콘텐츠를 추출하지 않습니다.
╔════════════════════════════════════════════════════════╗
║ SENTINEL SECURITY AUDIT ║
╠════════════════════════════════════════════════════════╣
║ Backends: supabase, mongodb ║
║ Scanned: 2026-04-30 14:30 UTC ║
║ Score: 0/100 🔴 ║
║ Summary: 2 backends, 8 findings (3C / 4H / 1M) ║
╚════════════════════════════════════════════════════════╝
─────────────────────────────────────────────────────────
Supabase 35/100 🔴
─────────────────────────────────────────────────────────
🔴 CRITICAL — public.users: RLS Disabled [SB-001]
Risk: Anyone on the internet can read your entire users table.
Attack: Open browser DevTools → copy anon key → curl the API → dump
all emails, names, and metadata.
Proof: curl returns [{"id":"...","email":"[email protected]",...}]
Source: CVE-2025-48757 / Splinter 0013_rls_disabled_in_public
Fix:
ALTER TABLE public.users ENABLE ROW LEVEL SECURITY;
CREATE POLICY "users_select_own"
ON public.users FOR SELECT TO authenticated
USING ((SELECT auth.uid()) = id);
─────────────────────────────────────────────────────────
MongoDB 0/100 🔴
─────────────────────────────────────────────────────────
🔴 CRITICAL — mongod 7.0.20: MongoBleed (CVE-2025-14847) [MG-SH-001]
Risk: A single TCP packet leaks fragments of MongoDB's memory —
including credentials, queries, and document data — without
requiring any login.
Attack: Public PoC available since Dec 26 2025; CISA KEV. Repeated
requests progressively dump more of the working set.
Proof: buildInfo.version = "7.0.20" (vulnerable; patched in 7.0.28)
zlib compression enabled (default): true
Active probe returned: vulnerable (opCode=2012, 163 bytes)
Source: CVE-2025-14847 / CISA KEV / MongoDB Server Security Update Dec 2025
Fix:
Upgrade to 7.0.28+. Same-day mitigation if upgrade is blocked:
net.compression.compressors = "snappy,zstd" in mongod.conf
✅ PASSING — Supabase: orders, payments, invoices, subscriptions