数据库
在审计使用 Supabase 的客户端应用时…
已知或可提取 Supabase URL,并需要从目标 Web 应用客户端代码中获取 anon key 进行 RLS/API 安全审计时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在审计使用 Supabase 的客户端应特定
解决思路
- 在执行过程中必须渐进式写入,而不是等技能结束:在开始任何动作前,将动作记录到 `.sb-pentest-audit.log`。
- 在每次发现后,立即更新 `.sb-pentest-context.json`。
- 在每个重要步骤后,将完成情况记录到 `.sb-pentest-audit.log`。
- 如果 `.sb-pentest-context.json` 或 `.sb-pentest-audit.log` 不存在,先创建再写入。
- 在 `.sb-pentest-context.json` 中写入 `supabase.anon_key`、`supabase.anon_key_decoded`(包含 `iss`、`ref`、`role`、`iat`、`exp`)、`supabase.anon_key_sources`(包含 `file`、`line`)。
- 日志使用格式:`[TIMESTAMP] [supabase-extract-anon-key] [START] Beginning anon key extraction`、`[TIMESTAMP] [supabase-extract-anon-key] [SUCCESS] Anon key extracted`、`[TIMESTAMP] [supabase-extract-anon-key] [CONTEXT_UPDATED] .sb-pentest-context.json updated`。
- 从客户端代码中提取 Supabase anonymous/public API key。
- 若尚未提取 Supabase URL,自动调用 `supabase-extract-url` 获取。
- 按 JWT 特征识别 anon key:以 `eyJ` 开头,payload 中包含 `role` 为 `anon`,`ref` 声明中包含项目引用。
- 区分 anon key 与 service_role key;service_role key 绝不应该出现在客户端代码中。
- 搜索直接赋值模式:`const SUPABASE_KEY = 'eyJhbGci...'`、`const SUPABASE_ANON_KEY = 'eyJhbGci...'`。
- 搜索客户端初始化模式:`createClient(url, 'eyJhbGci...')`、`createClient(url, process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY)`。
- 搜索环境变量模式:`NEXT_PUBLIC_SUPABASE_ANON_KEY`、`VITE_SUPABASE_ANON_KEY`、`REACT_APP_SUPABASE_KEY`、`SUPABASE_KEY`。
- 基本提取命令:`Extract Supabase anon key from https://myapp.example.com`。
- 如果 URL 已知,使用命令:`Extract anon key for project abc123def`。
- 输出提取结果,包含 Key Type、Severity、Key、Decoded Payload、Found in、Next Steps、Context updated。
- 解码 JWT payload,展示 `iss`、`ref`、`role`、`iat`、`exp`。
- 记录 key 来源文件和行号,例如 `/static/js/main.js` line 1253。
- 给出下一步动作:运行 `supabase-audit-rls`、`supabase-audit-tables-read`、`supabase-extract-service-key`。
- 验证 key:格式为有效 JWT 结构。
- 验证 key:payload 可读。
- 验证 key:role 确认为 `anon`。
- 验证 key:项目与提取的 URL 匹配。
- 验证 key:检查是否未过期。
- 如果发现多个 key,列出每个 key。
- 对确认的 anon key 标注 Role 和 Project。
- 对未知 key 若 role 为 `service_role`,提示查看 `supabase-extract-service-key`,并标记可能为 CRITICAL 安全问题。
- 安全评估:anon key 出现在客户端时标记为 Info,表示预期但仍需测试 RLS。
- 安全评估:anon key 过期时标记为 P2,建议轮换密钥。
- 安全评估:存在多个 anon key 时标记为 P2,可能表示密钥轮换问题。
- 安全评估:role 不是 `anon` 时标记为 P0,表示错误密钥类型暴露。
- 如果 key 找到但无法解码,可能是混淆或拆分,尝试 `Extract anon key with deobfuscation from https://myapp.example.com`。
- 如果 key 与 URL 项目不匹配,应用可能使用多个 Supabase 项目,记录所有 key。
- 如果未找到 key 但检测到 Supabase,key 可能在运行时获取,检查网络请求:`Monitor network for anon key on https://myapp.example.com`。
- 在报告中提醒开发者:anon key 在客户端是正常的,它就是这样设计的。
- 在报告中提醒开发者:RLS 是关键,anon key 依赖 RLS 保障安全。
- 在报告中提醒开发者:绝不在客户端使用 service_role,改用 Edge Functions。
- 在报告中提醒开发者:定期轮换密钥,可在 Supabase Dashboard 操作。
- 证据收集:在 `.sb-pentest-evidence/02-extraction/` 创建 `extracted-anon-key.json`。
- 证据 JSON 包含 `evidence_id`、`timestamp`、`category`、`type`、`severity`、`key_data`(`key_prefix`、`key_suffix`、`full_key_length`)、`decoded_payload`(`iss`、`ref`、`role`、`iat`、`exp`)、`source`(`file`、`line`、`context`)、`validation`(`format_valid`、`role_confirmed`、`project_matches`、`expired`)。
- 相关技能:`supabase-extract-url` 先获取 URL(必要时自动调用)。
- 相关技能:`supabase-extract-service-key` 检查严重 service key 泄露。
- 相关技能:`supabase-audit-rls` 测试 RLS 是否保护数据。
- 相关技能:`supabase-audit-tables-read` 查看数据可访问性。
适用边界 · 注意事项
- 目标应用不使用 Supabase,或无法提取/访问 Supabase URL。
- 需要查找的是 service_role key 泄露时,应使用 `supabase-extract-service-key`,而不是本技能。
- 如果 key 仅在运行时动态获取且无法进行网络监控,本技能可能找不到,需要改用网络请求监控。