名称: supabase-report 描述: 从收集的发现中生成全面的Markdown安全审计报告,包含执行摘要、发现和修复指导。
安全报告生成器
🔴 关键: 需要渐进式文件更新
您必须在处理每个部分时立即写入上下文文件,而不是等到最后。
- 处理每个部分后立即写入
.sb-pentest-audit.log- 逐步更新
.sb-pentest-context.json中的报告元数据- 不要等到整个报告生成后才更新文件
- 如果技能崩溃或中断,部分进度必须已保存
这不是可选的。不进行渐进式写入是一个关键错误。
这个技能从所有收集的发现中生成全面的Markdown安全审计报告。
何时使用此技能
- 完成安全审计阶段后
- 为利益相关者文档化发现
- 创建可执行的修复计划
- 用于合规和审计跟踪目的
先决条件
- 审计阶段已完成(上下文文件已填充)
- 发现收集在
.sb-pentest-context.json中
报告结构
生成的报告包括:
- 执行摘要 — 管理层面的高级概述
- 安全评分 — 量化的风险评估
- 关键发现 (P0) — 需要立即行动
- 高发现 (P1) — 需要尽快解决
- 中发现的 (P2) — 计划解决
- 详细分析 — 按组件细分
- 修复计划 — 优先的行动项
- 附录 — 技术细节、方法论
使用方式
生成报告
从审计发现生成安全报告
自定义报告名称
生成报告为security-audit-2025-01.md
特定部分
仅生成执行摘要
输出格式
技能生成supabase-audit-report.md:
# Supabase 安全审计报告
**目标:** https://myapp.example.com
**项目:** abc123def.supabase.co
**日期:** 2025年1月31日
**审计师:** 内部安全团队
---
## 执行摘要
### 概述
此安全审计在Supabase实现中识别了**12个漏洞**,包括**3个关键(P0)**问题需要立即关注。
### 关键发现
| 严重性 | 数量 | 状态 |
|----------|-------|--------|
| 🔴 P0 (关键) | 3 | 需要立即行动 |
| 🟠 P1 (高) | 4 | 7天内解决 |
| 🟡 P2 (中) | 5 | 30天内解决 |
### 安全评分
**评分: 35/100 (等级: D)**
应用程序存在显著的安全漏洞,暴露用户数据并允许权限提升。在应用程序可视为安全之前,必须解决关键问题。
### 最关键问题
1. **服务角色密钥暴露** — 可能完全数据库访问
2. **数据库备份公开** — 所有数据可下载
3. **管理功能无认证** — 任何用户可以访问管理功能
### 推荐行动
1. ⚡ **立即 (今天):**
- 轮换服务角色密钥
- 使备份桶私有
- 添加管理角色验证
2. 🔜 **本周:**
- 在所有表上启用RLS
- 启用邮件确认
- 修复Edge Functions中的IDOR
3. 📅 **本月:**
- 强化密码策略
- 限制CORS来源
- 在功能中添加速率限制
---
## 关键发现 (P0)
### P0-001: 服务角色密钥在客户端代码中暴露
**严重性:** 🔴 关键
**组件:** 密钥管理
**CVSS:** 9.8 (关键)
#### 描述
Supabase服务角色密钥在客户端JavaScript代码中被发现。此密钥绕过所有行级安全策略并提供完全数据库访问。
#### 位置
文件: /static/js/admin.chunk.js 行: 89 代码: const SUPABASE_KEY = ‘eyJhbGciOiJIUzI1NiI…’
#### 影响
- 所有数据库表的完全读写访问
- 绕过所有RLS策略
- 访问auth.users表(所有用户数据)
- 能够删除或修改任何数据
#### 概念证明
```bash
curl 'https://abc123def.supabase.co/rest/v1/users' \
-H 'apikey: [service_role_key]' \
-H 'Authorization: Bearer [service_role_key]'
# 返回所有用户及其完整数据
修复
立即:
- 在Supabase仪表板中轮换服务角色密钥
- 设置 → API → 重新生成服务角色密钥
- 从客户端代码中移除密钥
- 重新部署应用程序
长期:
// 将特权操作移动到Edge Functions
// supabase/functions/admin-action/index.ts
import { createClient } from '@supabase/supabase-js'
Deno.serve(async (req) => {
// 服务器上仅使用服务密钥
const supabase = createClient(
Deno.env.get('SUPABASE_URL')!,
Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!
)
// 在继续之前验证调用者是管理员
// ...
})
文档:
P0-002: 数据库备份公开可访问
严重性: 🔴 关键 组件: 存储 CVSS: 9.1 (关键)
描述
名为“backups”的存储桶配置为公开,暴露数据库转储、用户导出和环境机密。
暴露的文件
| 文件 | 大小 | 内容 |
|---|---|---|
| db-backup-2025-01-30.sql | 125MB | 完整数据库转储 |
| users-export.csv | 2.3MB | 所有用户数据含PII |
| secrets.env | 1KB | API密钥和密码 |
影响
- 完全数据泄露(所有数据库内容)
- 暴露第三方服务的凭证
- 用户PII暴露(邮件、姓名等)
修复
立即:
-- 使存储桶私有
UPDATE storage.buckets
SET public = false
WHERE name = 'backups';
-- 删除或移动文件
-- 考虑事件响应程序
凭证轮换:
- Stripe API密钥
- 数据库密码
- JWT秘密
- 任何其他在secrets.env中的密钥
P0-003: 管理员Edge Function权限提升
严重性: 🔴 关键 组件: Edge Functions CVSS: 8.8 (高)
描述
/functions/v1/admin-panel Edge Function对任何认证用户可访问,无需角色验证。
[… 其他P0发现 …]
高发现 (P1)
P1-001: 邮件确认禁用
严重性: 🟠 高 组件: 认证
[… P1发现 …]
中发现的 (P2)
P2-001: 弱密码策略
严重性: 🟡 中 组件: 认证
[… P2发现 …]
按组件的详细分析
API安全
| 表 | RLS | 访问级别 | 状态 |
|---|---|---|---|
| users | ❌ | 完全读 | 🔴 P0 |
| orders | ✅ | 无 | ✅ |
| posts | ✅ | 仅发布 | ✅ |
存储安全
| 存储桶 | 公开 | 敏感文件 | 状态 |
|---|---|---|---|
| avatars | 是 | 否 | ✅ |
| backups | 是 | 是 (45个文件) | 🔴 P0 |
认证
| 设置 | 当前 | 推荐 | 状态 |
|---|---|---|---|
| 邮件确认 | 禁用 | 启用 | 🟠 P1 |
| 密码最小长度 | 6 | 8+ | 🟡 P2 |
修复计划
阶段1: 关键 (立即)
| ID | 行动 | 负责人 | 截止日期 |
|---|---|---|---|
| P0-001 | 轮换服务密钥 | DevOps | 今天 |
| P0-002 | 使备份私有 | DevOps | 今天 |
| P0-003 | 添加管理员角色检查 | Backend | 今天 |
阶段2: 高优先级 (本周)
| ID | 行动 | 负责人 | 截止日期 |
|---|---|---|---|
| P1-001 | 启用邮件确认 | Backend | 3天 |
| P1-002 | 修复get-user-data中的IDOR | Backend | 3天 |
阶段3: 中优先级 (本月)
| ID | 行动 | 负责人 | 截止日期 |
|---|---|---|---|
| P2-001 | 强化密码策略 | Backend | 14天 |
| P2-002 | 限制CORS来源 | DevOps | 14天 |
附录
A. 方法论
此审计使用Supabase Pentest Skills工具包执行,包括:
- 客户端代码的被动侦察
- 使用匿名和服务密钥的API端点测试
- 存储桶枚举和访问测试
- 认证流程分析
- 实时通道订阅测试
B. 使用的工具
- supabase-pentest-skills v1.0.0
- curl用于API测试
- 浏览器DevTools用于客户端代码分析
C. 审计范围
- 目标URL: https://myapp.example.com
- Supabase项目: abc123def
- 测试组件: API, 存储, Auth, 实时, Edge Functions
- 排除项: 无
D. 审计日志
完整审计日志在.sb-pentest-audit.log中可用
报告由supabase-pentest-skills生成 审计完成: 2025年1月31日15:00 UTC
## 评分计算
安全评分基于:
| 因素 | 权重 | 计算 |
|--------|--------|-------------|
| P0发现 | -25每问题 | 关键漏洞 |
| P1发现 | -10每问题 | 高严重性问题 |
| P2发现 | -5每问题 | 中严重性问题 |
| RLS覆盖 | +10如果100% | 所有表有RLS |
| 认证硬化 | +10 | 邮件确认、强密码 |
| 基础评分 | 100 | 起始点 |
### 等级量表
| 评分 | 等级 | 描述 |
|-------|-------|-------------|
| 90-100 | A | 优秀安全态势 |
| 80-89 | B | 良好,需小改进 |
| 70-79 | C | 可接受,需解决问题 |
| 60-69 | D | 差,显著问题 |
| 0-59 | F | 关键,需立即行动 |
## 上下文输入
报告生成器从`.sb-pentest-context.json`读取:
```json
{
"target_url": "https://myapp.example.com",
"supabase": {
"project_url": "https://abc123def.supabase.co",
"project_ref": "abc123def"
},
"findings": [
{
"id": "P0-001",
"severity": "P0",
"component": "keys",
"title": "服务角色密钥暴露",
"description": "...",
"location": "...",
"remediation": "..."
}
],
"audit_completed": "2025-01-31T15:00:00Z"
}
报告定制
包含/排除部分
生成不带附录的报告
仅生成执行摘要
不同格式
以JSON格式生成报告
以HTML生成报告摘要
强制: 上下文文件依赖
⚠️ 此技能要求正确填充的跟踪文件。
先决条件
在生成报告之前,确保:
.sb-pentest-context.json存在并包含来自审计技能的发现.sb-pentest-audit.log存在并带有时间戳操作- 所有相关审计技能已更新这些文件
如果上下文文件缺失
如果上下文文件缺失或为空:
- 不要生成空报告
- 通知用户必须先运行审计技能
- 推荐运行
supabase-pentest进行完整审计
报告生成输出
生成报告后,此技能必须:
-
记录到
.sb-pentest-audit.log:[时间戳] [supabase-report] [开始] 生成安全报告 [时间戳] [supabase-report] [成功] 报告生成: supabase-audit-report.md [时间戳] [supabase-report] [上下文更新] 报告生成已记录 -
更新
.sb-pentest-context.json带有报告元数据:{ "report": { "generated_at": "...", "filename": "supabase-audit-report.md", "findings_count": { "p0": 3, "p1": 4, "p2": 5 } } }
未能更新上下文文件是不可接受的。
相关技能
supabase-report-compare— 与先前报告比较supabase-pentest— 先运行完整审计supabase-help— 列出所有可用技能