MANUAL SECURITY AUDITS

Supabase security audit

Supabase security audit

Supabase security audit

Secure your Supabase application before launch

Manual Security Audits for AI Built Apps

Built with Cursor, Claude Code, Lovable, Bolt, Windsurf, or Next.js? We'll manually test your application before attackers do

Built with Cursor, Claude Code, Lovable, Bolt, Windsurf, or Next.js? We'll manually test your application before attackers do

Built with Cursor, Claude Code, Lovable, Bolt, Windsurf, or Next.js? We'll manually test your application before attackers do

Human led testing

Human led testing

Clear remediation guidance

Clear remediation guidance

Reports delivered in days

Reports delivered in days

Human led testing

Clear remediation guidance

Reports delivered in days

Terminal-style security scan output showing critical and high severity findings including an exposed API key and disabled Row Level Security, from a HollowByte audit
Terminal-style security scan output showing critical and high severity findings including an exposed API key and disabled Row Level Security, from a HollowByte audit
hollowbyte — audit scan
scanning https://client-app.io · launch audit
— secrets & credentials
CRITICAL Exposed API key in client-side bundle
→ /dist/assets/index-8f2e1b.js:1 · sk-proj-••••••••
HIGH Supabase service role key in frontend config
→ /src/lib/supabase.js:4
PASS Git history — no committed secrets found
— access control & authentication
CRITICAL IDOR vulnerability — /api/users/:id returns any user's data
→ unauthenticated access confirmed on 3 endpoints
HIGH RLS disabled on users, orders, payments tables
→ Supabase · anon key can query all rows
MEDIUM JWT validated client-side only — server accepts unsigned tokens
→ /api/auth/verify
MEDIUM No rate limiting on login endpoint
→ /api/auth/login · brute force possible
LOW Missing security headers — CSP, HSTS, X-Frame-Options
→ securityheaders.com score: F
scan complete · 6 findings · report ready
2 critical 2 high 2 medium 1 low

Used before launce by SaaS founders

Used before launce by SaaS founders

Manual testing by security experts

Manual testing by security experts

No automated PDF reports

No automated PDF reports

Reports you can actually fix

Reports you can actually fix

AI writes code.
Attackers don't care who wrote it.

AI writes code.
Attackers don't care who wrote it.

AI writes code.
Attackers don't care who wrote it.

Authentication

Broken JWT validation

Broken JWT validation

Session issues

Session issues

OAuth mistakes

OAuth mistakes

Missing MFA enforcement

Missing MFA enforcement

Authorizaton

IDOR

IDOR

Privilege escalation

Privilege escalation

Missing ownership checks

Missing ownership checks

Exposed admin roles

Exposed admin roles

AI Specific Mistakes

Over-permissive Supabase policies

Over-permissive Supabase policies

Exposed secrets

Exposed secrets

Generated insecure middleware

Generated insecure middleware

Prompt injection surfaces

Prompt injection surfaces

Why scanners aren't enough

Why scanners aren't enough

Why scanners aren't enough

Automated scanners find known patterns.

They don't understand your application.

Automated scanners find known patterns.

They don't understand your application.

Automated scanners find known patterns.

They don't understand your application.

$ zap-cli quick-scan https://yourapp.com
No alerts found.
$ hollowbyte manual audit
CRITICAL Broken access control
HIGH JWT none algorithm
MEDIUM Rate limiting bypass
LOW Security headers

We manually test:

Authentication flows

Authentication flows

Business logic

Business logic

Multi-step attack chains

Multi-step attack chains

Access controls

Access controls

AI generated code

AI generated code

API abuse

API abuse

Built on industry-standard tools
GitLeaks
Snyk
OWASP ZAP
Burp Suite
Semgrep
GitLeaks
Snyk
OWASP ZAP
Burp Suite
Semgrep
Built on industry-standard tools
GitLeaks
Snyk
OWASP ZAP
Burp Suite
Semgrep
GitLeaks
Snyk
OWASP ZAP
Burp Suite
Semgrep

What we actually find

What we actually find

What we actually find

