Supabase证据收集管理Skill supabase-evidence

这个技能用于在 Supabase 安全审计中初始化和组织证据收集目录,确保渐进式保存证据文件,以支持可重复性、法律合规性和审计跟踪。关键词:Supabase, 安全审计, 证据收集, 渗透测试, 数据保护。

安全审计 0 次安装 0 次浏览 更新于 3/18/2026

name: supabase-evidence description: 为专业安全审计初始化和管理证据收集目录,提供发现的文档化证明。

证据收集管理

🔴 关键:需要渐进式文件更新

您必须边进行边编写证据文件,而不是仅在结束时。

  • 收集后立即保存每一条证据
  • 不要等到技能完成才保存证据
  • 如果审计崩溃或被中断,所有先前的证据必须已经保存

这不是可选的。未能渐进式保存证据是一个关键错误。

此技能初始化和管理专业安全审计的证据收集系统。

何时使用此技能

  • supabase-pentest 开始时自动调用
  • 当您需要为专业报告组织证据时
  • 当进行需要文档化证明的审计时
  • 用于合规和法律目的

为什么证据收集重要

专业安全审计需要:

要求 目的
可重复性 其他人可以验证发现
法律证明 法律/合规的文档化
修复验证 证明问题在修复前存在
审计跟踪 完整记录所测试的内容

证据目录结构

此技能创建 .sb-pentest-evidence/ 目录,结构如下:

.sb-pentest-evidence/
├── README.md                    # 证据索引和摘要
├── curl-commands.sh             # 所有使用的 curl 命令(可重复)
├── timeline.md                  # 按时间顺序的证据时间线
│
├── 01-detection/
│   ├── initial-scan.json        # 原始检测结果
│   ├── supabase-endpoints.txt   # 发现的端点
│   └── client-code-snippets/    # 相关代码片段
│       └── supabase-init.js
│
├── 02-extraction/
│   ├── extracted-url.json       # URL 提取证明
│   ├── extracted-anon-key.json  # 匿名密钥与解码的 JWT
│   ├── extracted-jwts.json      # 所有发现的 JWT
│   ├── service-key-exposure/    # 如果发现服务密钥(P0)
│   │   ├── location.txt
│   │   └── decoded-payload.json
│   └── db-string-exposure/      # 如果发现数据库字符串(P0)
│       └── connection-details.json
│
├── 03-api-audit/
│   ├── openapi-schema.json      # 原始 OpenAPI/PostgREST 模式
│   ├── tables/
│   │   ├── tables-list.json     # 所有暴露的表
│   │   └── tables-metadata.json # 每表的列详情
│   ├── data-samples/            # 检索的数据样本(已编辑)
│   │   ├── users-sample.json
│   │   ├── orders-sample.json
│   │   └── ...
│   ├── rls-tests/               # RLS 策略测试结果
│   │   ├── users-anon.json      # 匿名访问尝试
│   │   ├── users-auth.json      # 认证访问
│   │   └── cross-user-test.json # 跨用户访问尝试
│   └── rpc-tests/               # RPC 函数测试结果
│       ├── function-list.json
│       └── vulnerable-functions/
│           └── get-all-users.json
│
├── 04-storage-audit/
│   ├── buckets-config.json      # 存储桶配置
│   ├── buckets/
│   │   ├── avatars/
│   │   │   └── file-list.json
│   │   ├── backups/             # 如果敏感(P0)
│   │   │   ├── file-list.json
│   │   │   └── sample-contents/ # 已编辑的样本内容
│   │   └── ...
│   └── public-url-tests/        # 直接 URL 访问测试
│       └── backup-access.json
│
├── 05-auth-audit/
│   ├── auth-settings.json       # 认证配置
│   ├── signup-tests/
│   │   ├── open-signup.json     # 注册可用性
│   │   ├── weak-password.json   # 弱密码测试
│   │   └── rate-limit.json      # 速率限制测试
│   └── enumeration-tests/
│       ├── login-timing.json    # 定时攻击数据
│       ├── recovery-timing.json
│       └── otp-enumeration.json
│
├── 06-realtime-audit/
│   ├── websocket-connection.json
│   ├── postgres-changes/        # 表订阅测试
│   │   └── users-streaming.json
│   ├── broadcast-channels/      # 频道访问测试
│   │   └── admin-channel.json
│   └── presence-data/
│       └── exposed-users.json
│
├── 07-functions-audit/
│   ├── discovered-functions.json
│   └── function-tests/
│       ├── hello-world.json
│       ├── get-user-data-idor.json
│       └── admin-panel-escalation.json
│
└── screenshots/                 # 可选:浏览器截图
    └── ...

