Reported · linked sourceMarch 2025
"Guys, I'm under attack." EnrichLead lasted about a week after going viral.
A founder posted that his SaaS was built entirely with Cursor, zero hand-written code. Two days later: "random things are happening, maxed out usage on API keys, people bypassing the subscription, creating random shit on db." API keys sat in the frontend, there was no real authorization, no rate limiting, no input validation. He wrote "as you know, I'm not technical so this is taking me longer than usual." When he asked the AI to fix it, it kept breaking other parts. The app was shut down.
WHY THE AI DID NOT CATCH IT
The model built what it was asked to build: a working product demo. Nobody asked it what a hostile user would do with the network tab open.
WHAT A CTO IN YOUR CORNER CATCHES
Before anyone sees the URL: keys server-side, spend caps on every provider, rate limits on every public endpoint, and a plan for the day it goes viral, because that day is the attack.
Source: Tech Startups: When vibe coding goes wrong
Reported · linked sourceJanuary 2026
Moltbook shipped its Supabase key in the JavaScript bundle. 1.5 million API tokens followed.
A social network for AI agents whose creator said he "didn't write a single line of code." Researchers found the Supabase key in the client bundle with Row Level Security disabled, giving full read and write access to the production database within minutes of looking: 1.5 million agent authentication tokens, 35,000 email addresses, and 4,060 private agent conversations.
WHY THE AI DID NOT CATCH IT
The anon key is meant to be public. Row Level Security is what makes that safe. The model shipped one without the other, and nothing in the build complained.
WHAT A CTO IN YOUR CORNER CATCHES
A key in the bundle is a fact, not a bug. The review asks: with this key, what can I do? If the answer is "everything," the app is not live yet.
Source: Wiz: Exposed Moltbook database
Stat · sourced numberOctober 2025
400+ live secrets in 5,600 vibe-coded apps.
Escape scanned 5,600 public apps built on Lovable, Base44, Create.xyz, Vibe Studio, and Bolt. They found over 2,000 vulnerabilities, 400+ exposed secrets, and 175 instances of exposed personal data including medical records and bank identifiers. Supabase JWTs were routinely in frontend code. Every finding was in a live production system.
WHY THE AI DID NOT CATCH IT
Escape concluded it was architectural, not a series of individual mistakes. The platforms generate the same shape of app, and the shape leaks.
WHAT A CTO IN YOUR CORNER CATCHES
A secrets scan of the built bundle on every deploy, not the source, the bundle. It is a two-minute check that the tooling never runs for you.
Source: Escape: methodology
Composite · details inventedNames and details invented
NEXT_PUBLIC_OPENAI_API_KEY.
Priya asked for "an AI summary button." The model needed the key on the client, so it named the variable with the prefix that ships it to the browser. The feature worked in the demo. Eleven days after launch a bot found the key in the bundle. The Saturday bill was $9,400 before the card declined.
WHY THE AI DID NOT CATCH IT
The prefix is how the framework tells you a variable is public. The model used it because the code it wrote ran in the browser. It solved the problem it had.
WHAT A CTO IN YOUR CORNER CATCHES
No provider key ever ships to a client. The call goes through a server route with a spend cap set at the provider and an alert at half of it. Then the key is rotated, because it has already been in one git history too many.
Composite · details inventedNames and details invented
"The anon key kept failing, so I used the service role key."
A helper in a Bolt-built CRM used the service-role key on the client "temporarily" because a query returned no rows. The service-role key bypasses every security policy. It lived in the bundle for four months. Nobody exploited it, as far as anyone can tell. That last clause is the problem.
WHY THE AI DID NOT CATCH IT
The query failed because Row Level Security was working. The model fixed the symptom with the one key that makes every check disappear.
WHAT A CTO IN YOUR CORNER CATCHES
The service-role key has exactly one home: the server. Any appearance anywhere else fails the review, and "as far as anyone can tell" triggers a rotation and a log audit.
Composite · details inventedNames and details invented
The starter template had real keys in it. He pushed it public.
Tomas cloned his own working app as a template for a second product, made the repo public to share a screenshot, and pushed. The .env file went with it. Stripe, Resend, OpenAI, and the database URL. GitHub's scanner caught the Stripe key. The others sat there for a day.
WHY THE AI DID NOT CATCH IT
The model had written .env into the project and never a .gitignore, because nobody asked for one.
WHAT A CTO IN YOUR CORNER CATCHES
A .gitignore before the first commit. Pre-commit secret scanning. And a written list of every key the product has, so rotating all of them takes ten minutes instead of a weekend of remembering.