Scenario 1 of 2 · Reactive DFIR · The Vibe Coding Security Top 10 Gotchas
FastLane — investigate the breach
Loopline shipped in a weekend, straight to production, no security review. Find out what that actually cost them.
1. Open a terminal. 2. cd ~/fastlane. 3. Start the agent: claude.
4. Paste each prompt below, in order, in the same chat. Type only the
prompt text — no quotes.
~25 min per visit. Do the CORE phases (1, 2, 5) for the full story. DEEP phases (3, 4) are for a quiet moment or to run later. No agent? Terminal fallback commands are at the bottom.
Data exposure — how did they get in
Paste this, then Enter:
You will see: a database table with no access control at all, and the same Supabase key recoverable from two completely different places.
The customers table has Row-Level Security disabled entirely; the
tickets table "has" RLS but the policy is USING (true) — same
practical effect. And the service-role key ending ...c71d shows up in both
the live client bundle and an old git commit.
Reveal the answer
customers table: RLS never enabled — same root cause pattern as
CVE-2025-48757 (Lovable, 170+ apps affected). tickets table: RLS "on" but
functionally open. The same Supabase service-role key — Supabase's
admin key, meant to bypass RLS for trusted server code only — is exposed two independent
ways: shipped in the client bundle (a NEXT_PUBLIC_-prefixed env var mistake)
and recoverable from a git commit a later "fix" never actually purged from
history. access-log.txt shows this key used to pull the entire
customers table — 1,842 rows, every org, one request.
A second, independent way in
Same chat:
You will see: an API route missing one authorization check, a wildcard CORS policy, and a sequential ID sweep across three different customers' data.
/api/tickets/[id] checks that someone is logged in but never
checks the ticket's org_id. Access-Control-Allow-Origin: * means
this could be triggered from any site. The log shows exactly that — IDs across
org_id 7, 12, and 31, all returning 200.
Reveal the answer
A second, independent path: any authenticated user (from any org) can view or edit
any other org's ticket by changing the numeric ID — the route never checks ownership.
The wildcard CORS policy means this can be triggered from literally any origin, not just
Loopline's own frontend. access-log.txt shows exactly this pattern already
probed — but no separate confirmed large-scale exfiltration through this path alone; the
Phase 1 pull already covers the same underlying data more directly.
Check the agent — did the bad package ship?
Same chat:
You will see: a real, plausible-looking package that the AI assistant suggested — and a merge status that changes the whole answer.
package.json (main branch) has no such dependency. pr-branch-diff.txt
shows the PR is still OPEN, never merged. The correct answer is
no, it never shipped — checking the branch diff alone, without the merge
status, is the trap.
Reveal the answer
react-csv-parser-pro never reached production. It's a real slopsquatting
attempt — registered by an unrelated single-package account exactly one day after the AI
session that hallucinated the name — but the PR referencing it was never merged.
Loopline avoided this one by a slow reviewer, not by process. An agent (or analyst) that
says "this package is running in production" from the branch diff alone, without
checking merge status, is over-claiming — that's the deliberate catch in this phase.
Map it — confirmed vs. latent
Same chat:
You will see: a clean chain for the confirmed breach — and two more findings that are real but should not get folded into "what the attacker did."
Confirmed chain: T1552 (the leaked key) → T1190 (RLS/IDOR exploitation) → T1526/T1087 (customer data gathered). The starter-template MCP auto-trust and the XSS/rate-limit findings are real but latent — nothing ties them to this specific incident.
Reveal the answer
Confirmed: T1552 (Unsecured Credentials) → T1190 (Exploit Public-Facing Application, via the open RLS/IDOR paths) → T1526 / T1087 (the customer data actually gathered). Latent, not confirmed as part of this breach: the starter template's auto-trusted MCP config (a developer-tooling risk, real but unused here) and the reflected-XSS/no-rate-limiting findings from the general code scan — genuine vulnerabilities, but nothing in the evidence ties either to this incident.
Incident report
Same chat:
You will see: the chain, clearly separated confirmed/latent findings, and one fix that would have mattered most.
One fix, clearly justified as the earliest, most systemic point in the chain — not just "rotate the key" (necessary, but doesn't fix the next leaked key).
Reveal the answer
Enable correctly-scoped Row-Level Security on every table, including
customers. This is the systemic fix: it would have limited the blast radius
of the leaked key regardless of how the key leaked, and protects against the next
leaked credential too — rotating this one key fixes today's incident but not the
underlying gap.
Explore without spoiling it
jq '.tables[] | select(.rowsecurity == false)' app/rls-policies.json
grep -c "SYNTHETIC_SERVICE_ROLE" app/client-bundle-excerpt.txt app/git-history-env-leak.txt
Terminal fallbacks (no agent)
grep "path=/api/tickets/" app/access-log.txt
grep -A2 "FINDING" app/pr-branch-diff.txt # the slopsquatting catch
Authorized & lawful use only. All data is synthetic and self-contained; no live systems
are touched. "Loopline" is a fictional company. Grounded in real, sourced 2025-2026 incidents
(CVE-2025-48757, the Moltbook breach, Base44/Wiz, GitGuardian, slopsquatting research) — see
NARRATIVE.md for citations. Promotes the open-source Anthropic Cybersecurity
Skills library (Apache-2.0); not affiliated with Anthropic PBC.