
프로젝트의 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단계를 진행하세요.
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
database-sentinel/
├── SKILL.md # Dispatcher — detects backends, routes audits (~2K tokens)
├── DECISIONS.md # Locked architecture decisions (D1-D4 + supersessions)
├── core/
│ ├── workflow.md # Universal 7-step audit workflow
│ ├── detection.md # Backend detection + JSON manifest
│ ├── scoring.md # Per-backend weights, min-aggregation
│ ├── reporting.md # Unified report format (text + JSON)
│ └── credentials.md # Public-vs-privileged key handling
├── backends/
│ ├── supabase/ # Phase 1 — implemented
│ │ ├── workflow.md # 7-step audit specialized for Supabase
│ │ ├── audit-queries.md # 20 SQL queries for schema introspection
│ │ ├── anti-patterns.md # 27 patterns (SB-001..SB-027)
│ │ └── fix-templates.md # SQL fix templates (7 RLS patterns + more)
│ └── mongodb/ # Phase 2 — implemented
│ ├── workflow.md # 7-step audit specialized for MongoDB
│ ├── introspection.md # mongosh + Atlas Admin API + IaC scan
│ ├── anti-patterns.md # 20 patterns (MG-SH-001..014, MG-AT-001..006)
│ ├── mongobleed-probe.md # Safe CVE-2025-14847 single-packet detector
│ ├── fix-templates.md # Version matrix + mongod.conf + validators + Atlas TF
│ └── test-recipe.md # Document-only end-to-end test recipe
├── compat/
│ └── supabase-sentinel/ # Backwards-compat shim (forces backend=supabase)
│ └── SKILL.md
├── references/
│ ├── vibe-coding-context.md # CVE-2025-48757, breach studies — cross-backend
│ └── cve-feed.md # Cross-backend CVE list (MongoBleed seeded)
├── assets/
│ └── ci/
│ ├── github-action-supabase.yml # 1 job — security audit
│ └── github-action-mongodb.yml # 3 jobs — static IaC, live audit, MongoBleed probe
├── README.md # this file
├── LICENSE # MIT
├── DECISIONS.md
└── sentinel-implementation-plan.md # Multi-backend expansion roadmap
점진적 공개 방식: Claude는 초기에 SKILL.md(~2K 토큰)와 core/*만 로드합니다. 탐지가 백엔드를 식별하면 해당 backends/<name>/workflow.md와 온디맨드 참조 파일이 로드됩니다. Supabase 전용 감사는 MongoDB 콘텐츠 비용을 지불하지 않습니다. 향후 Firebase / Postgres / MySQL 확장도 동일한 패턴을 따릅니다.
구현된 각 백엔드는 CI 워크플로 템플릿을 제공합니다:
| 백엔드 | 워크플로 | 작업 모드 |
|---|---|---|
| Supabase | assets/ci/github-action-supabase.yml | 단일 작업 — 보안 감사 (인트로스펙션 + 동적 프로브) |
| MongoDB |
워크플로는 관련 파일 변경(마이그레이션, 규칙 파일, IaC, 의존성 매니페스트), 주간 cron(월요일 06:00 UTC), 수동 디스패치 시 트리거됩니다. PR 코멘트를 게시하고, 보고서 아티팩트를 업로드하며, 심각한 발견 시 빌드를 실패시킵니다.
그냥 요청하세요: "이 프로젝트에 대한 지속적 보안 모니터링을 설정해 줘."
Database Sentinel의 안티패턴 데이터베이스는 다음에서 소싱됩니다:
$where 인젝션전체 인용 세트는 references/vibe-coding-context.md 및 references/cve-feed.md를 참조하세요.
Database Sentinel은 프로덕션 사용에 안전하도록 설계되었습니다:
pg_tables, pg_policies, getCmdLineOpts 등)만 읽습니다. 기본적으로 DDL 또는 DML 없음.Prefer: tx=rollback (PostgREST 네이티브; 수정 데이터 0)BEGIN…ROLLBACK (트랜잭션 DDL)abortTransaction()/_sentinel_probe/{random}의 카나리 컬렉션_sentinel_probe 스키마 + DROP DATABASE (옵트인, 파괴적 — 명시적 경고).invalid TLD 사용. 테스트 이메일은 메일을 수신할 수 없는 RFC 6761 예약 도메인을 사용합니다.기여를 환영합니다. 가장 가치 있는 기여:
backends/<name>/anti-patterns.md에 추가하세요.backends/<name>/fix-templates.md의 더 나은 정책 패턴, 엣지 케이스 또는 성능 최적화.backends/mongodb/mongobleed-probe.md의 "Empirically verified" 주석 참조).backends/mongodb/ 및 backends/supabase/ 구조를 따르세요. 구현 계획(sentinel-implementation-plan.md)에 각각에 대한 계약이 있습니다.git checkout -b add-new-pattern)mysql_native_password 폐지 처리)BACKENDS.md 빠른 참조, supabase-sentinel 셰임의 폐지 타임라인npx database-sentinel auditsupabase-sentinel 스킬 이름은 compat/supabase-sentinel/의 호환 셰임을 통해 여전히 작동합니다. 감사를 Supabase 전용으로 강제하며 v1과 구분할 수 없는 출력을 생성합니다. 종료 날짜: TBD; 최소 다음 마이너 릴리스까지.
MIT — 상업적 또는 기타 용도로 원하는 대로 사용하세요.
바이브 코딩 시대를 위해 구축되었습니다.
"작동한다"와 "안전하다"는 매우 다른 두 가지이기 때문입니다.
| 심각도 | 패턴 | 설명 |
|---|
| 🔴 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 참조 |
assets/ci/github-action-mongodb.yml3개 작업 — 정적 IaC 스캔 (항상 실행, 시크릿 없음), 라이브 감사 (vars.AUDIT_LIVE == 'true' 게이트), MongoBleed 프로브 (vars.MONGOBLEED_PROBE == 'true' + 소유권 확인 게이트) |
| 백엔드 | 내장 도구 | 놓치는 항목 | Database Sentinel이 커버 |
|---|
| Supabase | Splinter (16개 린트) | 정책이 실제로 무단 액세스를 방지하는지 여부 | 모든 테이블에 대한 모든 CRUD 경로의 라이브 tx=rollback 테스트 |
| Supabase | Splinter | 고스트 인증 (이메일 확인 우회) | .invalid TLD가 있는 가입 프로브 |
| Supabase | Splinter | WITH CHECK + 민감한 열이 없는 UPDATE를 통한 대량 할당 | 열 이름과 정책 형태 교차 참조 |
| Supabase | Splinter | 코드베이스 스캔 | 프론트엔드 코드의 service_role 키, 하드코딩된 JWT, 커밋된 .env 파일 발견 |
| MongoDB | Atlas Advisor | MongoBleed 런타임 확인 | 단일 패킷 프로토콜 수준 탐지기 (7.0.20 + 7.0.28에서 검증) |
| MongoDB | Atlas Advisor | 자체 수정 가능 역할 문서 | 소스 패턴 + 컬렉션 검증기 교차 확인 |
| MongoDB | Trivy / Aikido | Atlas 특정 구성 (허용 목록, IAM, CMK) | 직접 Atlas Admin API 감사 |
| MongoDB | mongoaudit (2018년 중단) | 2025년 이후 활성 | 2025–2026 CVE가 포함된 유지 관리 패턴 카탈로그 |