A vibe code security audit, ordered by time budget instead of category.
Most public checklists for AI-generated apps are organized by front-end / back-end / dev-ops, which reads well in a blog post and is useless when you have one evening before launch. This is the triage version. Three passes, in order: a 60-minute kill-switch pass, a 4-hour trust-boundary pass, and a 1-day hardening pass. If you only ever do pass 1, you have closed the class of bug that puts a vibe-coded app on the front page of Hacker News.
Direct answer, verified 2026-05-07
Run three passes, in this order.
- Pass 1 (60 min, kill switches): committed secrets in git, unauthenticated write endpoints, IDOR on user-scoped routes, password hashing on the server.
- Pass 2 (4 hr, trust boundaries): CSRF on cookie auth, per-IP rate limit on hot endpoints, row-level security with a written test, and the line every other checklist still skips: an OAuth scope audit on every AI vendor connected to your data.
- Pass 3 (1 day, hardening): CORS allowlist, CSP and standard headers, dependency hygiene with a slopsquatting check, file-upload validation, error verbosity, Stripe webhook signature plus idempotency.
The category-shaped reference list I cross-checked against: github.com/benavlabs/vibe-check (17 categories, well-cited). The pass ordering and the AI-vendor OAuth line are the parts of this guide that come from field engagements, not from that repo.
Why every public checklist is structured the wrong way
I read the seven most-cited public checklists for AI-generated apps before writing this. The benavlabs vibe-check repository lists 17 vulnerability categories from misconfigured RLS through slopsquatting. The Replit tutorial groups items into front-end, back-end, and practical habits. The Aikido four-tier guide goes from table-stakes through container hardening. The Cloud Security Alliance Secure Vibe Coding Guide reads like an OWASP top-10 cousin. They are all correct. They all have the same shape: a taxonomy of items, equally weighted, ordered by category.
The shape fails the moment you actually have to use the list. Vibe-coded apps get audited under deadline pressure: someone DM'd a thread, you said yes, the launch is in twelve hours, and you have to figure out whether to pull the plug. A list ordered by category gives you no priority signal. A list ordered by time budget tells you what to look at first, second, third, and what is genuinely safe to leave for next week. Verbose error messages and a leaked Stripe live key are not peers. Pass 1 treats them like they are not.
One other shift since most of those guides were written. The April 2026 Vercel and Context.ai breach changed which line items actually matter. None of the seven checklists I cross-checked lists an AI-vendor OAuth scope audit as a step. After that breach, it is the most underweighted item on the surface. Pass 2 adds it.
The three passes, in order
60 min
kill switches
4 hr
trust boundaries
1 day
hardening
Pass 1 is what you do tonight. Pass 2 is what you do this weekend. Pass 3 is what you do in the first week after launch. Each pass is a strict prefix of the next; you do not skip ahead.
Pass 1: 60-minute kill switches
Four checks. Every one of them, if it comes back red, means the app is already compromised the moment a stranger clicks Sign Up. If pass 1 takes longer than 90 minutes, your app is bigger than a single-binary SaaS, and you should still do these four first.
Committed secrets
git log -p plus a grep across the working tree for SUPABASE_SERVICE_ROLE_KEY, OPENAI_API_KEY, STRIPE_SECRET_KEY, AWS_SECRET_ACCESS_KEY, JWT_SECRET, and any sk_live or pk_live shape. If a key shows up in any commit, rotate it before you finish reading this line; you cannot un-leak a key by deleting the file.
Unauthenticated write endpoints
Curl every POST, PUT, PATCH, DELETE route in the codebase with no Authorization header. Any 200 or 201 is a write you do not own. Vibe-coded apps drop auth middleware on the route most often added last (the new admin endpoint, the demo route, the data-import endpoint).
IDOR on user-scoped routes
Sign in as user A, copy the URL of any record they own. Sign in as user B in a different browser, paste the URL. If you see user A's data, you have IDOR and every record in the table is reachable from any account. The fix is server-side ownership checks on every read and write, not just on the form that produced the URL.
Password hashing on the server
Find the place where the sign-up handler stores the password. It must be bcrypt, argon2, or scrypt with reasonable parameters. SHA256 of a password is not hashing. Plaintext compare is not hashing. If you used Supabase Auth, Clerk, Auth.js with a real provider, or any other named auth tool, this one is usually safe; if you wrote the auth handler yourself with the AI assistant, double-check.
What pass 1 deliberately does not include: any kind of header audit, any dependency scan, any policy work. Those are real, but none of them produces a same-day incident. Pass 1 is the strict same-day incident class.
Pass 2: 4-hour trust boundaries
Trust boundaries are the lines between users, between users and the system, and between the system and its vendors. Every vibe-coded app has at least three of them, and the AI assistant does not see them when it generates code. Each item in pass 2 ties one of those lines down.
CSRF on cookie-auth state changes
Any route that mutates state with a cookie session needs a CSRF token, a same-site cookie at strict, or a custom header check on the server. The vibe-coded copy-paste pattern that breaks this is a fetch handler that reads JSON, returns 200, and trusts the cookie alone.
Per-IP rate limit on hot endpoints
/api/login, /api/signup, /api/forgot-password, plus any endpoint that costs you money to serve (an LLM call, a transactional email send, a Stripe charge). Numbers come from your real traffic, not from priors. A login limit of 10 attempts per minute per IP is generous for humans and brutal for credential stuffing.
Row-level security with a written test
If you are on Postgres or Supabase, RLS must be enabled on every table that holds user data. Then write the test that runs as user A and tries to select from user B's rows; the assertion is that the query returns zero rows. RLS without a test is RLS that quietly stops working the next time someone touches a policy.
AI-vendor OAuth scope audit (the line everyone misses)
List every AI tool, automation platform, and third-party integration connected to your data. For each one, open the OAuth consent screen and read the scopes. Any scope of the form 'Allow All', '*', 'admin', or 'full access' is a credential you handed to the next breach. The April 2026 Vercel and Context.ai pivot ran on exactly this. Replace each over-broad scope with the minimum needed, or revoke the integration.
The fourth item is the one I would put first if I had to pick one. The next section is why.
“ShinyHunters listed the data for sale at this price after the OAuth-scope pivot reached Vercel's environment variables.”
Vercel and Context.ai breach, April 19-20, 2026 (referenced on c0nsl SVC-007)
The AI-vendor OAuth scope line, in detail
Here is the public timeline of the April 19-20 2026 incident, as it concerns this checklist. A Context.ai employee's Google account was compromised. Context.ai had been granted an “Allow All” OAuth scope into a Google Workspace that Vercel also used. The attacker rode that scope from one company's account into another company's mail, drive, and shared workspace, and from there into Vercel's environment variables. The ShinyHunters group then listed the data for $2M. Every step of this is well documented and is the reason c0nsl SVC-007 (AI Vendor Security Review) exists as a named, fixed-fee service.
The audit step that would have stopped this is one paragraph long. List every AI vendor connected to your data. For each one, open the OAuth consent screen and read the scopes verbatim. Any scope of the form “Allow All”, “*”, “admin”, or “full access” is a credential you handed to the next breach. The fix is to revoke the integration or reissue with the minimum needed scope. None of the seven public checklists I read for this guide includes that step today.
how the scope pivot actually ran
This is not a theoretical attack class. It is the largest documented vibe-coded-stack breach of 2026, the one that put AI vendor OAuth hygiene on every operator's radar in the same week. If your audit list does not have it, your audit list is six months out of date.
Pass 3: 1-day hardening
Pass 3 is everything you should do, none of which is on fire. It is roughly the union of the items from the public checklists minus the ones already covered in passes 1 and 2. Working from the list of the most-cited items across the seven references I checked, the day-of work is:
- CORS allowlist. Replace any wildcard Access-Control-Allow-Origin with a specific list of front-end origins.
- Security headers. Content-Security-Policy with a specific script-src, X-Content-Type-Options nosniff, HSTS with a real max-age, Referrer-Policy strict-origin-when-cross-origin, X-Frame-Options DENY or a frame-ancestors CSP equivalent.
- Dependency hygiene plus slopsquatting check. Run an audit (npm audit, pip-audit, or a tool of your choice). Cross-check every package the AI assistant suggested against the real registry; AI agents hallucinate package names that do not exist, and a malicious actor can publish to the hallucinated name. Pin the versions you ship.
- File upload validation. Validate the actual bytes, not the client-provided MIME type. Cap upload size at the application layer. If you pass through to S3, presigned URLs with a content-type guard are the right shape.
- Error verbosity. No stack traces, table names, or framework version strings in production responses. 5xx responses are short and give an incident ID; the detail goes to the log, not the client.
- Stripe webhook signature plus idempotency. Verify the Stripe-Signature header on every webhook. Use the event ID as an idempotency key so a replay does not double-bill.
- Verbose-error fuzz on the auth surface.The login error message must be the same for “wrong password” and “no such user”; otherwise you have an account-enumeration oracle.
- Logging without leaking. Redact tokens, full card numbers, and password fields from any structured log line before it leaves the process.
What this looks like as a c0nsl engagement
For most SMB-shaped vibe-coded apps the work fits the published $500 to $2,000 small-integration tier. Bring me a repo or a deploy URL, your auth surface, your third-party integration list, and one paragraph on what the app does. I run pass 1 and pass 2 by hand, run a tooling pass for the static checks, write a remediation list ordered by blast radius, and ship the report in a few days. The named version of this service is SVC-007, AI Vendor Security Review, which exists specifically because of the April 2026 Vercel and Context.ai breach. It pairs naturally with SVC-008, Stack Selection for teams that also want a second opinion on which platforms and models to keep. Adjacent reading on this site: Claude Code, edge WAF, and DDoS mitigation covers the same kind of human-and-agent split applied at the edge layer.
Get a real audit on your real app
Bring the repo, your integration list, and one paragraph on what the app does. I run pass 1 and pass 2 by hand, do the OAuth scope walk, and ship a remediation list at the published rate.
Frequently asked questions
Why order the checklist by time budget instead of by category?
Because most vibe-coded apps get audited under deadline pressure, not at the start of a quarter. The classic shape (front-end, back-end, dev-ops, monitoring) reads well in a blog post but gives you no priority signal when you have one evening before launch. A triage order says: the first 60 minutes go to the things that, if wrong, mean the app is already compromised the moment a stranger clicks Sign Up. The next 4 hours go to the trust boundaries between users and between vendors. The remaining day goes to hardening that matters but is not on fire. If you only ever do pass 1, you have closed the catastrophic class of bugs. The category-shaped lists do not give you that, because category-shaped lists treat verbose error messages and an exposed Stripe key as peers.
What is on the 60-minute kill-switch pass, in order?
Run git log and grep the working tree for keys (SUPABASE_SERVICE_ROLE_KEY, OPENAI_API_KEY, STRIPE_SECRET_KEY, AWS keys, any token shape ending in a long base64 string). Then pull the .env from the deploy host and confirm none of those are in the public repo. Second, hit every API route that mutates data without an auth header; if even one returns 200, you have an unauthenticated write endpoint. Third, log in as user A, copy the URL of any record they own, log in as user B in a different browser, and try to load it; if it returns user A's data, you have IDOR. Fourth, look at the sign-up form and confirm there is a real password hash function on the server, not a homemade SHA256 or, worse, a plaintext compare. Those four checks usually take under an hour and they cover the failure modes that cause an instant front-page incident.
What is on the 4-hour trust-boundary pass?
First, CSRF on every state-changing route that uses cookie auth. Second, per-IP rate limit on /api/login, on any password-reset endpoint, on /api/signup, and on any endpoint that costs you money to serve (an LLM call, a transactional email send). Third, row-level security if you are on Postgres or Supabase, with a written test that proves user A cannot select from user B's rows even with a forged JWT. Fourth, the line every other checklist still misses: an OAuth scope audit on every AI vendor or third-party tool connected to your data. The April 2026 Vercel breach started with one Context.ai employee's compromised Google account and an 'Allow All' OAuth scope; that scope let attackers pivot into Vercel's Google Workspace and environment variables, and ShinyHunters listed the data for $2M. Treat every Allow All scope on every AI integration as a credential you handed to the next breach.
What is on the 1-day hardening pass?
CORS configured to a specific allowlist instead of wildcard. Content-Security-Policy header with at least default-src self and a script-src that does not include unsafe-inline (or, if it does, a written reason). HSTS, X-Content-Type-Options, Referrer-Policy. A dependency audit that flags any unverified package the AI assistant suggested but you did not personally choose (slopsquatting check: many AI agents hallucinate package names that match no real npm or PyPI entry, then a malicious actor publishes one to that name). File-upload validation that does not trust the client-provided MIME type. Error responses that do not leak stack traces or table names. Stripe webhooks with signature verification and idempotency keys. None of these is going to put you on the front page tomorrow, but each one is the cheap layer of defense that stops the second-day attacker who already got past the obvious holes.
Why is the AI-vendor OAuth scope audit not on the existing checklists?
Because most of the public checklists predate the April 2026 wave of breaches that came through AI integrations. The dominant lists I cross-checked (the benavlabs vibe-check repo with 17 categories, the Replit security tutorial, the Aikido four-tier guide, the Cloud Security Alliance Secure Vibe Coding Guide) all enumerate the OWASP-style classics: RLS, secrets in source, CSRF, rate limit, headers, parameterized queries, file uploads. None of them lists 'audit the OAuth scopes you granted to every AI vendor that touches your data' as a checklist line. After the Vercel and Context.ai pivot, that line is the most underweighted item on the entire surface. It belongs on every audit.
How does this connect to what c0nsl actually sells?
Service SVC-007 on the homepage is a fixed-fee AI Vendor Security Review. It was added to the services list in direct response to the April 2026 Vercel and Context.ai breach. The deliverable is a written audit of every AI tool in the stack, the OAuth scopes each one was granted, env-var hygiene across deploy hosts, and a remediation list ordered by blast radius. The work fits the published $500 to $2,000 small-integration tier on this site, lands in a few days, and pairs with the AI Stack Selection audit (SVC-008) for teams that also want a second opinion on which platforms and models to keep. Rates are on the page, not behind a strategy call.
Should I run an automated scanner instead of doing this by hand?
Run both. A SAST tool (Semgrep, GitHub CodeQL, the open-source Aikido tier) catches the syntactic patterns at scale: weak crypto calls, hardcoded secrets, dangerous sinks. A dependency scanner catches known-CVE packages. A vibe-coded app benefits a lot from a one-time scan because the AI assistant tends to ship the same handful of antipatterns over and over. What automation will not catch is the architectural mistakes: an authorization model that lets user A read user B's records by ID, an OAuth scope that grants Allow All to a vendor you no longer use, a webhook handler with no idempotency. The hand pass and the automated scan are not substitutes; they cover different layers, and the manual triage is what catches the breach-grade mistakes.
Can the AI assistant audit its own code?
It can do parts of it, and it cannot do other parts. It is genuinely useful for the static checks: running grep across the working tree for known secret shapes, walking every API route and listing the ones with no auth middleware, listing every external package and flagging the ones that resolve to obscure or unverified registries. It is bad at the architectural checks because it does not have your customer data, your billing geography, or your real traffic shape, and it tends to vouch for code it wrote earlier in the session. The right division of labor: agent generates the inventory and the static report, human reads the inventory and runs the cross-user IDOR test, the OAuth scope walk, and the rate-limit threshold conversation. That same split shows up in every consulting engagement on this site.
What does it cost to have someone external run this audit?
On c0nsl the work fits the published $500 to $2,000 small-integration band for an SMB-sized app (one auth surface, one data store, a handful of integrations) and lands in a few days. If the stack also includes a Cloudflare Worker layer, multi-zone alignment, a Fastly or AWS WAF component, or a SOC-style alerting pipeline, the engagement moves into the $2,000 to $10,000+ custom-system tier. Either way, the rate and the deliverable are on the page; there is no rate-card mystery and no follow-up sales call before you see a number. The first conversation is the published $75 consult, and the only reason to start there is to confirm whether your stack actually fits the kind of audit this checklist describes.
What if I am pre-launch and worried I have something nobody has noticed yet?
Run pass 1 yourself in 60 minutes tonight. If any of the four checks come back red (committed key, unauthenticated write, IDOR, plaintext password), pause the launch and fix those before you do anything else. If pass 1 comes back clean, run pass 2 over the weekend; the four trust-boundary items (CSRF, rate limit, RLS, AI-vendor OAuth scopes) are the next class of bug that hits real users. If you finish pass 2 clean, you are in the cohort that can launch with a straight face. Pass 3 can run in the week after launch without putting you in danger. If you find something in pass 1 or pass 2 that you do not understand the fix for, the published $75 consult on the homepage is the cheapest way to get a second pair of eyes on it.