
Supabase Audit Buckets List
- 317 installs
- 60 repo stars
- Updated January 31, 2026
- yoanbernabeu/supabase-pentest-skills
supabase-audit-buckets-list is a security reconnaissance skill that discovers and enumerates all Supabase storage buckets and their configuration for developers who need to map the storage attack surface before a pentest
About
supabase-audit-buckets-list is a Supabase pentest skill that discovers every storage bucket in a project and records bucket-level configuration as the opening step of storage security reconnaissance. The skill writes findings progressively to `.sb-pentest-context.json` after each bucket is found and logs operations to `.sb-pentest-audit.log` before and after each action so interrupted runs still retain partial results. Developers reach for supabase-audit-buckets-list when auditing Supabase Storage exposure, checking for public buckets, or building a structured pentest report before tightening RLS and bucket policies. It pairs with other skills in yoanbernabeu/supabase-pentest-skills for table and policy review.
- Enumerates all storage buckets in a Supabase project
- First step in storage security reconnaissance
- Writes findings progressively to audit log
- Part of supabase-pentest-skills suite
Supabase Audit Buckets List by the numbers
- 317 all-time installs (skills.sh)
- +14 installs in the week ending Jul 28, 2026 (Skillselion tracking)
- Ranked #621 of 2,203 Security skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/yoanbernabeu/supabase-pentest-skills --skill supabase-audit-buckets-listAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 317 |
|---|---|
| repo stars | ★ 60 |
| Last updated | January 31, 2026 |
| Repository | yoanbernabeu/supabase-pentest-skills ↗ |
How do you list all Supabase storage buckets for security audit?
Discovers and enumerates all Supabase storage buckets in a project as the first step of a storage security reconnaissance audit.
Who is it for?
Developers or security engineers running a Supabase storage reconnaissance pass before tightening bucket ACLs and storage RLS.
Skip if: Developers who only need to upload files or configure buckets without a security audit workflow.
When should I use this skill?
User asks to audit Supabase storage, list buckets, map storage attack surface, or start supabase-pentest bucket reconnaissance.
What you get
A bucket inventory with configuration metadata in `.sb-pentest-context.json` plus an operation log in `.sb-pentest-audit.log`.
- .sb-pentest-context.json bucket inventory
- .sb-pentest-audit.log operation trace
By the numbers
- Writes progressively to `.sb-pentest-context.json` and `.sb-pentest-audit.log` on every bucket discovery
Files
List Storage Buckets
🔴 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 bucket discovered- Log to .sb-pentest-audit.log BEFORE and AFTER each operation- 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 discovers all storage buckets configured in a Supabase project.
When to Use This Skill
- To inventory all storage buckets
- Before testing bucket access permissions
- To identify publicly accessible buckets
- As part of storage security audit
Prerequisites
- Supabase URL and anon key available
- Detection completed
Understanding Supabase Storage
Supabase Storage provides:
https://[project].supabase.co/storage/v1/Buckets can be:
- Public: Files accessible without authentication
- Private: Files require authentication and RLS policies
Storage API Endpoints
| Endpoint | Purpose |
|---|---|
/storage/v1/bucket | List buckets |
/storage/v1/object/list/[bucket] | List files in bucket |
/storage/v1/object/[bucket]/[path] | Access file |
/storage/v1/object/public/[bucket]/[path] | Public file URL |
Usage
Basic Bucket List
List storage buckets on my Supabase projectWith Configuration Details
List all buckets with their security settingsOutput Format
═══════════════════════════════════════════════════════════
STORAGE BUCKETS
═══════════════════════════════════════════════════════════
Project: abc123def.supabase.co
Buckets Found: 5
─────────────────────────────────────────────────────────
Bucket Inventory
─────────────────────────────────────────────────────────
1. avatars
├── Public: ✅ YES
├── File Size Limit: 1MB
├── Allowed MIME: image/jpeg, image/png, image/webp
├── Files (estimated): 1,247
└── Status: ℹ️ Expected public bucket
Public URLs pattern:
https://abc123def.supabase.co/storage/v1/object/public/avatars/[filename]
2. documents
├── Public: ❌ NO (Private)
├── File Size Limit: 50MB
├── Allowed MIME: application/pdf, application/msword, *
├── Files (estimated): 523
└── Status: ✅ Private, needs RLS verification
3. uploads
├── Public: ✅ YES
├── File Size Limit: 100MB
├── Allowed MIME: */* (ANY)
├── Files (estimated): 3,891
└── Status: 🟠 P1 - Public with unrestricted MIME types
Risk: Any file type can be uploaded and accessed
Recommendation: Restrict allowed MIME types
4. backups
├── Public: ✅ YES ← UNEXPECTED
├── File Size Limit: 500MB
├── Allowed MIME: */*
├── Files (estimated): 45
└── Status: 🔴 P0 - Sensitive bucket is PUBLIC
Risk: Backup files publicly accessible!
Immediate Action: Change to private bucket
5. temp
├── Public: ❌ NO
├── File Size Limit: 10MB
├── Allowed MIME: */*
├── Files (estimated): 12
└── Status: ✅ Private temporary storage
─────────────────────────────────────────────────────────
Summary
─────────────────────────────────────────────────────────
Total Buckets: 5
Public Buckets: 3
├── Expected Public: 1 (avatars)
├── P1 Issues: 1 (uploads - unrestricted MIME)
└── P0 Critical: 1 (backups - should be private)
Private Buckets: 2
└── Need RLS verification with supabase-audit-buckets-read
Next Steps:
├── Fix 'backups' bucket - make private immediately
├── Restrict MIME types on 'uploads' bucket
├── Test RLS on private buckets
└── Verify no sensitive files in public buckets
═══════════════════════════════════════════════════════════Bucket Configuration Analysis
| Config | Good | Bad |
|---|---|---|
| public: false | ✅ Private by default | ❌ public: true for sensitive data |
| fileSizeLimit | ✅ Appropriate limits | ❌ No limit or very large |
| allowedMimeTypes | ✅ Restricted list | ❌ */* allows anything |
Context Output
{
"storage": {
"buckets": [
{
"name": "avatars",
"public": true,
"file_size_limit": 1048576,
"allowed_mime_types": ["image/jpeg", "image/png", "image/webp"],
"estimated_files": 1247,
"risk_level": "info",
"expected_public": true
},
{
"name": "backups",
"public": true,
"file_size_limit": 524288000,
"allowed_mime_types": ["*/*"],
"estimated_files": 45,
"risk_level": "P0",
"finding": "Sensitive bucket publicly accessible"
}
],
"summary": {
"total": 5,
"public": 3,
"private": 2,
"p0_issues": 1,
"p1_issues": 1
}
}
}Security Recommendations
For Public Buckets
-- Create restrictive RLS policy even for public buckets
CREATE POLICY "Public read avatars"
ON storage.objects FOR SELECT
USING (bucket_id = 'avatars');
CREATE POLICY "Users upload own avatar"
ON storage.objects FOR INSERT
WITH CHECK (
bucket_id = 'avatars'
AND auth.uid()::text = (storage.foldername(name))[1]
);For Private Buckets
-- Only owners can access their files
CREATE POLICY "Users access own documents"
ON storage.objects FOR ALL
USING (
bucket_id = 'documents'
AND auth.uid()::text = (storage.foldername(name))[1]
);Fix Public Backup Bucket
-- Make bucket private
UPDATE storage.buckets
SET public = false
WHERE name = 'backups';
-- Add strict RLS
CREATE POLICY "Only admins access backups"
ON storage.objects FOR ALL
USING (
bucket_id = 'backups'
AND (SELECT is_admin FROM profiles WHERE id = auth.uid())
);Common Issues
❌ Problem: Cannot list buckets ✅ Solution: Storage API may be restricted. This is actually good security. Note as "unable to enumerate."
❌ Problem: Many buckets found ✅ Solution: Large applications may have many. Focus on public buckets first.
❌ Problem: Bucket count doesn't match expected ✅ Solution: Some buckets may be created dynamically. Check application code.
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:
1. Before starting bucket enumeration → Log the action to .sb-pentest-audit.log 2. After each bucket discovered → Immediately update .sb-pentest-context.json 3. After each configuration analyzed → Log the result
This ensures that if the skill is interrupted, crashes, or times out, all findings up to that point are preserved.
Required Actions (Progressive)
1. Update `.sb-pentest-context.json` with results:
{
"storage": {
"buckets": [ ... ],
"summary": { "total": 5, "public": 3, "private": 2 }
}
}2. Log to `.sb-pentest-audit.log`:
[TIMESTAMP] [supabase-audit-buckets-list] [START] Listing storage buckets
[TIMESTAMP] [supabase-audit-buckets-list] [SUCCESS] Found 5 buckets
[TIMESTAMP] [supabase-audit-buckets-list] [CONTEXT_UPDATED] .sb-pentest-context.json updated3. 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/04-storage-audit/
Evidence Files to Create
| File | Content |
|---|---|
buckets-config.json | All bucket configurations |
buckets/[name]/file-list.json | File listing per bucket |
Evidence Format
{
"evidence_id": "STG-LIST-001",
"timestamp": "2025-01-31T10:35:00Z",
"category": "storage-audit",
"type": "bucket_enumeration",
"request": {
"method": "GET",
"url": "https://abc123def.supabase.co/storage/v1/bucket",
"curl_command": "curl -s '$URL/storage/v1/bucket' -H 'apikey: $ANON_KEY' -H 'Authorization: Bearer $ANON_KEY'"
},
"buckets": [
{
"name": "avatars",
"public": true,
"file_size_limit": 1048576,
"allowed_mime_types": ["image/jpeg", "image/png"],
"risk_level": "info",
"assessment": "Appropriate for public avatars"
},
{
"name": "backups",
"public": true,
"file_size_limit": 524288000,
"allowed_mime_types": ["*/*"],
"risk_level": "P0",
"assessment": "CRITICAL: Backup bucket should not be public"
}
],
"summary": {
"total_buckets": 5,
"public_buckets": 3,
"private_buckets": 2,
"critical_misconfigurations": 1
}
}Add to curl-commands.sh
# === STORAGE BUCKET ENUMERATION ===
# List all buckets
curl -s "$SUPABASE_URL/storage/v1/bucket" \
-H "apikey: $ANON_KEY" \
-H "Authorization: Bearer $ANON_KEY"
# List files in specific bucket
curl -s "$SUPABASE_URL/storage/v1/object/list/backups" \
-H "apikey: $ANON_KEY" \
-H "Authorization: Bearer $ANON_KEY"Related Skills
supabase-audit-buckets-read— Attempt to read filessupabase-audit-buckets-public— Find misconfigured public bucketssupabase-audit-storage-rls— Test storage RLS policies
Related skills
How it compares
Pick this over generic cloud storage scanners when the target is Supabase Storage and findings must feed a structured Supabase pentest context file.
FAQ
What files does supabase-audit-buckets-list write during an audit?
supabase-audit-buckets-list writes bucket discoveries to `.sb-pentest-context.json` after each bucket is found and logs operations to `.sb-pentest-audit.log` before and after each action, so partial results survive interruptions.
When should developers run supabase-audit-buckets-list?
supabase-audit-buckets-list should run as the first storage reconnaissance step when auditing Supabase projects for exposed buckets, misconfigured ACLs, or pre-release pentest coverage of the storage layer.