Perufitlife/firebase-security-skill

GitHub: Perufitlife/firebase-security-skill

专门审计 Firebase Firestore 安全规则的轻量工具,通过静态模式分析加主动匿名探测,发现并确认规则误配置导致的数据泄露风险。

Stars: 1 | Forks: 0

# Firebase Firestore 规则安全审计 [![npm](https://img.shields.io/npm/v/firebase-security?color=red)](https://www.npmjs.com/package/firebase-security) ![license](https://img.shields.io/badge/license-MIT-green) ![node](https://img.shields.io/badge/node-%3E%3D18-blue) ## 为什么会存在这个工具 Firebase Firestore 规则很容易写错,而且其失败模式是最糟糕的:静默且全面地暴露。我经常反复看到以下模式: - **`match /{document=**} { allow read, write: if true; }`** — `firebase init` 遗留的产物。任何拥有项目 ID 的人都可以转储(dump)所有集合。曾多次登上 Hacker News 头条。 - **`request.time < timestamp.date(2026, 6, 1)`** — Firebase 在测试模式下生成的规则。在一个日期后过期,但在该日期之前是完全敞开的。 - **`if request.auth != null`** 但没有进行所有权检查 — 与 PocketBase 的 `@request.auth.id != ""` 反模式相同。任何通过匿名身份验证的用户都可以读写所有内容。 - **读取开放 + 写入关闭的兜底匹配** — 开发者锁定了写入,却忘记了读取仍然是公开的。 - **用户上传文件的 Storage `allow read: if true`** — 暴露了私密文件(个人身份信息文档、支付凭证)。 ## 安装与运行 针对本地规则文件运行(无需身份验证): ``` npx firebase-security firestore.rules ``` 开启主动探测(向项目的 REST 端点发送匿名 GET 请求): ``` npx firebase-security firestore.rules --project-id my-firebase-project --html report.html ``` 仅探测模式(不需要规则文件,仅验证已部署的数据库是否允许匿名读取): ``` npx firebase-security --project-id my-firebase-project --html report.html ``` ## 检查内容 | # | 检查项 | 严重程度 | |---|---|---| | 1 | `match /{document=**}` 搭配 `if true`(臭名昭著的完全开放模式) | **CRITICAL** | | 2 | 规则中任意位置出现 `if true` 字面量 | **CRITICAL** | | 3 | 包含 `if request.auth != null` 但没有所有权检查 | HIGH | | 4 | 测试模式的时间戳规则(在过期日期前处于开放状态) | HIGH | | 5 | 兜底匹配中读取开放 + 写入关闭 | MEDIUM | | 6 | Storage 规则中用户上传文件存在开放读取权限 | HIGH | | 7 | 缺少显式的默认拒绝块 | INFO | 每项发现都附带一段修复代码片段,您可以直接粘贴回 `firestore.rules` 中。 ## 主动探测 探测功能会向以下地址发送未经身份验证的 GET 请求: ``` https://firestore.googleapis.com/v1/projects/{project-id}/databases/(default)/documents ``` 如果返回了文档,则说明该项目的默认数据库存在泄露,并且发现结果将被标记为 `confirmed: true`,同时附带返回的文档数量 + 字节数 + 示例路径。 `--no-probe` 选项可禁用此网络调用。 ## 如何查找您的项目 ID 在 Firebase 控制台中:**Project Settings → General → Project ID**(类似于 `my-app-1a2b3` 或您命名的任何名称)。 探测只会发送未经身份验证的 GET 请求 — 这与任何碰巧知道您项目 ID 的普通访客所能发送的请求完全相同。我们不需要(也不想要)您的服务账号密钥。 ## 输出 - **HTML 报告** — 使用 Tailwind + Chart.js,约 25KB 的自包含文件。顶部横幅会显示经过实时确认的 Y 个疑似泄露中的 X 个。 - **JSON** — 完整的结构化发现结果(如果不指定 `--html`,则默认输出到标准输出)。 ## 许可证与源码 MIT。开源地址:https://github.com/Perufitlife/firebase-security-skill 关于 BaaS 家族,请参见: - Supabase:https://github.com/Perufitlife/supabase-security-skill - PocketBase:https://github.com/Perufitlife/pocketbase-security-skill - Appwrite:https://github.com/Perufitlife/appwrite-security-skill - Hasura/Nhost:https://github.com/Perufitlife/nhost-security-skill ## 集成模式参考 请参阅 [`rotatepilot-skyx-sandbox`](https://github.com/Perufitlife/rotatepilot-skyx-sandbox),查看合作伙伴如何在单个静态页面中使用我们的公共 REST API 的实时演示 — 该项目构建于 2026 年 5 月 12 日,旨在回应一家航空平台的合作引入。我们采用了与 `firebase-security` 集成相同的 JSON 契约 / CORS / 边缘服务方案。 ## 姊妹 AI 文本工具 如果您的团队使用 AI 撰写外发邮件、PR 描述或社交媒体帖子,[aitells](https://aitells.vercel.app) 生态系统可以在这些内容发布前捕获其中的 AI 痕迹: - [`@perufitlife/aitells-mcp`](https://www.npmjs.com/package/@perufitlife/aitells-mcp) — 适用于 Claude Code / Cursor 的 MCP server。提供 `detect_ai_tells` + `humanize_text` 作为原生工具。 - [`Perufitlife/aitells-action`](https://github.com/Perufitlife/aitells-action) — GitHub Action,用于扫描 PR 标题/正文/提交信息中的 AI 模式。会发布友好的摘要评论。 - [aitells.vercel.app](https://aitells.vercel.app) — 免费检测器 + 19 美元终身人性化工具(限前 100 名购买者)
标签:CISA项目, DevSecOps, Firebase, Firestore, GNU通用公共许可证, MITM代理, Node.js, npm包, PII泄露, REST API, Streamlit, Web安全, 上游代理, 安全合规, 开源安全工具, 暗色界面, 未授权访问, 白盒测试, 移动安全后端, 网络代理, 网络安全, 网络安全, 自定义脚本, 蓝队分析, 规则检测, 访问控制, 逆向工程平台, 隐私保护, 隐私保护, 黑盒测试