名称: supabase-audit-auth-config 描述: 分析Supabase认证配置以发现安全弱点和错误配置。
认证配置审计
🔴 关键:需要渐进式文件更新
您必须边执行边写入上下文文件,而不是仅在最后。
- 分析每个设置后立即写入
.sb-pentest-context.json- 在每次测试前后记录到
.sb-pentest-audit.log- 不要等到技能完成才更新文件
- 如果技能崩溃或被中断,所有之前的发现必须已经保存
这不是可选的。未能渐进式写入是一个关键错误。
本技能分析Supabase项目的认证配置。
何时使用此技能
- 审查认证安全设置
- 在生产部署前
- 审计与认证相关的漏洞时
- 作为全面安全审查的一部分
先决条件
- 可用的Supabase URL和匿名密钥
- 检测已完成
认证端点
Supabase Auth (GoTrue) 暴露:
https://[项目].supabase.co/auth/v1/
| 端点 | 用途 |
|---|---|
/auth/v1/settings |
公共设置(有限) |
/auth/v1/signup |
用户注册 |
/auth/v1/token |
认证 |
/auth/v1/user |
当前用户信息 |
/auth/v1/recover |
密码恢复 |
可以检测的内容
从公共API,我们可以检测:
| 设置 | 检测方法 |
|---|---|
| 电子邮件认证启用 | 尝试注册 |
| 电话认证启用 | 检查设置 |
| OAuth提供者 | 检查设置 |
| 注册禁用 | 尝试注册 |
| 电子邮件确认 | 注册响应 |
| 密码要求 | 错误消息 |
用法
基本认证审计
审计认证配置
检查特定功能
检查注册是否开放以及启用了哪些提供者
输出格式
═══════════════════════════════════════════════════════════
认证配置审计
═══════════════════════════════════════════════════════════
项目:abc123def.supabase.co
认证端点:https://abc123def.supabase.co/auth/v1/
─────────────────────────────────────────────────────────
认证方法
─────────────────────────────────────────────────────────
电子邮件/密码:✅ 启用
├── 注册:✅ 开放(任何人都可以注册)
├── 电子邮件确认:❌ 不需要 ← P1 问题
├── 密码最小长度:6 字符 ← P2 考虑加长
└── 安全密码检查:未知
电话/SMS:✅ 启用
└── 提供者:Twilio
魔法链接:✅ 启用
└── OTP过期时间:300 秒(5 分钟)
OAuth提供者检测:3
├── Google:✅ 启用
├── GitHub:✅ 启用
└── Discord:✅ 启用
匿名认证:✅ 启用 ← 检查是否预期
─────────────────────────────────────────────────────────
安全设置
─────────────────────────────────────────────────────────
速率限制:
├── 注册:3/小时每IP(好)
├── 令牌:30/小时每IP(好)
└── 恢复:3/小时每IP(好)
会话配置:
├── JWT过期时间:3600 秒(1 小时)
├── 刷新令牌轮换:未知
└── 不活动超时:未知
安全头:
├── CORS:已配置
├── 允许来源:*(通配符) ← P2 考虑限制
└── 凭证:允许
─────────────────────────────────────────────────────────
发现
─────────────────────────────────────────────────────────
🟠 P1:电子邮件确认禁用
问题:用户无需验证电子邮件地址即可注册并立即访问应用。
风险:
├── 使用无效电子邮件的虚假账户
├── 拼写错误(user@gmial.com)
├── 无验证的通信渠道
└── 潜在的滥用
建议:
Supabase仪表板 → 认证 → 电子邮件模板
→ 启用“确认电子邮件”
─────────────────────────────────────────────────────────
🟡 P2:最小密码长度短
问题:最小密码长度为6字符。
建议:增加到8-12字符最小。
Supabase仪表板 → 认证 → 设置
→ 最小密码长度
─────────────────────────────────────────────────────────
🟡 P2:通配符CORS来源
问题:CORS允许来自任何来源的请求(*)。
建议:限制到您的域名。
Supabase仪表板 → 认证 → URL配置
→ 站点URL和重定向URL
─────────────────────────────────────────────────────────
ℹ️ 信息:匿名认证启用
注意:匿名认证已启用。
如果意图(访客访问)这没问题。
检查是否预期所有用户都需要认证。
─────────────────────────────────────────────────────────
总结
─────────────────────────────────────────────────────────
认证方法:5 启用
OAuth提供者:3
发现:
├── P1(高):1 - 电子邮件确认禁用
├── P2(中):2 - 密码长度,CORS
└── 信息:1 - 匿名认证启用
建议行动:
1. 启用电子邮件确认
2. 增加最小密码长度
3. 限制CORS到特定域名
4. 检查匿名认证是否必要
═══════════════════════════════════════════════════════════
安全清单
电子邮件认证
| 设置 | 推荐 | 错误风险 |
|---|---|---|
| 电子邮件确认 | ✅ 必须 | 虚假账户 |
| 密码长度 | ≥8 字符 | 弱密码 |
| 密码复杂度 | 启用 | 易于猜测 |
| 速率限制 | 启用 | 暴力破解 |
OAuth配置
| 设置 | 推荐 | 错误风险 |
|---|---|---|
| 仅验证的提供者 | 是 | 账户接管 |
| 适当的重定向URL | 特定URL | OAuth重定向攻击 |
| 状态参数 | 启用 | CSRF攻击 |
会话安全
| 设置 | 推荐 | 错误风险 |
|---|---|---|
| 短JWT过期时间 | 1小时或更短 | 令牌盗窃 |
| 刷新令牌轮换 | 启用 | 令牌重用 |
| 安全cookie标志 | HttpOnly, Secure, SameSite | XSS, CSRF |
上下文输出
{
"auth_config": {
"timestamp": "2025-01-31T12:30:00Z",
"methods": {
"email": {
"enabled": true,
"signup_open": true,
"email_confirmation": false,
"min_password_length": 6
},
"phone": {
"enabled": true,
"provider": "twilio"
},
"magic_link": {
"enabled": true,
"otp_expiry": 300
},
"oauth": {
"enabled": true,
"providers": ["google", "github", "discord"]
},
"anonymous": {
"enabled": true
}
},
"findings": [
{
"severity": "P1",
"issue": "Email confirmation disabled",
"recommendation": "Enable email confirmation in dashboard"
}
]
}
}
常见认证漏洞
1. 无电子邮件确认
// 用户可以用任何电子邮件注册
const { data, error } = await supabase.auth.signUp({
email: 'fake@example.com', // 无需验证
password: 'password123'
})
// 用户立即被认证
2. 弱密码策略
// 弱密码被接受
await supabase.auth.signUp({
email: 'user@example.com',
password: '123456' // 最小长度6被接受
})
3. 不需要时的开放注册
如果您的应用应该只有管理员创建的用户:
-- 通过仪表板禁用公共注册
-- 或使用仅邀请流程
补救示例
启用电子邮件确认
- Supabase仪表板 → 认证 → 电子邮件模板
- 启用“确认电子邮件”
- 自定义确认电子邮件模板
- 在应用中处理未确认的用户
加强密码要求
- 仪表板 → 认证 → 设置
- 设置最小长度为8或以上
- 考虑启用密码强度检查
限制CORS
- 仪表板 → 认证 → URL配置
- 设置特定的站点URL
- 只添加您的域名到重定向URL
- 移除通配符条目
强制性:渐进式上下文文件更新
⚠️ 此技能必须在执行过程中渐进式更新跟踪文件,而不是仅在最后。
关键规则:边执行边写入
不要将所有写入批量放在最后。相反:
- 在检查每个认证方法之前 → 记录动作到
.sb-pentest-audit.log - 分析每个配置后 → 立即更新
.sb-pentest-context.json - 发现每个发现后 → 立即记录严重性
这确保了如果技能被中断、崩溃或超时,所有到该点的发现都被保留。
必需动作(渐进式)
-
更新
.sb-pentest-context.json与结果:{ "auth_config": { "timestamp": "...", "methods": { ... }, "findings": [ ... ] } } -
记录到
.sb-pentest-audit.log:[TIMESTAMP] [supabase-audit-auth-config] [START] Auditing auth configuration [TIMESTAMP] [supabase-audit-auth-config] [FINDING] P1: Email confirmation disabled [TIMESTAMP] [supabase-audit-auth-config] [CONTEXT_UPDATED] .sb-pentest-context.json updated -
如果文件不存在,在写入前创建它们。
未能更新上下文文件是不可接受的。
强制性:证据收集
📁 证据目录: .sb-pentest-evidence/05-auth-audit/
要创建的证据文件
| 文件 | 内容 |
|---|---|
auth-settings.json |
完整的认证配置 |
证据格式
{
"evidence_id": "AUTH-CFG-001",
"timestamp": "2025-01-31T10:50:00Z",
"category": "auth-audit",
"type": "auth_configuration",
"endpoint": "https://abc123def.supabase.co/auth/v1/",
"configuration": {
"email_auth": {
"enabled": true,
"signup_open": true,
"email_confirmation_required": false,
"min_password_length": 6
},
"phone_auth": {
"enabled": true,
"provider": "twilio"
},
"oauth_providers": ["google", "github", "discord"],
"anonymous_auth": true
},
"security_settings": {
"rate_limiting": {
"signup": "3/hour",
"token": "30/hour",
"recovery": "3/hour"
},
"jwt_expiry": 3600,
"cors_origins": "*"
},
"findings": [
{
"severity": "P1",
"issue": "Email confirmation disabled",
"impact": "Users can signup without verifying email",
"recommendation": "Enable email confirmation"
},
{
"severity": "P2",
"issue": "Weak password policy",
"impact": "Minimum 6 characters allows weak passwords",
"recommendation": "Increase to 8+ characters"
}
]
}
添加到curl-commands.sh
# === 认证配置测试 ===
# 测试注册可用性
curl -X POST "$SUPABASE_URL/auth/v1/signup" \
-H "apikey: $ANON_KEY" \
-H "Content-Type: application/json" \
-d '{"email": "test@example.com", "password": "test123456"}'
# 测试密码策略(弱密码)
curl -X POST "$SUPABASE_URL/auth/v1/signup" \
-H "apikey: $ANON_KEY" \
-H "Content-Type: application/json" \
-d '{"email": "weak@example.com", "password": "123456"}'
相关技能
supabase-audit-auth-signup— 测试注册流程supabase-audit-auth-users— 测试用户枚举supabase-audit-rls— 认证用户需要RLS保护