ImadCreates/firewarden

GitHub: ImadCreates/firewarden

Firewarden 是一款 Firebase Firestore 安全规则扫描器,能发现导致数据泄露的错误配置并自动生成加固规则和验证测试。

Stars: 1 | Forks: 0

# Firewarden [![npm version](https://img.shields.io/npm/v/firewarden.svg)](https://www.npmjs.com/package/firewarden) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/ImadCreates/firewarden/actions/workflows/ci.yml) ![Firewarden 扫描真实的 firestore.rules 文件](https://raw.githubusercontent.com/ImadCreates/firewarden/master/assets/firewardendemo.gif) 找出在 Firebase 应用中导致数据泄露的开放数据库规则。Firewarden 会发现不安全的规则,编写加固后的版本,并生成用于验证修复效果的 emulator 测试。 ## 为什么需要 行级访问权限配置错误是 AI 构建和快速交付应用中导致数据泄露的最大根源。现有的扫描器更偏向 Supabase,而且仅仅停留在告诉你“有问题”的层面。Firewarden 是 Firestore 优先的,它能做真正为你节省时间的两件事:编写修正后的规则,以及编写在旧规则下失败、在新规则下通过的 emulator 测试。让你带着证据发布修复,而不是凭感觉。 ## 安装 ``` npm install -g firewarden ``` ## 使用 ``` firewarden scan ./firestore.rules ``` 扫描 [Excalidraw](https://github.com/excalidraw/excalidraw) 生产环境 `firestore.rules` 的真实输出: ``` firestore.rules — 1 finding CRITICAL firestore.rules:5 RECURSIVE_WILDCARD_OPEN /{document=**} This rule matches every document in the entire database via the recursive wildcard /{document=**} and grants blanket access. `if true` disables all access control. Suggested fix: // Firewarden suggestion, review before shipping // Lock the catch-all, then grant access per collection explicitly. match /{document=**} { allow read, write: if false; } 1 critical, 0 high, 0 medium, 0 low ``` 当任何发现的严重程度达到或超过 `--min-severity`(默认为 `high`)时,退出代码为 1,因此 CI 会在遇到真正的问题时失败,并在仅有信息提示时保持通过状态。 ### 格式与选项 ``` firewarden scan firestore.rules # pretty terminal report firewarden scan firestore.rules --format json # machine-readable Report firewarden scan firestore.rules --format sarif # GitHub code scanning firewarden scan firestore.rules --min-severity critical firewarden scan firestore.rules --write-tests # emit emulator specs to firewarden-tests/ ``` `--write-tests` 会为每个发现编写一个 `@firebase/rules-unit-testing`(v3 API)测试用例。每个测试用例在针对易受攻击的规则时会失败,并在规则加固后通过: ``` firebase emulators:exec --only firestore 'npx vitest run firewarden-tests' ``` ### 在 CI 中使用 ``` # .github/workflows/firewarden.yml - run: npx firewarden scan firestore.rules --min-severity high ``` 或者作为 GitHub Action 使用(已在此仓库的 CI 中完成端到端验证): ``` - uses: ImadCreates/firewarden@v0.1.2 with: rules: firestore.rules min-severity: high ``` 或者上传 SARIF,以便在 PR 中内联标注发现的问题: ``` - run: npx firewarden scan firestore.rules --format sarif > firewarden.sarif continue-on-error: true - uses: github/codeql-action/upload-sarif@v3 with: sarif_file: firewarden.sarif ``` ## 检查内容 | 探测器 | 严重程度 | 触发条件 | |---|---|---| | `OPEN_ACCESS` | critical | 可证明是无条件的 `allow read, write`(如 `if true`、无条件,或者像 `1 == 1` 或 `true \|\| x` 这样的恒真表达式) | | `PUBLIC_WRITE` | critical | 无条件的 `write`/`create`/`update`/`delete` —— 开放的写入几乎总是 bug | | `RECURSIVE_WILDCARD_OPEN` | critical / medium | 在 `match /{document=**}` 内部的开放允许 —— 当写入开放时为 critical,当仅读取开放时为 medium | | `MISSING_TENANCY` | high | 永远不引用路径 ID、所有者检查或租户字段的条件 —— 会导致一个客户读取另一个客户的数据行 | | `AUTH_ONLY_NOT_AUTHZ` | medium | 针对用户数据完全匹配 `request.auth != null` —— 已认证不等于已授权 | | `UNVALIDATED_WRITE` | medium | 仅由可变的文档状态限定的更新(`resource.data.orgId == ...`),且对传入数据没有任何约束 —— 写入者可以重新分配用于限定访问权限的字段 | | `PUBLIC_READ` | low | 在同时接受客户端写入的块中的无条件读取 | ## 精准优于噪声 基于真实的生产环境规则文件进行了校准(Excalidraw、日本的 COVID-19 接触追踪后端、Reach4Help、CustomerDB、GDG Hoverboard —— 全部作为回归测试固件收录在 [`fixtures/realworld/`](fixtures/realworld/) 中): - **无条件的写入是 bug 信号;无条件的读取通常是刻意为之。** 当同一块中的写入被锁定(`if false` 或缺失)时,公开读取将完全被忽略 —— 这正是每个内容网站都在使用的“刻意公开内容”模式。 - **Firewarden 绝不猜测。** 条件由常量评估器判定:只有由字面量构建的表达式才能被判定为“证明开放”,而任何引用运行时状态的表达式 —— 或调用其无法看到函数体的函数 —— 都会被原样保留。 - **每个根本原因只有一个发现。** 在通配符上开放的 `read, write` 是一个 critical 发现,而不是三个重叠的发现。 ## 路线图 - Supabase RLS 扫描(没有 RLS 的表、`USING (true)`、service-role 暴露) - 实时探测模式(使用 anon key 确认暴露情况) - 自动修复 PR ## 许可证 MIT © Imaduddin Ahmed。欢迎贡献代码。
标签:Firebase, GNU通用公共许可证, MITM代理, Node.js, SAST, URL发现, 代码安全, 安全检测, 暗色界面, 漏洞枚举, 盲注攻击, 自动化攻击