A Claude Skill that audits your database backends for security vulnerabilities.
Drop it into Claude Code, Cursor, or any Claude-powered environment. Say "audit my database" and get a comprehensive security report with exact fix code β in minutes, not days.
170+ Lovable apps were breached. 20.1M rows were exposed across YC startups. ~87,000 MongoDB instances were left vulnerable to MongoBleed (CVE-2025-14847, CISA KEV). 1.8M Firebase passwords leaked in a single 2025 incident. 45% of AI-generated code introduces OWASP Top 10 vulnerabilities. Database Sentinel tests whether your security configuration actually works β not just whether it's present.
Database Sentinel performs a 7-step security audit on whichever backend(s) your project uses:
- Detects which backends you're using (Supabase, Firebase, MongoDB, self-hosted Postgres / MySQL)
- Scans your codebase for exposed credentials, hardcoded keys, secrets in git
- Introspects each backend β schema, policies, rules, users, roles, configuration
- Matches findings against backend-specific anti-pattern catalogs sourced from CVEs, breach reports, CIS benchmarks, and 2025β2026 vibe-coding research
- Dynamically probes with safe primitives (
tx=rollback, canary collections, opt-in MongoBleed detector) - Generates a scored security report with plain-English explanations and concrete attacker scenarios
- Produces exact fix code β SQL DDL, rule files, config diffs, Terraform β copy, paste, done
Cross-backend reasoning catches issues that single-backend scanners miss (e.g., a Firebase Auth UID trusted by a Postgres API without JWT verification).
| Phase | Backend | Status |
|---|---|---|
| 1 | Supabase | β shipped |
| 2 | MongoDB (self-hosted + Atlas) | β shipped |
| 3 | Firebase (Firestore / RTDB / Storage / Functions / Remote Config) | π§ planned |
| 4 | PostgreSQL (self-hosted, including pgBouncer) | π§ planned |
| 5 | MySQL (self-hosted) | π§ planned |
| 6 | Cross-backend interaction analysis | π§ planned |
| 7 | Distribution + polish | π§ planned |
Database Sentinel was previously Supabase Sentinel (single-backend). The rename happened during Phase 1 of the multi-backend expansion. A backwards-compat shim at compat/supabase-sentinel/ preserves the old skill name through at least the next minor release β existing users see no regression.
Clone the skill into your project's skills directory, or a central one:
git clone https://github.com/Farenhytee/database-sentinel.git ~/claude-skills/database-sentinelThen ask Claude:
Audit my database
Database Sentinel will detect which backend(s) your project uses, run the relevant audits, and produce a unified report. If multiple backends are present (Firebase Auth + Postgres data, etc.), the report includes a cross-backend interactions section once Phase 6 lands.
If you only want to audit a specific backend, ask explicitly:
Audit my Supabase project
Audit my MongoDB instance
The dispatcher narrows the scope.
Copy the contents of SKILL.md plus the relevant backends/<name>/workflow.md into your system prompt. Walk through the 7 steps with your credentials.
| Severity | Pattern | What |
|---|---|---|
| π΄ CRITICAL | SB-001 RLS_DISABLED |
Tables without Row-Level Security β fully exposed to the internet |
| π΄ CRITICAL | SB-002 SERVICE_ROLE_EXPOSED |
service_role key in frontend code β bypasses ALL security |
| π΄ CRITICAL | SB-003 POLICIES_BUT_NO_RLS |
Policies written but RLS never enabled β false security |
| π΄ CRITICAL | SB-005 WRITE_USING_TRUE |
INSERT/UPDATE/DELETE with USING(true) β anyone can modify |
| π HIGH | SB-006 USING_TRUE_SELECT |
All rows readable by anonymous users on sensitive tables |
| π HIGH | SB-007 VIEW_NO_SECURITY_INVOKER |
Views bypass RLS, run as superuser |
| π HIGH | SB-008 SECURITY_DEFINER_EXPOSED |
Functions in public schema bypass RLS, callable via API |
| π HIGH | SB-009 USER_METADATA_IN_POLICY |
Policies reference user-modifiable metadata β privilege escalation |
| π HIGH | SB-010 UPDATE_NO_WITHCHECK |
UPDATE policies without WITH CHECK β mass assignment risk |
| π HIGH | SB-011 GHOST_AUTH |
Unconfirmed email signups grant authenticated sessions |
| π HIGH | SB-012 STORAGE_NO_RLS |
Storage bucket missing access control policies |
| π HIGH | SB-013 JWT_SECRET_EXPOSED |
JWT signing secret leaked β can forge any user's token |
| π‘ MEDIUM | + 15 more patterns | See backends/supabase/anti-patterns.md |
| Severity | Pattern | What |
|---|---|---|
| π΄ CRITICAL | MG-SH-001 MongoBleed (CVE-2025-14847, CISA KEV) |
Pre-auth heap memory disclosure via crafted compressed packet. ~87K instances exposed at disclosure. |
| π΄ CRITICAL | MG-SH-002 Auth disabled |
mongod running with no authentication β Meow ransomware attack surface |
| π΄ CRITICAL | MG-SH-003 Internet-bound mongod |
--bind_ip_all + 27017 reachable β paired with MG-SH-002 for total compromise |
| π΄ CRITICAL | MG-AT-001 Atlas allowlist 0.0.0.0/0 |
Atlas cluster reachable from anywhere on the internet |
| π HIGH | MG-SH-004 localhost auth bypass + container exec |
enableLocalhostAuthBypass true + docker exec access |
| π HIGH | MG-SH-005 Server-side JS enabled |
$where / $function / mapReduce reachable β NoSQL-RCE surface |
| π HIGH | MG-SH-006 TLS not required |
Plaintext traffic on the wire |
| π HIGH | MG-SH-007 Privileged role on app user |
App connects as root / dbAdminAnyDatabase etc. |
| π HIGH | MG-SH-008 Self-modifiable role document |
findByIdAndUpdate(id, req.body) + no validator + role field |
| π HIGH | MG-AT-002 Atlas Function as DB pass-through |
NoSQL injection over HTTPS β proliferated post-Data-API-deprecation |
| π HIGH | MG-AT-003 Atlas Data API still in code |
Deprecated Sept 30 2025; broken AND likely rotated to less-audited Functions |
| π‘ MEDIUM | MG-SH-009 Mongoose < 8.9.5 |
CVE-2024-53900 / CVE-2025-23061 β populate-match $where injection |
| π‘ MEDIUM | + 8 more patterns | See backends/mongodb/anti-patterns.md |
The MongoBleed network probe (backends/mongodb/mongobleed-probe.md) ships a single-packet detector that confirms exploitability at runtime β verified against mongo:7.0.20 (vulnerable) and mongo:7.0.28 (patched). It's read-only, gated behind two opt-in confirmations, and never extracts content.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 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":"user@real.com",...}]
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
How progressive disclosure works: Claude loads only SKILL.md (~2K tokens) plus core/* initially. When detection identifies a backend, the matching backends/<name>/workflow.md and on-demand reference files load. A Supabase-only audit doesn't pay the cost of MongoDB content; future Firebase / Postgres / MySQL extensions follow the same pattern.
Each implemented backend ships a CI workflow template:
| Backend | Workflow | Job modes |
|---|---|---|
| Supabase | assets/ci/github-action-supabase.yml |
Single job β security audit (introspection + dynamic probes) |
| MongoDB | assets/ci/github-action-mongodb.yml |
Three jobs β static IaC scan (always runs, no secrets), live audit (gated on vars.AUDIT_LIVE == 'true'), MongoBleed probe (gated on vars.MONGOBLEED_PROBE == 'true' + ownership confirmation) |
Workflows trigger on relevant file changes (migrations, rule files, IaC, dependency manifests), weekly cron (Monday 06:00 UTC), and manual dispatch. They post PR comments, upload report artifacts, and fail the build on critical findings.
Just ask: "Set up continuous security monitoring for this project."
Database Sentinel's anti-pattern database is sourced from:
- CVE-2025-48757 β 170+ Lovable apps exposed, CVSS 9.3 (Matt Palmer, May 2025)
- Escape.tech β 2,000+ vulnerabilities across 5,600 vibe-coded apps (October 2025)
- Veracode β 45% of AI-generated code introduces OWASP Top 10 vulnerabilities (July 2025)
- Carnegie Mellon SusVibes β 82.8% of functionally correct AI code was insecure (December 2025)
- SupaExplorer β 11% of indie apps expose Supabase credentials (January 2026)
- ModernPentest β 20.1M rows exposed across 107 YC startups (March 2026)
- OpenFirebase / Icex0 (Sept 2025) β ~150 Firebase apps with unauthenticated read/write
- Zendata (May 2025) β 1.8M plaintext Firebase passwords leaked across 900+ apps
- GitGuardian β 19.8M Firebase secrets leaked in public GitHub
- Supabase Splinter β All 16 official security lints mapped and extended
- Wiz Research β Critical auth bypass in Base44 vibe-coding platform (July 2025)
- CVE-2025-14847 "MongoBleed" (CVSS 8.7, CISA KEV) β pre-auth heap disclosure, ~87K exposed instances
- CVE-2024-53900 / CVE-2025-23061 β Mongoose populate-match
$whereinjection - CVE-2025-30706 β MongoDB Connector/J critical (Oracle CPU April 2025)
- MongoDB Atlas Data API deprecation (Sept 30 2025)
- Shadowserver / Meow ransomware tracking (continuing 2024β2025 sweeps)
- CIS MongoDB 7 Benchmark v1.2
See references/vibe-coding-context.md and references/cve-feed.md for the full citation set.
| Backend | Built-in tool | What it misses | Database Sentinel covers |
|---|---|---|---|
| Supabase | Splinter (16 lints) | Whether policies actually prevent unauthorized access | Live tx=rollback testing of every CRUD path against every table |
| Supabase | Splinter | Ghost-auth (email-confirmation bypass) | Sign-up probe with .invalid TLD |
| Supabase | Splinter | Mass-assignment via UPDATE without WITH CHECK + sensitive columns |
Cross-references column names with policy shape |
| Supabase | Splinter | Codebase scanning | Finds service_role keys in frontend code, hardcoded JWTs, committed .env files |
| MongoDB | Atlas Advisor | MongoBleed runtime confirmation | Single-packet protocol-level detector (verified against 7.0.20 + 7.0.28) |
| MongoDB | Atlas Advisor | Self-modifiable role documents | Source-pattern + collection-validator cross-check |
| MongoDB | Trivy / Aikido | Atlas-specific config (allowlists, IAM, CMK) | Direct Atlas Admin API audit |
| MongoDB | mongoaudit (abandoned 2018) | Active in 2025+ | Maintained pattern catalog with 2025β2026 CVEs |
Database Sentinel is designed to be safe for production use:
- Default read-only. Introspection queries only read system catalogs (
pg_tables,pg_policies,getCmdLineOpts, etc.). No DDL or DML by default. - Write probes are opt-in. Per-backend strategy:
- Supabase β
Prefer: tx=rollback(PostgREST native; zero data modified) - Postgres self-hosted β
BEGINβ¦ROLLBACK(transactional DDL) - MongoDB replica/sharded β session +
abortTransaction() - MongoDB standalone β canary collection insert+delete (best-effort cleanup, framed as opt-in)
- Firebase β canary collection at
/_sentinel_probe/{random} - MySQL self-hosted β
_sentinel_probeschema +DROP DATABASE(opt-in, destructive β explicit warning)
- Supabase β
- Network probes (MongoBleed) are double-opt-in. Audit policy must enable network probes AND user must confirm host ownership separately. Some monitoring tools alert on the probe packet, even though it's a single 42-byte read-only test.
- Auth probes use
.invalidTLD. Test emails use RFC 6761 reserved domains that cannot receive mail. - Credentials never stored. Held in memory for the audit, discarded at end. Reports redact credential values.
- Open source. Audit the auditor β every query, probe, and pattern is in this repo.
Contributions are welcome. The most valuable contributions:
- New anti-patterns β Found a security issue not in our database? Add it to the relevant
backends/<name>/anti-patterns.mdwith severity, detection query, fix code, and real-world evidence (CVE / breach / Splinter / CIS). - Fix template improvements β Better policy patterns, edge cases, or performance optimizations in
backends/<name>/fix-templates.md. - Live testing β Run Database Sentinel against your own backends and report false positives / negatives. Live testing is what caught three real bugs during Phase 2 (see
backends/mongodb/mongobleed-probe.md"Empirically verified" annotations). - New backend extensions β Phases 3β5 are open. Follow the structure of
backends/mongodb/andbackends/supabase/. The implementation plan (sentinel-implementation-plan.md) has the contract for each. - Vibe-coding pattern attribution β When you find a pattern that's plausibly AI-generated by Cursor / Bolt / Lovable / Claude Code, document it. This is the project's wedge.
- Fork the repo
- Branch (
git checkout -b add-new-pattern) - Add your changes with clear documentation and citations
- PR with a description of the pattern and evidence
- Phase 3 β Firebase (Firestore + RTDB + Storage + Cloud Functions + Remote Config + App Check). The largest extension; sub-modules per Firebase product to manage token budget.
- Phase 4 β PostgreSQL self-hosted, including pgBouncer (CVE-2025-12819 detection)
- Phase 5 β MySQL self-hosted (Oracle CPU CVE coverage;
mysql_native_passworddeprecation handling for 8.4+) - Phase 6 β Cross-backend interaction analysis (Firebase Auth β Postgres trust paths, etc.)
- Phase 7 β README polish (this),
BACKENDS.mdquick reference, deprecation timeline for thesupabase-sentinelshim
- CLI tool β
npx database-sentinel auditfor non-Claude environments - MCP server β programmatic access for CI/CD and dashboards
- VS Code extension β inline security warnings in the editor
- Premium dashboard β historical trending, multi-project views, Slack alerts
- Supabase Sentinel (v1) β single-backend Supabase auditor. Original release.
- Sentinel (working name during Phase 1 architectural refactor)
- DB Sentinel (v2, transitional working name during multi-backend rollout)
- Database Sentinel (v3, current) β multi-backend; full word "database" for explicit skill-discovery framing and to match the GitHub repo name
The supabase-sentinel skill name still works via the compat shim at compat/supabase-sentinel/. It forces the audit to Supabase only and produces output indistinguishable from v1. Sunset date: TBD; through at least the next minor release.
MIT β use it however you want, commercially or otherwise.
Built for the vibe-coding era.
Because "it works" and "it's secure" are two very different things.