supabase-audit-realtime
Test Supabase Realtime WebSocket channels for unauthorized subscriptions and data exposure.
What this skill does
# Realtime Channel 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 channel tested**
> - Log to `.sb-pentest-audit.log` **BEFORE and AFTER each subscription 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 Supabase Realtime WebSocket channels for security issues.
## When to Use This Skill
- To check if Realtime channels are properly secured
- To detect unauthorized data streaming
- When Realtime is used for sensitive data
- As part of comprehensive security audit
## Prerequisites
- Supabase URL and anon key available
- Detection completed
## Understanding Supabase Realtime
Supabase Realtime enables:
```
wss://[project].supabase.co/realtime/v1/websocket
```
| Feature | Description |
|---------|-------------|
| Postgres Changes | Stream database changes |
| Broadcast | Pub/sub messaging |
| Presence | User presence tracking |
## Security Model
Realtime respects RLS policies:
- โ
If RLS blocks SELECT, Realtime won't stream
- โ If RLS allows SELECT, Realtime streams data
- โ ๏ธ Broadcast channels can be subscribed without RLS
## Tests Performed
| Test | Purpose |
|------|---------|
| Channel enumeration | Find open channels |
| Postgres Changes | Test table streaming |
| Broadcast | Test pub/sub access |
| Presence | Test presence channel access |
## Usage
### Basic Realtime Audit
```
Audit Realtime channels on my Supabase project
```
### Test Specific Feature
```
Test if Postgres Changes streams sensitive data
```
## Output Format
```
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
REALTIME CHANNEL AUDIT
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Project: abc123def.supabase.co
Endpoint: wss://abc123def.supabase.co/realtime/v1/websocket
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Connection Test
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
WebSocket Connection: โ
Established
Authentication: Anon key accepted
Protocol: Phoenix channels
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Postgres Changes Test
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Subscribing to table changes with anon key...
Table: users
โโโ Subscribe: โ
Subscribed
โโโ INSERT events: ๐ด P0 - RECEIVING ALL NEW USERS
โโโ UPDATE events: ๐ด P0 - RECEIVING ALL UPDATES
โโโ DELETE events: ๐ด P0 - RECEIVING ALL DELETES
Sample Event Received:
```json
{
"type": "INSERT",
"table": "users",
"record": {
"id": "550e8400-e29b-...",
"email": "[email protected]", โ PII STREAMING!
"name": "New User",
"created_at": "2025-01-31T10:00:00Z"
}
}
```
Finding: ๐ด P0 - User data streaming without authentication!
RLS may not be properly configured for Realtime.
Table: orders
โโโ Subscribe: โ
Subscribed
โโโ INSERT events: โ Not receiving (RLS working)
โโโ UPDATE events: โ Not receiving (RLS working)
โโโ DELETE events: โ Not receiving (RLS working)
Assessment: โ
Orders table properly protected.
Table: posts
โโโ Subscribe: โ
Subscribed
โโโ INSERT events: โ
Receiving published only
โโโ UPDATE events: โ
Receiving published only
โโโ DELETE events: โ
Receiving published only
Assessment: โ
Posts streaming respects RLS (published only).
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Broadcast Channel Test
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Attempting to subscribe to common channel names...
Channel: room:lobby
โโโ Subscribe: โ
Success
โโโ Messages: Receiving broadcasts
โโโ Assessment: โน๏ธ Open channel (may be intentional)
Channel: admin
โโโ Subscribe: โ
Success โ Should this be public?
โโโ Messages: Receiving admin notifications
โโโ Assessment: ๐ P1 - Admin channel publicly accessible
Channel: notifications
โโโ Subscribe: โ
Success
โโโ Messages: Receiving user notifications for ALL users!
โโโ Assessment: ๐ด P0 - User notifications exposed
Sample Notification:
```json
{
"user_id": "123...",
"type": "payment_received",
"amount": 150.00,
"from": "[email protected]"
}
```
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Presence Test
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Channel: online-users
โโโ Subscribe: โ
Success
โโโ Presence List: Receiving all online users
โโโ Users Online: 47
Sample Presence Data:
```json
{
"user_id": "550e8400-...",
"email": "[email protected]",
"status": "online",
"last_seen": "2025-01-31T14:00:00Z"
}
```
Assessment: ๐ P1 - User presence data exposed
Consider if email/user_id should be visible.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Summary
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Postgres Changes:
โโโ ๐ด P0: users table streaming all data
โโโ โ
PASS: orders table protected by RLS
โโโ โ
PASS: posts table correctly filtered
Broadcast:
โโโ ๐ด P0: notifications channel exposing user data
โโโ ๐ P1: admin channel publicly accessible
โโโ โน๏ธ INFO: lobby channel open (review if intended)
Presence:
โโโ ๐ P1: online-users exposing user details
Critical Findings: 2
High Findings: 2
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Recommendations
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
1. FIX USERS TABLE RLS
Ensure RLS applies to Realtime:
```sql
ALTER TABLE users ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Users see only themselves"
ON users FOR SELECT
USING (auth.uid() = id);
```
2. SECURE BROADCAST CHANNELS
Use Realtime Authorization:
```javascript
// Require auth for sensitive channels
const channel = supabase.channel('admin', {
config: {
broadcast: { ack: true },
presence: { key: userId }
}
})
// Server-side: validate channel access
// Use RLS on realtime.channels table
```
3. LIMIT PRESENCE DATA
Only share necessary information:
```javascript
channel.track({
online_at: new Date().toISOString()
// Don't include email, user_id unless needed
})
```
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
```
## Realtime Security Model
### Postgres Changes + RLS
```sql
-- This RLS policy applies to Realtime too
CREATE POLICY "Users see own data"
ON users FOR SELECT
USING (auth.uid() = id);
-- With this policy:
-- - API SELECT: Only own data
-- - Realtime: Only own data changes
```
### Broadcast Security
```sql
-- Realtime authorization (Supabase extension)
-- Add policies to realtime.channels virtual table
-- Only authenticated users can join
CREATE POLICY "Authenticated users join channels"
ON realtime.channels FOR SELECT
USING (auth.role() = 'authenticated');
-- Or restrict specific channels
CREATE POLICY "Admin channel for admins"
ON realtime.channels FOR SELECT
USING (
name != 'admin' OR
(SELECT is_admin FROM profiles WHERE id = auth.uid())
);
```
## Context Output
```json
{
"realtime_audit": {
"timestamp": "2025-01-31T14:00:00Z",
"connection": "established",
"postgres_changes": {
"users": {
"subscribed": true,
"receiving_events": true,
"severity": "P0",
"finding": "All user data streaming without RLS"
},
"orders": {
"subscribed": true,
"receiving_events": false,
"severity": null,
"finding": "Properly protected by RLS"
}
},
"broadcast": {
"notifications": {
"accessible": true,
"severity": "P0",
"finding": "User notifications exposed"
},
"admin": {
"accessible": true,
"severity": "P1",
"finding": "AdminRelated in Security
mac-ops
IncludedComprehensive macOS workstation operations โ diagnose kernel panics, identify failing drives, audit launchd startup items, decode wake reasons, triage TCC permission denials, manage APFS snapshots, recover from no-boot. Use for: Mac is slow, slow bootup, won't boot, kernel panic, kernel_task hot, mds_stores CPU, photoanalysisd, cloudd, login loop, gray screen, sleep wake failure, drive failing, IO errors, APFS snapshots eating space, Time Machine local snapshots, Spotlight indexing, launchd, LaunchAgent, LaunchDaemon, login items, TCC permissions, Full Disk Access, Screen Recording denied, Gatekeeper, quarantine, com.apple.quarantine, app is damaged, helper tool, /Library/PrivilegedHelperTools, pmset, wake reasons, dark wake, sysdiagnose, panic.ips, DiagnosticReports, configuration profile, MDM profile, remote diagnostics over SSH.
a11y-audit
IncludedRun accessibility audits on web projects combining automated scanning (axe-core, Lighthouse) with WCAG 2.1 AA compliance mapping, manual check guidance, and structured reporting. Output is configurable: markdown report only, markdown plus machine-readable JSON, or markdown plus issue tracker integration. Use this skill whenever the user mentions "accessibility audit", "a11y audit", "WCAG audit", "accessibility check", "compliance scan", or asks to check a web project for accessibility issues. Also trigger when the user wants to verify WCAG conformance or map findings to a specific standard (CAN-ASC-6.2, EN 301 549, ADA/AODA).
erpclaw
IncludedAI-native ERP system with self-extending OS. Full accounting, invoicing, inventory, purchasing, tax, billing, HR, payroll, advanced accounting (ASC 606/842, intercompany, consolidation), and financial reporting. 413 actions across 14 domains, 43 expansion modules. Constitutional guardrails, adversarial audit, schema migration. Double-entry GL, immutable audit trail, US GAAP.
assess
IncludedAssesses and rates quality 0-10 across multiple dimensions (correctness, maintainability, security, performance, testability, simplicity) with pros/cons analysis. Compares against project conventions and prior decisions from memory. Produces structured evaluation reports with actionable improvement suggestions. Use when evaluating code, designs, architectures, or comparing alternative approaches.
spring-boot-security-jwt
IncludedProvides JWT authentication and authorization patterns for Spring Boot 3.5.x covering token generation with JJWT, Bearer/cookie authentication, database/OAuth2 integration, and RBAC/permission-based access control using Spring Security 6.x. Use when implementing authentication or authorization in Spring Boot applications.
code-hardcode-audit
IncludedDetect hardcoded values, magic numbers, and leaked secrets. TRIGGERS - hardcode audit, magic numbers, PLR2004, secret scanning.