npx skills add ...
npx skills add reason-machines/security-skills --skill supabase-pentest-skills
Professional AI-assisted security auditing toolkit with 24 skills for detecting, extracting, testing, and reporting Supabase vulnerabilities (RLS, IDOR, storage, auth, API).
npx skills add reason-machines/security-skills --skill supabase-pentest-skills
Skill by ara.so — Security Skills collection.
A comprehensive toolkit of 24 AI agent skills for professional security auditing of Supabase applications. Automates detection, credential extraction, Row Level Security (RLS) testing, IDOR detection, storage audits, authentication analysis, and comprehensive reporting.
Supabase Pentest Skills is a modular security auditing framework designed for internal self-assessment by authorized development teams. It provides:
Important: These skills are for authorized testing only. You must own or have explicit permission to audit the target application.
For complete audit trail and evidence collection:
| Skill | Purpose |
|---|---|
supabase-pentest | Main orchestrator — guided step-by-step audit |
supabase-evidence | Initialize professional evidence collection |
supabase-help | Quick reference guide |
| Skill | Purpose |
|---|---|
supabase-detect | Detect Supabase usage from HTML/JS |
supabase-extract-url | Extract project URL |
supabase-extract-anon-key | Extract anon/public API key |
supabase-extract-service-key | Critical: Detect leaked service_role key |
supabase-extract-jwt | Extract and decode JWTs |
supabase-extract-db-string | Detect exposed database connection strings |
| Skill | Purpose |
|---|---|
supabase-audit-tables-list | List exposed PostgREST tables |
supabase-audit-tables-read | Attempt data reads |
supabase-audit-rls | Test Row Level Security policies |
supabase-audit-rpc | Test exposed RPC functions |
| Skill | Purpose |
|---|---|
supabase-audit-buckets-list | List storage buckets |
supabase-audit-buckets-read | Test file access |
supabase-audit-buckets-public | Detect public bucket misconfigurations |
supabase-audit-auth-config | Analyze auth configuration |
supabase-audit-auth-signup | Test open signup |
supabase-audit-auth-users | Test user enumeration |
supabase-audit-authenticated | Create test user to detect IDOR |
| Skill | Purpose |
|---|---|
supabase-audit-realtime | Test Realtime channels |
supabase-audit-functions | Test Edge Functions |
supabase-report | Generate comprehensive report |
supabase-report-compare | Compare two audit reports |
The orchestrator will:
This will run:
supabase-detectsupabase-extract-urlsupabase-extract-anon-keysupabase-extract-service-key (critical check)supabase-extract-jwtsupabase-extract-db-stringThis will:
supabase-audit-tables-list)supabase-audit-tables-read)supabase-audit-rls)This executes supabase-audit-authenticated, which:
Runs:
supabase-audit-buckets-listsupabase-audit-buckets-readsupabase-audit-buckets-publicUses supabase-report-compare to show:
All skills share state through files:
.sb-pentest-context.json.sb-pentest-audit.log.sb-pentest-evidence/ Directory Structurecurl-commands.sh (Reproducible Tests)supabase-audit-report.md)Remediation:
References:
users TableSeverity: P0 - Critical
Impact: All user data readable/writable by anyone with anon key
Test Result:
Remediation:
Severity: P1 - High
Bucket: avatars
Impact: All uploaded avatars accessible without authentication
Test:
Remediation:
Severity: P2 - Medium
Impact: Attackers can enumerate table structure
Example:
Remediation: Configure PostgREST to return generic errors in production
avatars bucket private or add RLS/supabase-pentest after fixessupabase-report-compare old-report.md new-report.mdGenerated by: supabase-pentest-skills v1.0
Evidence: See .sb-pentest-evidence/ directory
Reproducible Tests: .sb-pentest-evidence/curl-commands.sh
The recommended template enforces:
Cause: Target site doesn't use Supabase or keys are dynamically loaded
Solution:
Cause: Too many requests in short time
Solution: Skills automatically slow down when detecting rate limits. If persistent:
Cause: Either no tables exposed or API key invalid
Solution:
Cause: Skills executed out of order
Solution:
Cause: Signup disabled or email verification required
Solution:
Prompt to AI agent:
Expected Output:
Never commit context files to version control:
Always run in isolated audit directories
Delete test users after audit:
Rotate keys if service_role leaked:
Share reports securely (not via public links)
Edit findings in .sb-pentest-context.json:
The orchestrator will skip auth-related skills if you specify exclusions.
✅ Authorized Use:
❌ Unauthorized Use:
Disclaimer: This toolkit is provided for authorized security testing only. Unauthorized access to computer systems is illegal. Always obtain proper authorization before testing.
npx skills add yoanbernabeu/supabase-pentest-skills --list# 1. Create audit directory
mkdir my-security-audit
cd my-security-audit
# 2. Install skills
npx skills add yoanbernabeu/supabase-pentest-skills
# 3. Download agent configuration template
curl -o CLAUDE.md https://raw.githubusercontent.com/yoanbernabeu/supabase-pentest-skills/main/templates/CLAUDE.md
# 4. Launch your AI agent and run
# /supabase-pentestI need a complete security audit of https://myapp.example.com
IMPORTANT:
1. Initialize supabase-evidence first
2. Execute ALL 24 skills systematically
3. Log every action
4. Save all evidence
5. Generate final report
I confirm I am authorized to test this application.Extract all Supabase credentials from https://example.comTest Row Level Security policies on my Supabase app at https://example.comCheck for IDOR vulnerabilities in auth on https://example.comAudit storage bucket security for my Supabase applicationCompare my latest audit with the report from last month{
"target_url": "https://myapp.example.com",
"supabase_url": "https://abc123.supabase.co",
"anon_key": "eyJhbGc...",
"service_key_leaked": false,
"findings": {
"p0": ["Service role key exposed in /static/js/main.js"],
"p1": ["RLS policy missing on 'users' table"],
"p2": ["Verbose error messages expose table structure"]
},
"tables_exposed": ["users", "posts", "comments"],
"buckets_public": ["avatars"],
"test_user": {
"email": "pentest_user_1738329847@example.com",
"password": "RANDOM_SECURE_PASSWORD"
}
}[2025-01-31T10:45:23Z] supabase-detect - Started detection on https://myapp.example.com
[2025-01-31T10:45:25Z] supabase-detect - Found Supabase URL: https://abc123.supabase.co
[2025-01-31T10:45:30Z] supabase-extract-anon-key - Extracted anon key from /static/js/app.js
[2025-01-31T10:45:35Z] supabase-audit-tables-list - Found 12 exposed tables
[2025-01-31T10:45:40Z] supabase-audit-rls - P0: 'users' table has no RLS policy.sb-pentest-evidence/
├── README.md # Evidence index
├── curl-commands.sh # Reproducible API calls
├── timeline.md # Chronological findings
├── 01-detection/
│ └── supabase-detected.md
├── 02-extraction/
│ ├── url-extracted.md
│ ├── anon-key-extracted.md
│ └── service-key-LEAKED.md # P0 finding
├── 03-api-audit/
│ ├── tables-list.json
│ ├── rls-bypass-users.md # P0 finding
│ └── rpc-functions.json
├── 04-storage-audit/
│ └── public-bucket-avatars.md # P1 finding
└── 05-auth-audit/
├── test-user-created.md
└── idor-detected-users.md # P0 finding#!/bin/bash
# Generated by supabase-pentest-skills
# All API calls made during audit
# List tables (unauthenticated)
curl -X GET 'https://abc123.supabase.co/rest/v1/' \
-H "apikey: eyJhbGc..." \
-H "Authorization: Bearer eyJhbGc..."
# Attempt to read users table (RLS bypass test)
curl -X GET 'https://abc123.supabase.co/rest/v1/users?select=*' \
-H "apikey: eyJhbGc..." \
-H "Authorization: Bearer eyJhbGc..."
# Test public bucket access
curl -X GET 'https://abc123.supabase.co/storage/v1/object/public/avatars/user-123.jpg'
# IDOR test: User A accessing User B's data
curl -X GET 'https://abc123.supabase.co/rest/v1/profiles?user_id=eq.OTHER_USER_ID' \
-H "apikey: eyJhbGc..." \
-H "Authorization: Bearer USER_A_JWT"# Audit Execution Rules
1. **ALWAYS use Plan Mode** (`EnterPlanMode`) before starting
2. **Initialize evidence collection** with `supabase-evidence` FIRST
3. **Execute ALL 24 skills systematically** — NO EXCEPTIONS
4. **After EACH skill**:
- Update `.sb-pentest-context.json`
- Append to `.sb-pentest-audit.log`
- Save evidence to `.sb-pentest-evidence/`
- Update `timeline.md` for P0/P1/P2 findings
5. **NEVER skip phases** without explicit user confirmation
6. **Generate final report** with `supabase-report`Check the page source manually at https://example.com and look for:
- Strings containing 'supabase.co'
- Variables like 'SUPABASE_URL' or 'supabaseUrl'
- Network requests to '*.supabase.co'Wait 5 minutes before retrying the auditVerify the extracted anon key is correct:
1. Check .sb-pentest-context.json
2. Test manually:
curl 'https://YOUR_PROJECT.supabase.co/rest/v1/' \
-H "apikey: YOUR_ANON_KEY"Always start with the orchestrator:
/supabase-pentest
Or run detection first:
supabase-detect on https://example.comCheck auth settings:
1. Supabase Dashboard > Authentication > Providers
2. Look for "Enable email confirmations"
The skill will note this as a security finding (positive or negative depending on your requirements).# 1. Set up audit directory
mkdir myapp-security-audit-2025-01-31
cd myapp-security-audit-2025-01-31
# 2. Install skills
npx skills add yoanbernabeu/supabase-pentest-skills
# 3. Download template
curl -o CLAUDE.md https://raw.githubusercontent.com/yoanbernabeu/supabase-pentest-skills/main/templates/CLAUDE.md
# 4. Launch AI agent (e.g., Claude Code) and run:Run a complete Supabase security audit on https://production.myapp.com
CRITICAL REQUIREMENTS:
1. Use Plan Mode (EnterPlanMode) before starting
2. Initialize supabase-evidence FIRST
3. Execute ALL 24 skills in order
4. Log every action to .sb-pentest-audit.log
5. Save all evidence to .sb-pentest-evidence/
6. Generate comprehensive report
I confirm I am the owner and authorized to test this application.✅ Evidence collection initialized
✅ Supabase detected: https://xyz789.supabase.co
✅ Extracted anon key: eyJhbGc...
⚠️ P1: Service key NOT found (good)
✅ Found 8 exposed tables
⚠️ P0: RLS disabled on 'profiles' table
⚠️ P0: IDOR vulnerability - User A can read User B's data
✅ Storage: 3 buckets found
⚠️ P1: Bucket 'user-uploads' is public
✅ Auth: Signup requires email confirmation (secure)
✅ Report generated: supabase-audit-report.md
Security Score: 62/100 (Grade: D)
3 P0 issues, 2 P1 issues, 4 P2 issuesname: Monthly Security Audit
on:
schedule:
- cron: '0 0 1 * *' # First day of month
workflow_dispatch:
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Supabase Pentest Skills
run: npx skills add yoanbernabeu/supabase-pentest-skills -y
- name: Run Security Audit
run: |
# Use AI agent CLI (example with Claude Code CLI)
claude-code run "
Run complete Supabase audit on ${{ vars.PRODUCTION_URL }}
Auto-confirm all steps.
Save report to ./audit-report.md
"
- name: Upload Report
uses: actions/upload-artifact@v4
with:
name: security-audit-report
path: |
audit-report.md
.sb-pentest-evidence/
- name: Check for Critical Issues
run: |
if grep -q "P0" audit-report.md; then
echo "::error::Critical security issues found!"
exit 1
fi