Farenhytee/database-sentinel

GitHub: Farenhytee/database-sentinel

一个以 Claude Skill 形式运行的数据库后端安全审计工具,能自动检测 Supabase 和 MongoDB 的凭据泄露、RLS 错配、认证绕过等安全反模式并生成可直接使用的修复代码。

Stars: 31 | Forks: 4

# 🛡️ Database Sentinel **一个 Claude Skill,用于审计您的数据库后端安全漏洞。** 将其放入 Claude Code、Cursor 或任何支持 Claude 的环境中。只需说“audit my database”(审计我的数据库),即可在几分钟(而非几天)内获得包含精确修复代码的综合安全报告。 ## 它的功能 Database Sentinel 会对您的项目使用的后端执行 7 步安全审计: 1. **检测**您正在使用的后端(Supabase、Firebase、MongoDB、自托管的 Postgres / MySQL) 2. **扫描您的代码库**,查找暴露的凭据、硬编码的密钥、git 中的秘密信息 3. **内省每个后端** —— schema、策略、规则、用户、角色、配置 4. **将发现的问题与特定于后端的反模式目录进行匹配**,这些目录源自 CVE、违规报告、CIS 基准以及 2025–2026 年的 vibe-coding 研究 5. **使用安全的原语进行动态探测**(`tx=rollback`、金丝雀集合、可选启用的 MongoBleed 检测器) 6. **生成带有评分的安全报告**,包含通俗易懂的英文解释和具体的攻击者场景 7. **生成精确的修复代码** —— SQL DDL、规则文件、配置差异、Terraform —— 复制、粘贴即可搞定 跨后端推理能够捕捉到单一后端扫描器遗漏的问题(例如,一个被 Postgres API 信任的 Firebase Auth UID,却没有进行 JWT 验证)。 ## 状态 | 阶段 | 后端 | 状态 | |-------|---------|--------| | 1 | Supabase | ✅ 已发布 | | 2 | MongoDB (自托管 + Atlas) | ✅ 已发布 | | 3 | Firebase (Firestore / RTDB / Storage / Functions / Remote Config) | 🚧 计划中 | | 4 | PostgreSQL (自托管,包括 pgBouncer) | 🚧 计划中 | | 5 | MySQL (自托管) | 🚧 计划中 | | 6 | 跨后端交互分析 | 🚧 计划中 | | 7 | 分发与完善 | 🚧 计划中 | Database Sentinel 之前是 **Supabase Sentinel**(单一后端)。在多后端扩展的第一阶段进行了重命名。位于 `compat/supabase-sentinel/` 的向后兼容垫片在至少下一个次要版本发布之前保留了旧的技能名称 —— 现有用户不会看到任何功能回退。 ## 快速开始 ### 选项 1:Claude Code / Cursor 将该技能克隆到您项目的技能目录中,或一个中心目录中: ``` git clone https://github.com/Farenhytee/database-sentinel.git ~/claude-skills/database-sentinel ``` 然后向 Claude 提问: ``` Audit my database ``` Database Sentinel 将检测您的项目正在使用哪些后端,运行相关的审计,并生成一份统一的报告。如果存在多个后端(例如,Firebase Auth + Postgres 数据等),一旦第 6 阶段上线,报告将包含一个跨后端交互部分。 ### 选项 2:单后端调用 如果您只想审计特定的后端,请明确指出: ``` Audit my Supabase project Audit my MongoDB instance ``` 调度器会缩小范围。 ### 选项 3:手动 (任何 AI 助手) 将 `SKILL.md` 的内容以及相关的 `backends//workflow.md` 复制到您的系统提示词中。使用您的凭据完成这 7 个步骤。 ## 它能检测到什么 ### Supabase (阶段 1) — 27 种模式 | 严重性 | 模式 | 内容 | |----------|---------|------| | 🔴 严重 | `SB-001` `RLS_DISABLED` | 没有行级安全 (RLS) 的表 —— 完全暴露在互联网上 | | 🔴 严重 | `SB-002` `SERVICE_ROLE_EXPOSED` | 前端代码中的 service_role 密钥 —— 绕过所有安全机制 | | 🔴 严重 | `SB-003` `POLICIES_BUT_NO_RLS` | 编写了策略但从未启用 RLS —— 虚假的安全感 | | 🔴 严重 | `SB-005` `WRITE_USING_TRUE` | 带有 `USING(true)` 的 INSERT/UPDATE/DELETE —— 任何人都可以修改 | | 🟠 高 | `SB-006` `USING_TRUE_SELECT` | 敏感表的所有行可被匿名用户读取 | | 🟠 高 | `SB-007` `VIEW_NO_SECURITY_INVOKER` | 视图绕过 RLS,以超级用户身份运行 | | 🟠 高 | `SB-008` `SECURITY_DEFINER_EXPOSED` | 公共 schema 中的函数绕过 RLS,可通过 API 调用 | | 🟠 高 | `SB-009` `USER_METADATA_IN_POLICY` | 策略引用了用户可修改的元数据 —— 提权漏洞 | | 🟠 高 | `SB-010` `UPDATE_NO_WITHCHECK` | 没有 WITH CHECK 的 UPDATE 策略 —— 批量赋值风险 | | 🟠 高 | `SB-011` `GHOST_AUTH` | 未确认的电子邮件注册授予了已认证的会话 | | 🟠 高 | `SB-012` `STORAGE_NO_RLS` | 存储桶缺少访问控制策略 | | 🟠 高 | `SB-013` `JWT_SECRET_EXPOSED` | JWT 签名密钥泄露 —— 可以伪造任何用户的 token | | 🟡 中等 | + 另外 15 种模式 | 参见 `backends/supabase/anti-patterns.md` | ### MongoDB (阶段 2) — 20 种模式 | 严重性 | 模式 | 内容 | |----------|---------|------| | 🔴 严重 | `MG-SH-001` MongoBleed (CVE-2025-14847, CISA KEV) | 通过特制压缩包进行预认证堆内存泄露。在漏洞披露时约有 8.7 万个实例暴露。 | | 🔴 严重 | `MG-SH-002` Auth 已禁用 | mongod 在未开启身份验证的情况下运行 —— Meow 勒索软件的攻击面 | | 🔴 严重 | `MG-SH-003` 面向互联网的 mongod | `--bind_ip_all` + 27017 可达 —— 与 `MG-SH-002` 结合会导致彻底沦陷 | | 🔴 严重 | `MG-AT-001` Atlas 允许列表 `0.0.0.0/0` | Atlas 集群可从互联网上的任何位置访问 | | 🟠 高 | `MG-SH-004` localhost 认证绕过 + 容器执行 | `enableLocalhostAuthBypass` 为 true + `docker exec` 访问权限 | | 🟠 高 | `MG-SH-005` 已启用服务器端 JS | `$where` / `$function` / `mapReduce` 可达 —— NoSQL 远程代码执行 (RCE) 攻击面 | | 🟠 高 | `MG-SH-006` 未强制使用 TLS | 网络上传输明文流量 | | 🟠 高 | `MG-SH-007` 应用用户拥有特权角色 | 应用以 `root` / `dbAdminAnyDatabase` 等身份连接 | | 🟠 高 | `MG-SH-008` 可自修改的角色文档 | `findByIdAndUpdate(id, req.body)` + 无验证器 + role 字段 | | 🟠 高 | `MG-AT-002` Atlas Function 作为数据库直通 | 通过 HTTPS 进行 NoSQL 注入 —— 在 Data API 废弃后激增 | | 🟠 高 | `MG-AT-003` Atlas Data API 仍在代码中 | 于 2025 年 9 月 30 日废弃;不仅已失效,而且很可能被替换为审查力度较小的 Functions | | 🟡 中等 | `MG-SH-009` Mongoose < 8.9.5 | CVE-2024-53900 / CVE-2025-23061 —— populate-match `$where` 注入 | | 🟡 中等 | + 另外 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":"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 ``` **渐进式披露的工作原理:** Claude 一开始只加载 `SKILL.md`(约 2K token)和 `core/*`。当检测识别到某个后端时,会加载匹配的 `backends//workflow.md` 以及按需加载的参考文件。仅针对 Supabase 的审计不会消耗加载 MongoDB 内容的开销;未来的 Firebase / Postgres / MySQL 扩展也将遵循相同的模式。 ## 持续监控 (GitHub Actions) 每个已实现的后端都提供了一个 CI 工作流模板: | 后端 | 工作流 | 作业模式 | |---------|----------|-----------| | Supabase | `assets/ci/github-action-supabase.yml` | 单一作业 —— 安全审计(内省 + 动态探测) | | MongoDB | `assets/ci/github-action-mongodb.yml` | 三个作业 —— 静态 IaC 扫描(始终运行,无需密钥)、实时审计(取决于 `vars.AUDIT_LIVE == 'true'`)、MongoBleed 探测(取决于 `vars.MONGOBLEED_PROBE == 'true'` + 所有权确认) | 工作流会在相关文件发生更改(迁移、规则文件、IaC、依赖清单)、每周定时触发(UTC 时间周一 06:00)以及手动触发时运行。它们会发布 PR 评论、上传报告构件,并在发现严重问题时判定构建失败。 只需提问:“Set up continuous security monitoring for this project.” ## 研究支撑 Database Sentinel 的反模式数据库来源于: ### Supabase / Firebase / vibe-coding 生态系统 - **CVE-2025-48757** —— 超过 170 个 Lovable 应用暴露,CVSS 9.3 (Matt Palmer,2025 年 5 月) - **Escape.tech** —— 5,600 个 vibe-coded 应用中发现了 2,000 多个漏洞 (2025 年 10 月) - **Veracode** —— 45% 的 AI 生成代码引入了 OWASP Top 10 漏洞 (2025 年 7 月) - **Carnegie Mellon SusVibes** —— 82.8% 功能正确的 AI 代码是不安全的 (2025 年 12 月) - **SupaExplorer** —— 11% 的独立应用暴露了 Supabase 凭据 (2026 年 1 月) - **ModernPentest** —— 107 家 YC 创业公司的 2010 万行数据被暴露 (2026 年 3 月) - **OpenFirebase / Icex0 (2025 年 9 月)** —— 约 150 个 Firebase 应用存在未经身份验证的读写 - **Zendata (2025 年 5 月)** —— 超过 900 个应用中的 180 万个 Firebase 明文密码被泄露 - **GitGuardian** —— GitHub 公共仓库中泄露了 1980 万个 Firebase 密钥 - **Supabase Splinter** —— 映射并扩展了全部 16 个官方安全 lint - **Wiz Research** —— Base44 vibe-coding 平台中的严重身份验证绕过 (2025 年 7 月) ### MongoDB / Atlas - **CVE-2025-14847 "MongoBleed"** (CVSS 8.7, CISA KEV) —— 预认证堆内存泄露,约 8.7 万个暴露实例 - **CVE-2024-53900 / CVE-2025-23061** —— Mongoose populate-match `$where` 注入 - **CVE-2025-30706** —— MongoDB Connector/J 严重漏洞 (Oracle CPU 2025 年 4 月) - **MongoDB Atlas Data API 废弃** (2025 年 9 月 30 日) - **Shadowserver / Meow 勒索软件追踪** (持续进行 2024–2025 年扫描) - **CIS MongoDB 7 Benchmark v1.2** 完整的引用集请参见 `references/vibe-coding-context.md` 和 `references/cve-feed.md`。 ## Database Sentinel 能捕捉到哪些内置工具遗漏的问题 | 后端 | 内置工具 | 遗漏了什么 | Database Sentinel 涵盖了 | |---------|---------------|----------------|---------------------| | Supabase | Splinter (16 种 lint) | 策略是否真正阻止了未授权访问 | 针对每个表,对每个 CRUD 路径进行实时的 `tx=rollback` 测试 | | Supabase | Splinter | Ghost-auth(电子邮件确认绕过) 使用 `.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 的模式目录 | ## 安全性 Database Sentinel 的设计旨在安全地用于生产环境: - **默认只读。** 内省查询仅读取系统目录(`pg_tables`、`pg_policies`、`getCmdLineOpts` 等)。默认不执行任何 DDL 或 DML。 - **写入探测需要主动启用。** 针对每个后端的策略: - **Supabase** —— `Prefer: tx=rollback` (PostgREST 原生;零数据修改) - **Postgres 自托管** —— `BEGIN…ROLLBACK` (事务性 DDL) - **MongoDB 副本/分片** —— session + `abortTransaction()` - **MongoDB 单机版** —— 金丝雀集合的插入+删除(尽最大努力清理,需选择启用) - **Firebase** —— 位于 `/_sentinel_probe/{random}` 的金丝雀集合 - **MySQL 自托管** —— `_sentinel_probe` schema + `DROP DATABASE`(需选择启用,具有破坏性 —— 明确警告) - **网络探测 需经过双重选择启用。** 审计策略必须启用网络探测,并且用户必须单独确认主机所有权。一些监控工具会对探测数据包发出警报,即使它只是一个 42 字节的只读测试。 - **身份验证探测使用 `.invalid` TLD。** 测试电子邮件使用 RFC 6761 保留的无法接收邮件的域名。 - **凭据从不存储。** 仅在审计期间保存在内存中,结束时丢弃。报告会隐去凭据值。 - **开源。** 您可以审计这个审计工具 —— 每个查询、探测和模式都在这个代码库中。 ## 路线图 ### 即将发布 - **阶段 3** —— Firebase (Firestore + RTDB + Storage + Cloud Functions + Remote Config + App Check)。这是最大的扩展;每个 Firebase 产品都有子模块,以管理 token 预算。 - **阶段 4** —— PostgreSQL 自托管,包括 pgBouncer (CVE-2025-12819 检测) - **阶段 5** —— MySQL 自托管 (Oracle CPU CVE 覆盖范围;针对 8.4+ 的 `mysql_native_password` 废弃处理) - **阶段 6** —— 跨后端交互分析 (Firebase Auth → Postgres 信任路径等) - **阶段 7** —— README 润色(即本文档)、`BACKENDS.md` 快速参考、`supabase-sentinel` 垫片的废弃时间表 ### 未来 - **CLI 工具** —— `npx database-sentinel audit`,适用于非 Claude 环境 - **MCP 服务器** —— 为 CI/CD 和仪表板提供编程式访问 - **VS Code 扩展** —— 在编辑器中显示内联安全警告 - **高级仪表板** —— 历史趋势、多项目视图、Slack 警报 ## 命名历史 - **Supabase Sentinel** (v1) —— 单一后端的 Supabase 审计器。最初发布版。 - **Sentinel**(第一阶段架构重构期间的工作名称) - **DB Sentinel** (v2,多后端推出期间的过渡工作名称) - **Database Sentinel** (v3,当前版本) —— 多后端支持;使用完整的 "database" 单词以实现明确的技能发现定位,并与 GitHub 仓库名称匹配 `supabase-sentinel` 技能名称仍可通过位于 `compat/supabase-sentinel/` 的兼容垫片使用。它会强制仅对 Supabase 进行审计,并生成与 v1 无异的输出。废弃日期:待定;至少在下一个次要版本之前会继续保留。 ## 许可证 MIT —— 随意使用,无论是商业还是其他用途。

为 vibe-coding 时代而生。
因为“能用”和“安全”完全是两码事。

标签:AI编程安全, Anthropic, CISA项目, CIS基准, Claude代码, Claude技能, Cursor, ECS, Firebase, MongoDB, PostgreSQL, RLS策略, SQL DDL, StruQ, Supabase, Terraform, 代码安全, 凭证泄露, 反模式匹配, 多线程, 存储安全, 安全报告, 模块化设计, 漏洞枚举, 生产安全, 硬编码密钥检测, 自动化修复, 行级安全, 跨后端分析, 身份验证绕过