0%
Vibe44 Logo

Threat Model (STRIDE)

Systematic threat analysis for this codebase's critical flows. Updated per major feature change.

Trust Boundaries

graph TB
    subgraph "Public Internet"
        Browser["Browser Client"]
        Webhook["Payment Webhooks"]
        OAuth["OAuth Providers"]
    end

    subgraph "Edge Layer"
        Middleware["Next.js Middleware<br/>(proxy.ts)"]
        CDN["Vercel CDN"]
    end

    subgraph "Application Layer"
        ServerActions["Server Actions"]
        APIRoutes["API Routes"]
        AIChat["AI Chat Service"]
    end

    subgraph "Data Layer"
        Supabase["Supabase Auth + DB"]
        Redis["Upstash Redis"]
        Gemini["Google Gemini API"]
        PaymentAPIs["Payment Provider APIs"]
    end

    Browser --> CDN --> Middleware --> ServerActions
    Middleware --> APIRoutes
    ServerActions --> Supabase
    ServerActions --> AIChat --> Gemini
    APIRoutes --> PaymentAPIs
    Webhook --> APIRoutes
    OAuth --> Middleware
    Middleware --> Redis

1. Authentication Flow

Scope: Email + password, OAuth (Google/GitHub enabled; Discord/Twitter/Apple/Facebook/LinkedIn scaffolded but commented), magic link, passkeys, MFA (TOTP).

ThreatCategoryMitigationStatus
Credential stuffingSpoofingEdge rate limiting (60 req/min/IP), circuit breaker (5 violations → 24h ban)✅
Session hijackingSpoofinghttpOnly + Secure + SameSite=Lax cookies, HMAC-bound CSRF token validation✅
Account takeoverSpoofingStep-up authentication (re-verification) for high-risk actions (password, MFA)✅
MFA bypass via OAuthSpoofingUniversal MFA in middleware — AAL1→AAL2 on all auth methods✅
Password brute forceSpoofingArgon2id (Supabase), failed attempts →auth_events✅
Token replayTamperingShort-expiry JWT, auto-refresh in middleware, PKCE for OAuth✅
Login enumerationInfo DisclosureGeneric error, no timing leaks✅
MFA service failureDoSFail-closed: redirect to login on AAL check error✅
Role escalationPrivilege ElevationRLS prevents self-role-update,IS NOT DISTINCT FROM check✅

Residual Risks:

  • Magic link interception in transit (mitigated: short expiry, HTTPS callback)
  • Passkey attestation not verified (relying on Supabase defaults)

2. Payment Processing Flow

Scope: 5 providers (Stripe, Polar, LemonSqueezy, Dodo, Creem), webhooks, subscription sync.

ThreatCategoryMitigationStatus
Webhook forgerySpoofingHMAC-SHA256 per provider✅
Duplicate replayTamperingRetry-safe event claim via webhook_logs table✅
Duplicate entitlementTamperingUnique provider subscription/payment IDs deduplicate terminal billing state✅
Price manipulationTamperingServer-side lookup from PRICING_TIERS, never trusts client✅
Provider API hangDoS30s timeout via AbortController✅
Subscription tamperingTamperingService-role-only INSERT/UPDATE RLS✅
Redirect phishingSpoofingSame-origin allowlisted checkout and portal return URLs✅
PCI data exposureInfo DisclosureZero card storage — delegated to providers via hosted checkout✅

Residual Risks:

  • Provider-side compromise sends valid signatures with malicious data (mitigated: Zod validation)
  • Webhook delivery failure causes state drift (mitigated: provider retry + manual reconciliation)
  • Provider cancellation failure during account deletion leaves paid user data intact for retry rather than deleting local state first

3. AI Chat Flow

Scope: Gemini-powered support, RAG pipeline, knowledge base.