使用方式

初始化证据目录

初始化审计的证据收集

手动证据保存

保存证据:[描述] 到 [类别]

证据文件格式

每个证据文件遵循此结构:

{
  "evidence_id": "API-001",
  "timestamp": "2025-01-31T10:30:00Z",
  "category": "api-audit",
  "type": "data-sample",
  "finding_id": "P0-001",
  "description": "用户表数据无需认证即可访问",

  "request": {
    "method": "GET",
    "url": "https://abc123.supabase.co/rest/v1/users?select=*&limit=5",
    "headers": {
      "apikey": "[REDACTED - 匿名密钥]",
      "Authorization": "Bearer [REDACTED - 匿名密钥]"
    },
    "curl_command": "curl -X GET 'https://abc123.supabase.co/rest/v1/users?select=*&limit=5' -H 'apikey: eyJ...' -H 'Authorization: Bearer eyJ...'"
  },

  "response": {
    "status": 200,
    "headers": {
      "content-type": "application/json",
      "x-total-count": "1247"
    },
    "body": [
      {
        "id": "550e8400-e29b-41d4-a716-446655440001",
        "email": "[REDACTED]@example.com",
        "name": "[REDACTED]",
        "created_at": "2025-01-15T10:30:00Z"
      }
    ],
    "body_redacted": true,
    "total_rows_indicated": 1247
  },

  "analysis": {
    "severity": "P0",
    "impact": "所有用户 PII 无需认证即可访问",
    "affected_data": ["email", "name", "id"],
    "row_count": 1247
  }
}

Curl 命令文件

所有 curl 命令收集在 curl-commands.sh 中:

#!/bin/bash
# Supabase 安全审计 - 可重复命令
# 目标:https://myapp.example.com
# 项目:abc123def.supabase.co
# 日期:2025-01-31
#
# 重要:在运行前替换 [ANON_KEY] 为实际密钥
# 警告:这些命令可能修改数据 - 谨慎使用

SUPABASE_URL="https://abc123def.supabase.co"
ANON_KEY="eyJ..."

# === 检测 ===
# 检查是否使用 Supabase
curl -s "$SUPABASE_URL/rest/v1/" -H "apikey: $ANON_KEY" | head -100

# === 表列表 ===
# 获取 OpenAPI 模式(列出所有表)
curl -s "$SUPABASE_URL/rest/v1/" -H "apikey: $ANON_KEY"

# === 数据访问测试 ===
# 测试:用户表(P0 - 应该被阻止)
curl -s "$SUPABASE_URL/rest/v1/users?select=*&limit=5" \
  -H "apikey: $ANON_KEY" \
  -H "Authorization: Bearer $ANON_KEY"

# 测试:订单表(应该被 RLS 阻止)
curl -s "$SUPABASE_URL/rest/v1/orders?select=*&limit=5" \
  -H "apikey: $ANON_KEY" \
  -H "Authorization: Bearer $ANON_KEY"

# === RLS 绕过测试 ===
# ... 额外命令 ...

时间线文件

timeline.md 提供按时间顺序的证据:

# 审计时间线

## 2025-01-31 10:00:00 - 审计开始
- 目标:https://myapp.example.com
- 授权确认

## 2025-01-31 10:05:00 - 检测阶段
- 以高置信度检测到 Supabase
- 项目 URL:https://abc123def.supabase.co
- 证据:`01-detection/initial-scan.json`

