Skip to content

🚨 CRITICAL: RLS Policy Vulnerability Allows Cross-User Data Access #35

Description

@laminko

🚨 Critical Security Vulnerability: RLS Policy Breach

Summary

The current Row Level Security (RLS) policies contain a critical vulnerability that allows any anonymous user to access ALL other anonymous users' spending data, completely breaking user data isolation.

Vulnerability Details

Root Cause

The RLS policies use a wildcard pattern user_id LIKE 'anon_%' that matches ALL anonymous users instead of isolating individual users:

CREATE POLICY "Users can view own spending entries" ON public.spending_entries
    FOR SELECT USING (user_id = current_setting('request.jwt.claims', true)::json->>'sub' OR user_id LIKE 'anon_%');

Impact Assessment

  • Severity: 🔴 CRITICAL
  • Data Exposure: Complete cross-user data access for anonymous users
  • Affected Tables: spending_entries, categories
  • User Impact: ALL anonymous users can see each other's spending data

Proof of Concept

  1. Anonymous User A gets ID: anon_abc123
  2. Anonymous User B gets ID: anon_xyz789
  3. Both users can access each other's data because both match user_id LIKE 'anon_%'

Additional Security Issues Identified

1. Mixed Authentication Systems

  • Uses both Supabase anonymous auth AND client-side generated IDs
  • Creates confusion and potential bypass mechanisms
  • Client-side user IDs can be manipulated via localStorage

2. No Rate Limiting

  • No protection against data scraping or abuse
  • Anonymous users can perform unlimited database queries

Required Fixes

Immediate (Critical)

  • Fix RLS policies to use exact user matching only
  • Remove wildcard anon_% patterns from all policies
  • Implement proper user isolation

High Priority

  • Standardize on Supabase anonymous auth only
  • Remove client-side user ID generation
  • Remove localStorage user_id manipulation

Medium Priority

  • Add rate limiting and abuse prevention
  • Implement audit logging
  • Add security monitoring

Proposed Solution

1. Fix RLS Policies

-- Remove dangerous wildcard, use exact match only
CREATE POLICY "Users can view own spending entries" ON public.spending_entries
    FOR SELECT USING (user_id = auth.jwt()->>'sub');

2. Standardize Authentication

  • Use only Supabase's built-in anonymous authentication
  • Remove all client-side user ID generation
  • Remove localStorage user_id storage

Files Affected

  • SUPABASE_SETUP.md - Contains vulnerable RLS policies
  • src/composables/useAuth.ts - Mixed authentication logic
  • All database policies need immediate review

Priority

This is a production-critical security vulnerability that must be addressed immediately before any further development or deployment.


🤖 Generated with Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingsecurity

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions