The Hidden Cost of Broken Access Control in SaaS Startups
Broken access control has been the #1 vulnerability category on the OWASP Top 10 since 2021. It's also the most underestimated risk in SaaS startups — not because founders don't care about security, but because access control failures are invisible until they're catastrophic.
Unlike an XSS bug that pops an alert box or a SQL injection that returns a database error, a broken access control vulnerability silently serves data to anyone who asks for it. The application looks like it's working correctly. The dashboard looks clean. The users aren't complaining. And behind the scenes, every customer's data is accessible to every other customer.
What Broken Access Control Actually Looks Like
In the context of a SaaS application, broken access control means that the application doesn't properly verify whether a user is authorized to perform a given action or access a given resource. The most common patterns we see:
Insecure Direct Object References (IDOR)
Your API endpoint is /api/invoices/123. A user requests their own invoice: /api/invoices/123. Then they change the number: /api/invoices/124. And they get someone else's invoice. The API didn't check whether the requesting user owns that invoice — it just served whatever ID was requested.
This is the most common access control vulnerability in SaaS applications, and it's trivially exploitable. An attacker can iterate through every ID in sequence and download every object in your database. If the IDs are sequential integers, they can automate this in seconds.
Horizontal Privilege Escalation
A multi-tenant SaaS application where Company A's employees can access Company B's data. This usually happens when the API filters results based on user identity but doesn't enforce tenant boundaries. The query returns data for the correct user — but that user was never supposed to see data from other tenants.
We've found this in applications that process millions of dollars in transactions. The fix is often a single WHERE clause, but the business impact of the vulnerability is existential.
Vertical Privilege Escalation
A regular user gains admin-level access. This might happen through:
- Modifying a role field in user metadata (common in Supabase apps)
- Accessing admin API endpoints that don't check the user's role
- Manipulating client-side state that the server trusts without verification
The most insidious version: the frontend correctly shows different UI for different roles, creating the appearance of security. But the underlying API accepts the same requests from everyone.
Function-Level Authorization Missing
The application has an endpoint for deleting users: DELETE /api/users/456. This endpoint exists because admins need it. But it doesn't verify that the caller is an admin. Any authenticated user can delete any other user. We see this repeatedly in applications that were built feature-first and had authorization added as an afterthought — or not added at all.
The Real Cost
Broken access control doesn't just create security risk. It creates business risk.
Customer Data Exposure
If one customer can access another customer's data, you have a data breach — even if no malicious actor has exploited it yet. Under GDPR, CCPA, and similar regulations, this is a reportable incident. The notification requirements alone can cost hundreds of thousands of dollars in legal fees, and the reputational damage can be fatal for a startup.
Compliance Failure
SOC 2, HIPAA, PCI-DSS, and ISO 27001 all require proper access control. If your application has systemic access control failures, you can't pass these audits. For B2B SaaS companies, this means you can't sell to enterprise customers — the fastest path to scaling revenue is blocked by a vulnerability category that should have been addressed from day one.
Silent Data Corruption
When users can modify resources they shouldn't have access to, the resulting data corruption is almost impossible to trace. Was that record modified by the owner or by an unauthorized user? Without access control, there's no way to know. The audit trail doesn't distinguish between authorized and unauthorized operations because the system itself doesn't make that distinction.
Erosion of Trust
Once an access control vulnerability is publicly disclosed — through a security researcher's report, a customer's discovery, or a breach — the trust impact compounds. Customers don't just worry about the specific vulnerability. They question whether your entire security posture is adequate. For a SaaS startup, this can trigger churn at the worst possible time.
Why It Keeps Happening
Broken access control persists because of how applications get built:
Speed over safety. Startups optimize for shipping features. Access control is a cross-cutting concern that affects every endpoint, every query, and every data access pattern. It's the kind of work that doesn't produce visible features, so it gets deferred.
Framework gaps. Most web frameworks don't enforce authorization by default. They provide authentication (who are you?) but leave authorization (what can you do?) to the developer. If the developer doesn't explicitly implement access control on every endpoint, it doesn't exist.
Testing blind spots. Developers test the happy path: "Can the user access their own data?" They rarely test the adversarial path: "Can the user access someone else's data?" Automated test suites almost never include access control test cases because they require understanding the intended authorization model.
Multi-tenancy complexity. Isolating data between tenants is harder than it looks. It requires consistent enforcement at the database level (RLS policies), the API level (middleware), and sometimes the application level (business logic). A single missed enforcement point breaks the entire model.
How to Fix It
Defense in Depth
Don't rely on a single layer. Implement access control at multiple levels:
Database level: Row Level Security policies that enforce tenant isolation and ownership at the query level. Even if the API has a bug, the database won't return unauthorized data.
API level: Middleware that verifies the requesting user's role and permissions before the request reaches the handler. Every endpoint should explicitly declare its authorization requirements.
Application level: Business logic checks for complex authorization rules — "only the employer who posted this job can approve applications for it."
Default Deny
Every endpoint should deny access by default. Authorization should be an explicit grant, not an explicit restriction. If a new endpoint is created without authorization logic, it should be inaccessible — not open to everyone.
Test Adversarially
Include access control testing in your CI pipeline. For every API endpoint:
- Can User A access User B's resources?
- Can a regular user access admin endpoints?
- Can a user from Tenant A see Tenant B's data?
- Can a user modify resources they should only be able to read?
These tests should run on every deployment, not quarterly.
Monitor and Alert
Log all access control decisions. Alert on anomalies: a user accessing an unusual number of resources, a user accessing resources across tenant boundaries, API endpoints receiving requests without proper authorization headers.
The Startup Opportunity
For SaaS startups, getting access control right early is a competitive advantage. Enterprise customers ask about security posture before signing contracts. SOC 2 compliance unlocks deal sizes that can transform a startup's trajectory. And the cost of implementing proper access control from the start is a fraction of retrofitting it after a breach.
The most successful SaaS companies we work with treat access control as a first-class architectural concern — not a security checkbox. It's part of the data model design, the API design, and the deployment verification process.
Broken access control is the #1 web application vulnerability for a reason. It's also the most fixable, if you test for it.