Signup Flow Audit ๐ด CRITICAL: PROGRESSIVE FILE UPDATES REQUIRED You MUST write to context files AS YOU GO , not just at the end. Write to .sb-pentest-context.json IMMEDIATELY after each test completed Log to .sb-pentest-audit.log BEFORE and AFTER each test DO NOT wait until the skill completes to update files If the skill crashes or is interrupted, all prior findings must already be saved This is not optional. Failure to write progressively is a critical error. This skill tests the user registration flow for security issues and misconfigurations. When to Use This Skill To verify if signup is appropriately restricted To test for signup abuse vectors To check rate limiting on registration As part of authentication security audit Prerequisites Supabase URL and anon key available Auth config audit completed (recommended) Why Signup Security Matters Open signup can lead to: Risk Description Spam accounts Bots creating fake accounts Resource abuse Free tier exploitation Email spam Using your service to send emails Data pollution Fake data in your database Attack surface More accounts = more attack vectors Tests Performed Test Purpose Signup availability Is registration open? Email validation Does it accept invalid emails? Rate limiting Can we create many accounts? Disposable emails Are temp emails blocked? Password policy What passwords are accepted? Response information What info is leaked? Usage Basic Signup Test Test signup security on my Supabase project Check Specific Aspects Test if disposable emails are blocked for signup Output Format โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ SIGNUP FLOW AUDIT โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ Project: abc123def.supabase.co Endpoint: /auth/v1/signup โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ Signup Availability โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ Status: โ OPEN (Anyone can register) Test Result: POST /auth/v1/signup Body: {"email": "test-xxxxx@example.com", "password": "TestPass123!"} Response: 200 OK - Account created Assessment: Signup is publicly available. Review if this is intended. โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ Email Validation โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ Valid email formats: โโโ user@domain.com: โ Accepted (expected) โโโ user+tag@domain.com: โ Accepted (expected) โโโ user@subdomain.domain.com: โ Accepted (expected) Invalid email formats: โโโ user@: โ Rejected (good) โโโ @domain.com: โ Rejected (good) โโโ user@.com: โ Rejected (good) โโโ not-an-email: โ Rejected (good) Disposable Email Test: โโโ user@mailinator.com: โ Accepted โ ๐ P2 โโโ user@tempmail.com: โ Accepted โ ๐ P2 โโโ user@guerrillamail.com: โ Accepted โ ๐ P2 Finding: Disposable emails are not blocked. Risk: Users can create throwaway accounts. Recommendation: Consider using an email validation service or blocklist in your application logic. โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ Password Policy โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ Minimum Length Test: โโโ "12345" (5 chars): โ Rejected โโโ "123456" (6 chars): โ Accepted โ P2 Short โโโ "1234567890" (10 chars): โ Accepted Current Policy: Minimum 6 characters Weak Password Test: โโโ "password": โ Accepted โ ๐ P2 โโโ "123456": โ Accepted โ ๐ P2 โโโ "qwerty123": โ Accepted โ ๐ P2 โโโ "letmein": โ Accepted โ ๐ P2 Finding: Common weak passwords are accepted. Recommendation: 1. Increase minimum length to 8+ characters 2. Consider password strength requirements 3. Check against common password lists โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ Rate Limiting โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ Signup Rate Test (same IP): โโโ Request 1: โ 200 OK โโโ Request 2: โ 200 OK โโโ Request 3: โ 200 OK โโโ Request 4: โ 429 Too Many Requests โโโ Retry-After: 3600 seconds Rate Limit: 3 signups/hour per IP Assessment: โ Rate limiting is active (good) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ Information Disclosure โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ Existing Email Test: POST /auth/v1/signup (with existing email) Response: "User already registered" Finding: ๐ P2 - Response reveals email existence This allows: โโโ Email enumeration attacks โโโ Knowing if someone has an account โโโ Targeted phishing attempts Recommendation: Use generic message like "Check your email to continue" for both new and existing accounts. โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ Email Confirmation โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ Status: โ NOT REQUIRED (confirmed in auth-config) Test: Created account and checked session Result: User immediately authenticated without email confirmation. โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ Summary โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ Signup: Open to public Rate Limiting: โ Active (3/hour) Email Confirmation: โ Not required Findings: โโโ P1: Email confirmation disabled โโโ P2: Disposable emails accepted โโโ P2: Weak passwords accepted โโโ P2: Email enumeration possible Security Score: 5/10 Priority Actions: 1. Enable email confirmation 2. Strengthen password policy 3. Consider disposable email blocking 4. Use generic error messages โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ Test Details Disposable Email Detection Common disposable email domains tested: mailinator.com tempmail.com guerrillamail.com 10minutemail.com throwaway.email Weak Password List Common passwords tested: password, password123 123456, 12345678 qwerty, qwerty123 letmein, welcome admin, administrator Rate Limit Testing Attempt 1: 200 OK Attempt 2: 200 OK Attempt 3: 200 OK Attempt 4: 429 Too Many Requests Context Output { "signup_audit" : { "timestamp" : "2025-01-31T13:00:00Z" , "signup_open" : true , "rate_limit" : { "enabled" : true , "limit" : 3 , "period" : "hour" } , "email_validation" : { "basic_validation" : true , "disposable_blocked" : false } , "password_policy" : { "min_length" : 6 , "weak_passwords_blocked" : false } , "information_disclosure" : { "email_enumeration" : true } , "findings" : [ { "severity" : "P1" , "issue" : "Email confirmation disabled" } , { "severity" : "P2" , "issue" : "Disposable emails accepted" } , { "severity" : "P2" , "issue" : "Weak passwords accepted" } , { "severity" : "P2" , "issue" : "Email enumeration possible" } ] } } Remediation Examples Block Disposable Emails // In your signup handler or Edge Function import { isDisposable } from 'email-validator-package' ; if ( isDisposable ( email ) ) { throw new Error ( 'Please use a permanent email address' ) ; } Strengthen Password Requirements // Custom password validation function validatePassword ( password : string ) : boolean { if ( password . length < 8 ) return false ; if ( ! / [ A - Z ] / . test ( password ) ) return false ; if ( ! / [ a - z ] / . test ( password ) ) return false ; if ( ! / [ 0 - 9 ] / . test ( password ) ) return false ; return true ; } Prevent Email Enumeration // Always return same message async function signup ( email , password ) { try { await supabase . auth . signUp ( { email , password } ) ; } catch ( error ) { // Don't reveal if email exists } return { message : 'Check your email to continue' } ; } Restrict Signup If signup should be invite-only: // Use admin API to invite users const { data , error } = await supabaseAdmin . auth . admin . inviteUserByEmail ( 'user@example.com' ) ; // Or disable signup in dashboard and use: const { data , error } = await supabaseAdmin . auth . admin . createUser ( { email : 'user@example.com' , email_confirm : true } ) ; MANDATORY: Progressive Context File Updates โ ๏ธ This skill MUST update tracking files PROGRESSIVELY during execution, NOT just at the end. Critical Rule: Write As You Go DO NOT batch all writes at the end. Instead: Before each signup test โ Log the action to .sb-pentest-audit.log After each vulnerability found โ Immediately update .sb-pentest-context.json After rate limit tests โ Log the results immediately This ensures that if the skill is interrupted, crashes, or times out, all findings up to that point are preserved. Required Actions (Progressive) Update .sb-pentest-context.json with results: { "signup_audit" : { "timestamp" : "..." , "signup_open" : true , "rate_limit" : { ... } , "findings" : [ ... ] } } Log to .sb-pentest-audit.log : [TIMESTAMP] [supabase-audit-auth-signup] [START] Testing signup security [TIMESTAMP] [supabase-audit-auth-signup] [FINDING] P2: Weak passwords accepted [TIMESTAMP] [supabase-audit-auth-signup] [CONTEXT_UPDATED] .sb-pentest-context.json updated If files don't exist , create them before writing. FAILURE TO UPDATE CONTEXT FILES IS NOT ACCEPTABLE. MANDATORY: Evidence Collection ๐ Evidence Directory: .sb-pentest-evidence/05-auth-audit/signup-tests/ Evidence Files to Create File Content signup-tests/open-signup.json Signup availability test signup-tests/weak-password.json Weak password acceptance test signup-tests/disposable-email.json Disposable email test signup-tests/rate-limit.json Rate limiting test Evidence Format { "evidence_id" : "AUTH-SIGNUP-001" , "timestamp" : "2025-01-31T10:55:00Z" , "category" : "auth-audit" , "type" : "signup_test" , "tests" : [ { "test_name" : "weak_password_acceptance" , "severity" : "P2" , "request" : { "method" : "POST" , "url" : "https://abc123def.supabase.co/auth/v1/signup" , "body" : { "email" : "test@example.com" , "password" : "123456" } , "curl_command" : "curl -X POST '$URL/auth/v1/signup' -H 'apikey: $ANON_KEY' -H 'Content-Type: application/json' -d '{\"email\": \"test@example.com\", \"password\": \"123456\"}'" } , "response" : { "status" : 200 , "message" : "User created" } , "result" : "VULNERABLE" , "impact" : "Weak passwords (6 chars) accepted" } , { "test_name" : "disposable_email" , "severity" : "P2" , "request" : { "body" : { "email" : "test@mailinator.com" , "password" : "Test123456!" } } , "response" : { "status" : 200 , "message" : "User created" } , "result" : "VULNERABLE" , "impact" : "Disposable emails not blocked" } ] }
supabase-audit-auth-signup
ๅฎ่ฃ
npx skills add https://github.com/yoanbernabeu/supabase-pentest-skills --skill supabase-audit-auth-signup