# BAYAN — Security Audit Report **Date:** 2026-06-18 --- ## Attack Surface | Component | Exposure | Risk Level | |-----------|----------|------------| | Flask API (7860) | Public via HF Spaces | Medium | | Supabase PostgreSQL | Behind RLS + Auth | Low | | Google OAuth | Delegated to Google | Low | | Model Inference | CPU-bound, no GPU | Low | | localStorage | Client-only | Low | --- ## Authentication & Authorization ### Supabase RLS (Row-Level Security) | Test | Result | Evidence | |------|--------|----------| | Unauthenticated REST access | ✅ BLOCKED | HTTP 401 | | Invalid JWT token | ✅ BLOCKED | HTTP 401 | | Cross-user document access | ✅ BLOCKED | RLS `user_id = auth.uid()` | | Guest session isolation | ✅ PASS | Guest users have unique UUIDs | ### Google OAuth | Test | Result | |------|--------| | OAuth flow uses Supabase SDK | ✅ | | Tokens stored in Supabase session | ✅ | | No custom token handling | ✅ (delegated) | --- ## API Input Validation | Test | Endpoint | Result | Details | |------|----------|--------|---------| | Empty text | All | ✅ Returns 200/400 gracefully | No crash | | Missing `text` field | All | ✅ Returns 400 | `"Text is required"` | | Very long text (10K+) | /api/analyze | ⚠️ Timeout | Pipeline processes all 3 models | | Non-JSON payload | All | ✅ Returns 400 | `"Request must be JSON"` | | SQL injection attempt | /api/analyze | ✅ SAFE | NLP model treats it as text | | XSS `