CRITICAL

CRITICAL

Anyone could access another customers invoices.

Anyone could access another customers invoices.

Anyone could access another customers invoices.

Cause:

Cause:

Missing authorization check.

Missing authorization check.

Fix:

Ownership validation

Fix:

Fix:

Ownership validation.

Ownership validation.

HIGH

JWT accepted unsigned tokens.

Impact:

Full account takeover.

Fix:

Enforce signature validation and reject "none" algorithm.

HIGH

Rate limit bypass.

Impact:

Credential stuffing and brute force risk.

Fix:

Apply consistent rate limits across all endpoints.

HIGH

Anyone could access another customers invoices.

Cause:

Missing authorization check.

Fix:

Ownership validation

HIGH

Anyone could access another customers invoices.

Cause:

Missing authorization check.

Fix:

Ownership validation

HIGH

JWT accepted unsigned tokens.

Impact:

Full account takeover.

Fix:

Enforce signature validation and reject "none" algorithm.

HIGH

Rate limiting bypass.

Impact:

Credential stuffing and brute force risk.

Fix:

Apply consistent rate limits across all endpoints.

From the last batch of apps we've audited, findings like these are consistently present, regardless of which AI tool built the app.

How we can help

How we can help

How we can help

Security Audit

Security Audit

Best before launch.

Manual security testing

Clear prioritized report

Fix guidance included

Starting around $300

Audit + Remediation

Audit + Remediation

Audit + Remediation

We'll help fix everything.

We'll help fix everything.

Everything in Security Audit

Everything in Security Audit

Code review & files

Code review & files

Verification & retest

Verification & retest

Starting around $900

Starting around $900

Security Audit

Best before launch.

Manual security testing

Clear prioritized report

Fix guidance included

Starting around $300

Ongoing partnership

Ongoing partnership

Ongoing partnership

Security review for every release.

Security review for every release.

Manual security testing

Manual security testing

Clear prioritized report

Clear prioritized report

Fix guidance included

Fix guidance included

Custom pricing

Custom pricing

Our process

Our process

Our process

-

-

Typical pricing

Typical pricing

Typical pricing

-

MVP / Solo Founder

MVP / Solo Founder

$300 +

$300 +

Perfect for MVPs and early stage startups

Growing SaaS

Growing SaaS

$900 +

$900 +

For established products with more surface area

Complex Applications

Complex Applications

Custom

Custom

Large apps, compliance needs, or ongoing engagements.

-

All prices in USD. Final scope may vary based on application complexity.

-

-

Why HollowByte?

Why HollowByte?

Why HollowByte?

Every engagement is personally performed.

Every engagement is personally performed.

Clear prioritized reports.

Clear prioritized reports.

No automated scanner dumps

No automated scanner dumps

Every vulnerability is manually verified.

Every vulnerability is manually verified.

Every finding includes remediation guidance.

Every finding includes remediation guidance.

We optimize for founders shipping quickly.

We optimize for founders shipping quickly.

Common questions

Common questions:

Why not just use automated scanners?

Scanners catch known patterns (such as SQL injection signatures, outdated libraries, missing headers, etc.). However, they don't understand what your app is supposed to do, so they often miss business logic flaws, broken access control, and multi-step attack chains, which is most of what actually gets exploited with AI generated code.

Why not just use automated scanners?

Do you test production?

Will you sign an NDA?

Can you help fix issues?

What if you find nothing?

Can you review AI-generated code?

Ready to know what's underneath?

Every day your app is live without a security review is a day of unknown risk.

HollowByte mascot — pixel art pirate with telescope and parrot
(function() { function applyMainRole() { var hero = document.getElementById('hero'); if (!hero) return false; var node = hero; while (node.parentElement && node.parentElement !== document.body) { node = node.parentElement; } if (node && node.parentElement === document.body) { node.setAttribute('role', 'main'); return true; } return false; } if (applyMainRole()) return; var attempts = 0; var interval = setInterval(function() { attempts++; if (applyMainRole() || attempts > 20) { clearInterval(interval); } }, 250); })();