A Client Vibe-Coded Four Production Apps. We Ran a 30-Point Security Check on What They Built.

AI-generated code ships fast. But fast doesn't mean secure. Here's what we found when we looked under the hood.

DATA & SECURITY10 min read

A client came to us after vibe-coding four production applications with AI. The apps worked. Users were onboarded. Revenue was flowing. But the founder had a nagging question: "We built all of this with AI code generation. How do we know it's actually secure?"

Good question. So we built a structured 30-point security posture checklist and ran it across all four systems. Not a penetration test. Not a compliance checkbox exercise. Something more practical: a systematic evaluation of the security fundamentals that AI-generated code often gets wrong.

The results were exactly what you'd expect from code that shipped fast and never got a security review.

30
Security Checks
61
Passed
16
Partial
14
Failed

Out of 120 total evaluations, 14 were outright failures, 16 were partial implementations, and 61 were clean passes. The rest didn't apply to a given system. The failures weren't in obscure edge cases. They were in fundamentals: credential rotation, database access controls, rate limiting, and backup verification.

Why a Posture Check, Not a Pentest

Penetration testing tells you what an attacker can exploit right now. Valuable, but expensive, slow, and a snapshot in time. A security posture check asks a different question: are the foundations solid? It's the difference between testing whether someone can break into your house and checking whether you remembered to install locks on all the doors.

We designed our checklist around eight categories that collectively cover the full attack surface of a modern web application:

Authentication & Authorization6 checks
Secrets Management3 checks
Dependency Security3 checks
Data Protection5 checks
Network Security3 checks
Operations6 checks
Testing & Monitoring3 checks
Compliance1 check

Each check is rated by severity: critical, high, medium, or low. Every system gets a verdict for each point: pass, partial, fail, or not applicable. No ambiguity.

"Most security breaches don't exploit sophisticated zero-days. They walk through doors that were never locked in the first place."

What We Found: The Uncomfortable Patterns

The failures weren't random. They clustered around a handful of themes that, frankly, most teams will recognize in their own infrastructure.

Database Access Controls Were Swiss Cheese

The client's customer-facing applications had proper Row-Level Security configured. But when we looked at internal systems, tooling databases, and infrastructure services, the story was different. The vast majority of tables had no access controls at all. Any authenticated connection with the right credentials could read or modify any row in any table. The assumption had been "it's internal, so it's fine." That assumption is one compromised service account away from being very wrong.

Credential Rotation Was Almost Nonexistent

The client had a credential management system. They tracked over a hundred secrets centrally. But when we checked rotation dates, fewer than 10% had ever been rotated. Some API tokens were configured to expire in a decade. The infrastructure for rotation existed, but nobody was enforcing it. This is the security equivalent of having a smoke detector with dead batteries. The system is there, but it's not protecting anything.

Internal APIs Had Zero Rate Limiting

The client's customer-facing applications had rate limiting configured properly. Internal APIs had none. The reasoning was always the same: "it's behind a firewall." But that reasoning breaks the moment a misconfigured service enters a retry loop and hammers an endpoint thousands of times per minute. Or when a single compromised internal service can exfiltrate data as fast as the network allows.

Backups Existed. Nobody Had Tested Restoring From Them.

Daily database dumps. Volume snapshots. Offsite replication. Multiple layers of backup infrastructure in place. But when we looked for documentation of a successful restore test, there was none. No one had actually tried recovering from a backup in a controlled scenario. Until you've restored and verified the data, you don't have a backup. You have a hope.

The Good News

Strong Fundamentals Where It Counted Most

The checklist wasn't all bad news. Several areas showed consistent strength across all four systems:

  • No hand-rolled authentication anywhere. Every system used battle-tested auth providers. This single decision eliminates entire classes of vulnerabilities.
  • No secrets in source control. Proper .gitignore from day one on every project. No API keys in git history.
  • Parameterized queries across all application code. No SQL injection vectors found. This is table stakes, but it's alarming how many production applications still get it wrong.
  • DDoS protection at the edge on all public-facing services. Not just configured, but verified active.
  • Server-side permission enforcement in every customer-facing application. No client-only auth gates.

How We Did It: AI Agents as Security Evaluators

Here's the part that surprised us. We didn't run this checklist manually. We assigned it to our AI agents, each evaluating a different system. Each agent reviewed the actual codebase, checked real configuration files, queried live database schemas, and produced findings with specific evidence.

The agent that flagged the database access control gaps did so by querying the database for which tables had Row-Level Security enabled. Not by reading documentation that claimed everything was locked down. The agent that found the credential rotation debt did so by checking actual rotation timestamps, not by trusting a policy document that said "we rotate every 90 days."

"Documentation says what should be true. Code says what is true. A good security evaluation verifies the code, not the docs."

This isn't a replacement for professional security auditing. But as a recurring hygiene practice, AI-assisted security evaluation catches the kind of drift that accumulates between formal audits. Configuration changes, new endpoints without rate limits, dependencies that age past their CVE window. The kind of slow erosion that nobody notices until something breaks.

The Remediation Playbook

After running the evaluation, we prioritized remediation by severity and effort. Critical failures that were easy to fix went first. A ten-minute configuration change that closes a critical gap beats a week-long refactor every time.

  1. Default-deny database access. Enable Row-Level Security on every table, including internal ones. Write explicit policies for each access pattern. This is the highest-impact single change.
  2. Enforce credential rotation. Automated alerts when any credential passes 90 days without rotation. Make it impossible to ignore.
  3. Rate limit internal APIs. The cost of adding rate limiting is negligible. The cost of not having it is unpredictable.
  4. Test backup restoration quarterly. Schedule it. Document it. Time it. If recovery takes longer than your tolerance, that's a problem to solve now, not during an incident.

Within days of delivering the report, the client's teams had already moved from 17 failures to 14, and from 56 passes to 61. Dependency vulnerabilities were patched. Unprotected endpoints got auth middleware. Dead webhook endpoints were removed. The improvements came fast because the findings were specific enough to act on immediately.

Why This Matters for Your Business

Security posture isn't a binary. You're not "secure" or "insecure." You have a score across a spectrum of controls, and that score changes every time you ship code, add a dependency, or create a new API key. Most organizations have no idea what their score is. They assume it's fine because nothing has gone wrong yet.

A structured posture check takes the vague anxiety of "are we secure?" and turns it into specific, prioritized findings. It's the difference between hoping your infrastructure is sound and knowing where it's strong, where it's weak, and what to fix first.

We now recommend running this checklist quarterly. The first run is always the most revealing. After that, it becomes a maintenance practice that keeps drift from becoming a crisis.

"The first time you run a real security evaluation on your own systems, you find things you wish you'd caught months ago. The second time, you're just keeping score."

Want to Know Your Security Posture Score?

We'll run our 30-point evaluation against your infrastructure and deliver a prioritized remediation plan. Same checklist. Same rigor. No assumptions.

Schedule a Security Review