## 2025-01-31 10:10:00 - P0 关键:服务密钥暴露
- 在客户端代码中发现服务角色密钥
- 位置:/static/js/admin.chunk.js:89
- 证据:`02-extraction/service-key-exposure/`

## 2025-01-31 10:15:00 - API 审计开始
- 发现 8 个表
- 证据:`03-api-audit/tables/tables-list.json`

## 2025-01-31 10:20:00 - P0 关键:用户表暴露
- 所有 1,247 条用户记录可访问
- PII 暴露:邮箱、姓名
- 证据:`03-api-audit/data-samples/users-sample.json`

...

上下文输出

更新 .sb-pentest-context.json

{
  "evidence": {
    "directory": ".sb-pentest-evidence",
    "initialized_at": "2025-01-31T10:00:00Z",
    "files_count": 45,
    "categories": {
      "detection": 3,
      "extraction": 5,
      "api-audit": 15,
      "storage-audit": 8,
      "auth-audit": 7,
      "realtime-audit": 4,
      "functions-audit": 3
    },
    "critical_evidence": [
      "02-extraction/service-key-exposure/",
      "03-api-audit/data-samples/users-sample.json",
      "04-storage-audit/buckets/backups/"
    ]
  }
}

证据收集规则

收集什么

类别 证据类型 示例
始终 原始 API 响应 JSON 响应
始终 Curl 命令 可重复命令
始终 时间戳 每次测试发生的时间
P0/P1 数据样本(已编辑) 样本行,PII 已掩码
P0 完整请求/响应 完整的 HTTP 交换
可选 截图 浏览器证据

编辑规则

敏感数据必须在证据文件中编辑:

{
  "original": "john.doe@example.com",
  "redacted": "[REDACTED]@example.com"
}

{
  "original": "John Doe",
  "redacted": "[REDACTED]"
}

{
  "original": "sk_live_xxxxxxxxxxxxxxxxxxxx",
  "redacted": "sk_live_[REDACTED]"
}

绝不存储在证据中:

  • 实际密码
  • 完整信用卡号
  • 完整 API 密钥(仅显示前/后 4 个字符)
  • 完整个人数据(需要部分编辑)

命名约定

[类别]-[测试名称]-[时间戳].json

示例:

  • users-anon-access-20250131-103000.json
  • admin-function-no-auth-20250131-143000.json

强制:证据文件更新

⚠️ 证据必须在执行过程中渐进式保存。

关键规则:边进行边保存

不要在结束时批量所有证据。而是:

  1. 在每次测试前 → 创建证据文件占位符
  2. 在每次请求后 → 立即保存请求详情
  3. 在每次响应后 → 立即保存响应
  4. 在分析后 → 将分析添加到证据文件

目录初始化

在审计开始时,创建:

mkdir -p .sb-pentest-evidence/{01-detection,02-extraction,03-api-audit/tables,03-api-audit/data-samples,03-api-audit/rls-tests,03-api-audit/rpc-tests,04-storage-audit/buckets,04-storage-audit/public-url-tests,05-auth-audit/signup-tests,05-auth-audit/enumeration-tests,06-realtime-audit/postgres-changes,06-realtime-audit/broadcast-channels,07-functions-audit/function-tests,screenshots}

记录到审计日志

[时间戳] [supabase-evidence] [开始] 初始化证据目录
[时间戳] [supabase-evidence] [创建] .sb-pentest-evidence/
[时间戳] [supabase-evidence] [上下文更新] 证据跟踪初始化

与其他技能的集成

此技能由 supabase-pentest 自动调用。每个审计技能应该:

  1. 将证据保存到适当的子目录
  2. 使用一致的命名约定
  3. 添加条目到 curl-commands.sh
  4. 为重要发现更新 timeline.md

相关技能

  • supabase-pentest — 初始化证据收集的协调器
  • supabase-report — 使用证据进行综合报告
  • 所有审计技能 — 向各自目录贡献证据