Study ยท April 2026 ยท n=50

Vibe coding is productive.
Secure, it rarely is.

We scanned 50 real AI-generated open-source projects with our security engine. The result is sobering, and measurable.

50 GitHub repos Cursor, Windsurf, Claude projects TypeScript, Python, JavaScript Vouch engine (Semgrep + AI Hunter + AI Validator)
34
Avg. Vouch Security Score
out of 100
88%
of apps have at least one
HIGH-severity vulnerability
52%
of apps have at least one
CRITICAL finding
36%
of apps contain secrets,
API keys, or passwords
486
false positives detected
and removed with reasoning

AI writes the code.
Who reviews it?

Vibe coding has dropped the barrier to app development to zero. With Cursor, Windsurf, or Claude, applications that used to take weeks now ship in hours. That is the good news.

The bad news: AI models write working code, but not secure code. They systematically skip rate limiting on API endpoints, they leave out authentication checks, they do not harden inputs. Not because they cannot. Because nobody asked them to.

We wanted to know how bad it really is. So we scanned 50 real repos, projects built with AI coding tools, identified by marker files like .cursorrules and CLAUDE.md. With our own production engine, not a simplified test tool.

"88 percent of the scanned vibe-coded apps have at least one HIGH-severity vulnerability. Most developers do not know."

Repo selection

We selected public GitHub repositories with provable AI-coding-tool origin, recognized by config files such as .cursorrules, CLAUDE.md, or .replit. Languages: TypeScript (64%), Python (16%), JavaScript (14%), HTML (6%). All scans were performed in April 2026.

Key findings

What our engine found across 50 repos, after AI-validation of every single finding.

๐Ÿ”‘

Secrets and credentials in source 18 of 50 repos (36%)

More than a third of the scanned projects contained API keys, passwords, JWT secrets, or other credentials directly in source, often in config files or comments. AI assistants frequently inline secrets while generating code because it is convenient for the demo context. Nobody cleans up afterwards.

๐Ÿ’ฅ

CRITICAL vulnerabilities 26 of 50 repos (52%)

More than every second app contains at least one directly exploitable vulnerability. Among them: SQL injections without parameterized queries, command injection via unsanitized user input, and missing authentication on admin routes. These are not theoretical, they are in real, running projects.

โšก

Missing protection mechanisms 44 of 50 repos (88%)

Almost 9 in 10 projects have at least one HIGH-severity vulnerability, often not bad code but missing code. AI produces functional endpoints but systematically forgets rate limiting, CSRF protection, and input validation. Static scanners like Semgrep do not find these gaps because there is nothing to "see". Our AI Hunter analysis does.

๐Ÿ“Š

Injection attacks lead the categories 200 confirmed findings

SQL injection, command injection, and related patterns are the largest category with 200 confirmed findings, followed by path traversal (87 findings) and auth gaps (39 findings). AI-generated code mixes database access with user input without the separation experienced developers wire in by instinct.

๐ŸŽฏ

Bimodal score distribution 23 below 30 ยท 4 above 90

Vibe coding does not produce mediocre-security apps. It produces either very insecure or surprisingly good ones. 46% of repos scored below 30, while 8% scored above 90. The takeaway: security in vibe-coded apps is not a coincidence, it is an active decision.

Data in detail

All 50 repos, all findings, broken down by score, severity, and category.

Score distribution (n=50)

Repos with security issues

Vulnerability categories (601 confirmed findings)

AI Validator: reviewed, removed, confirmed

Score distribution

The Vouch Security Score runs from 0 (critically insecure) to 100 (no confirmed findings).

0โ€“30
23 repos
31โ€“50
11 repos
51โ€“70
8 repos
71โ€“90
4 repos
91โ€“100
4 repos

Top vulnerability categories

Confirmed findings by type, sorted by frequency.

  • Injection
    200
  • Path traversal
    87
  • Auth gaps
    39
  • Secrets
    38
  • XSS
    18
  • CSRF
    7

486 findings removed, with reasoning.

What other scanners report, we verify. Every single finding.

1,087
findings individually reviewed
by the AI Validator
486
recognized as false positives,
each removed with reasoning
601
confirmed real issues
reported to the developer
45%
of reviewed findings were
false positives, correctly removed

Traditional scanners flood developers with warnings. Our AI Validator reads the actual code context of every finding and decides whether the problem is real, or explains why it is not. Out of 1,087 reviewed findings, 486 (45 percent) were recognized as false positives and removed with reasoning. What remains is 601 real issues, no noise, no alert fatigue.

Examples: how the validator explains its decisions

FALSE POSITIVE Path traversal via path.join โ€” "The dir parameter comes from a hardcoded array dirsToCopy, not user input. Path traversal is not possible in this context."
FALSE POSITIVE Hardcoded secret (JWT) โ€” "The JWT belongs to an example file (COPY_TO_ENV_LOCAL.txt) for the initial setup walkthrough and contains the placeholder 'example_anon_key'. Not a real secret."
FALSE POSITIVE SQL injection โ€” "The mysql2 library is called with separate query and values arguments. This is parameterized querying and correctly prevents SQL injection."
FALSE POSITIVE Command injection via spawn โ€” "The spawn call uses shell: true, but the command and arguments (npm run dev:react) are hardcoded, not user-controlled."
FALSE POSITIVE HTTP instead of HTTPS โ€” "The HTTP connection goes to 127.0.0.1 (loopback). Traffic never leaves the machine, so there is no eavesdropping risk on the network."

This transparency is not a side effect, it is the core. Developers see not just what was found, but why it is a problem. And they see what was filtered out, and why it was not.

Methodology

The same pipeline that runs in production Vouch, not a simplified test tool.

1

Static analysis

Semgrep with a security ruleset, npm audit, pip-audit, and gitleaks for secret detection. Covers known patterns and CVEs.

2

AI Hunter

Gemini analyses security-relevant files and finds what Semgrep cannot see: missing rate limits, missing auth, insecure configurations.

3

AI Validator

Every finding is re-evaluated by an LLM with the surrounding code context. False positives are removed with an individual explanation.

4

Scoring

The Vouch Security Score (0โ€“100) is computed from the validated issues, weighted by severity and exploitability.

Reproducibility and transparency

The scan code is open and can be run on any repo. The 50 scanned repos are all public on GitHub. Raw data and the complete findings.json are available on request. We deliberately did not pick repos we knew, the selection was automatic based on marker files via the GitHub API.

What this means for vibe coders

Three takeaways everyone working with AI coding tools should know.

๐Ÿค–

AI forgets security concepts

AI models optimise for working, readable code. Security mechanisms such as rate limiting, CSRF protection, or input sanitization do not appear automatically, they have to be explicitly asked for, or verified after the fact.

๐Ÿ”

Static scanners are not enough

A significant share of the issues found here, missing auth, missing rate limits, logic flaws, would be invisible to plain Semgrep. These gaps are not "bad code" a regex can catch. They are structural absences.

โœ…

Security in vibe apps is possible

8 percent of scanned repos scored over 90 on a comparable codebase. The difference: developers who actively integrate security into their prompt workflow, or who run automated checks, produce noticeably safer apps.

How safe is your app?

Vouch scans your repo with the same engine that ran this study, in under 5 minutes.

Scan your repo for free