ThreatCategoryMitigationStatus
Prompt injectionTamperingSystem prompt via systemInstruction (separated from user content)⚠️
KB poisoningTamperingSuper-Admin-only management (RLS)✅
Credit farmingDoSPer-tier rate limiting via centralized client IP attribution,credits_used tracking✅
Conversation IDORInfo DisclosuregetConversationForUser() verifies authenticated conversation ownership✅
PII in responsesInfo DisclosureSystem prompt instructs no PII disclosure⚠️
API key leakInfo DisclosureServer-side only, never in NEXT_PUBLIC_*✅
Gemini failureDoSTry-catch + user-friendly error✅

Residual Risks:

  • Multi-turn injection could shift AI behavior (mitigate: per-conversation system prompt)
  • RAG context could surface sensitive content (mitigate: per-user RAG scoping)

4. ️ super-admin Panel Flow

Scope: super-admin dashboard, user management, impersonation, analytics.

ThreatCategoryMitigationStatus
Unauthorized super-admin accessSpoofingMiddleware-level profiles.role check✅
Impersonation abuseRepudiationHMAC-signed context cookie; logged with super-admin ID, target ID, timestamp; 1h expiry; read-time super-admin/target revalidation✅
Mass data modificationTamperingAppend-only activity_logs + auth_events✅
Super-Admin session theftSpoofingSame session security + super-admin-only cookie scope✅
Privilege escalationPrivilege ElevationRLS IS NOT DISTINCT FROM prevents self-role change✅

Residual Risks:

  • Compromised super-admin = broad access (mitigate: MFA required, single super-admin default)

5. Multi-Tenant Organization Flow

Scope: Org creation, invitations, RBAC, org switching.

ThreatCategoryMitigationStatus
Cross-org data accessInfo Disclosureactive_org_id scoping + RLS✅
Invitation forgerySpoofingServer-side token validation, single-use✅
Org role escalationPrivilege ElevationOwner/super-admin permission required (server-side)✅
Seat limit bypassDoSSerializable invitation acceptance transaction around capacity check and member add✅
Org billing leakInfo DisclosureBilling filtered by org membership + RLS✅

Residual Risks:

  • Org owner transfer lacks email verification (mitigate: confirmation flow)

6. Abuse Cases

OWASP A06:2025 — Insecure Design requires documenting abuse scenarios and controls.

AI Credit Farming

AttributeDetail
ScenarioMultiple free-tier accounts exhaust AI credits without paying
ControlsPer-tier daily limits in lib/config/pricing.ts, credits_used tracking, edge rate limiting (60 req/min/IP)
ResidualDistributed farming across IPs (mitigate: email verification, CAPTCHA)

Support Ticket Spam

AttributeDetail
ScenarioBot/user floods support queue
ControlsAuth-only creation, rate limiting,activity_logs tracking
ResidualAuth spam within limits (mitigate: per-user ticket-per-hour cap)

Affiliate Fraud

AttributeDetail
ScenarioFake referral clicks, self-referrals, expired referral reuse, stale payout completion, or browser-fingerprint exposure
ControlsSHA-256 hashing for IP and user-agent values, tracking endpoint cookies, buyer-ID self-referral rejection, expiry checks, pending-only payouts
ResidualVPN-distributed fraud and collusive accounts (mitigate with manual review, payout thresholds, and provider-side payout holds)

Mass Enumeration

AttributeDetail
ScenarioProbing login/signup for user existence
ControlsGeneric errors, constant-time responses, edge rate limiting
ResidualTiming side-channels in OAuth (mitigate: constant-time rendering, aggressive limits)

Free Tier Abuse

AttributeDetail
ScenarioDisproportionate compute/storage consumption
ControlsFeature flags gate premium features server-side, per-tier limits, pagination caps (100), validated upload MIME/size limits, MIME-derived object extensions
ResidualHeavy usage near boundaries (mitigate: usage dashboard, upgrade prompts)

Webhook Replay

AttributeDetail
ScenarioReplaying valid webhook for duplicate payments
ControlsHMAC-SHA256, durable provider event IDs, (provider, event_id) partial unique index, success skip, active-processing skip, failed/stale retry, unique provider subscription/payment IDs
ResidualNone — signature + dedup fully prevents replay

Copyright © 2026 Vibe44. Built with ❤️ by Scale with Alap.