We Scanned Ourselves: What 87 Findings Taught Us About Our Own Compliance Posture
We pointed our own scanner at our own codebase. 87 findings, 48 true positives, 8 compliance controls affected. Real scan data, not a demo.
The Numbers
npx @cveriskpilot/scan --preset startup
Duration: 27.9 seconds. No API key. No account. Fully offline.
| What was scanned | Count |
|---|---|
| Dependencies (npm) | 897 |
| Files checked for secrets | 1,001 |
| IaC files (Terraform, Dockerfile, K8s) | 22 files, 29 rules |
| API routes analyzed | 129 |
| Total findings | 87 |
Severity Distribution
| Severity | Count |
|---|---|
| CRITICAL | 10 |
| HIGH | 47 |
| MEDIUM | 26 |
| LOW | 4 |
87 findings sounds like a lot. But not all findings are equal — and that's where auto-triage matters.
Auto-Triage: Separating Signal from Noise
The verdict engine automatically classified every finding:
| Verdict | Count | % | What it means |
|---|---|---|---|
| TRUE_POSITIVE | 48 | 55% | Real issues that need fixes |
| FALSE_POSITIVE | 26 | 30% | Test files, .gitignored secrets, variable interpolation |
| NEEDS_REVIEW | 13 | 15% | Intentional design choices (e.g., public API with no auth by design) |
That's 30% noise reduction before anyone opens a ticket.
What the Scanners Found
API Security (47 findings)
The API route scanner was the most productive. It found 45 routes with missing authorization checks on mutation endpoints. In a Next.js App Router codebase with 129 routes, that's significant.
These weren't obscure edge cases. They were POST/PUT/DELETE handlers that called requireAuth() but skipped RBAC checks — meaning any authenticated user could call admin endpoints.
Secrets (37 findings)
The secrets scanner found Stripe keys, Anthropic API keys, and database connection strings. All were in .env.local — properly .gitignored, never committed. The verdict engine classified these correctly:
.env without .gitignore coverage${process.env.API_KEY}), and .gitignored filesDependencies (3 findings)
Only 3 dependency vulnerabilities across 897 npm packages. All were transitive dependencies with known CVEs and available patches.
IaC (0 findings)
22 Terraform files. 29 rules checked. Zero failures. Our infrastructure-as-code is clean.
Compliance Impact
The scanner mapped all findings to 8 compliance controls across our selected frameworks (startup preset = SOC 2 + OWASP ASVS):
SOC 2 Type II — 4 Controls Affected
| Control | Title | Triggered By |
|---|---|---|
| CC6.1 | Logical and Physical Access Controls | CWE-862, CWE-798, CWE-200 |
| CC8.1 | Change Management | CWE-798 |
| CC7.2 | Incident and Change Management | CWE-200 |
| CC6.8 | Vulnerability Management | CWE-400 |
OWASP ASVS 4.0 — 4 Controls Affected
| Control | Title | Triggered By |
|---|---|---|
| V1.2 | Authentication Architecture | CWE-862, CWE-798, CWE-200 |
| V14.2 | Dependency Security | CWE-798 |
| V1.1 | Secure Software Development Lifecycle | CWE-798 |
| V9.1 | Client Communication Security | CWE-522 |
What We Did About It
Based on this scan, we fixed everything in a single session:
withRole() and withPermission() guards on every mutation endpointThe scan-to-fix cycle took one session. The same work — manually mapping 87 findings to compliance controls using spreadsheets — would have taken 40+ hours.
What This Proves
Run It On Your Code
# Same scan we ran
npx @cveriskpilot/scan --preset startup
npx @cveriskpilot/scan --preset defense
npx @cveriskpilot/scan --preset all
npx @cveriskpilot/scan --preset startup --format json
Free. Offline. No account. No API key.
If a vulnerability management platform can find 87 issues in its own code, imagine what it'll find in yours.
CVERiskPilot is 100% Veteran Owned, built in Texas.
Tags: DevSecOps, Dogfooding, Security Scanning, Compliance, SOC 2, OWASP ASVS, RBAC, Vulnerability Management, Open Source
Ready to close the compliance gap?
Run your first compliance scan in 90 seconds. No account needed.
npx @cveriskpilot/scan@latest --preset startup
