PRR-001 · Billing + webhooks
Subscription tier can be upgraded with a forged webhook
Evidence
The billing handler parses request JSON and applies invoice.paid without verifying the Stripe-Signature header against the raw request body.
Business impact
An unauthenticated caller can submit a fabricated paid event and grant an account Pro access without completing payment.
Recommended fix
Verify every event with Stripe.webhooks.constructEvent(), reject missing or invalid signatures, and make event processing idempotent on the Stripe event ID.
Verification
Integration tests must reject missing/invalid signatures and prove a replayed valid event changes entitlement only once.