InvoiceShelf released a patch for CVE-2026-55610, a critical flaw that let any owner in one company hijack user accounts in another company. The vulnerability, rated 8.7 on the CVSS scale, came from a missing tenant-scope check in the app’s Laravel code.
How the Flaw Worked
InvoiceShelf is a SaaS tool built on Laravel that lets companies manage users, invoices and settings from a single dashboard. The platform reads a custom header to identify a tenant. When an Owner requests a user record, the code checks only, “Is the requester an Owner of their own company?”
It never verifies that the target user belongs to the same tenant. Laravel’s implicit route-model binding resolves the user ID to a row in the global users table, and the authorization policy approves the request based solely on the requester’s role.
An attacker could therefore:
- Supply any numeric user ID in the request URL.
- Receive the full user record, including email.
- Issue an update that overwrites the victim’s email, password and even reassigns the account to the attacker’s company as a super-admin.
In practice, a malicious Owner turned a company-management tool into a universal account-takeover weapon. No privileges beyond “Owner” were needed.
Who Is Affected
Every InvoiceShelf customer running a version before 2.4.1 was exposed. Because the flaw lives in the core request-handling path, any tenant could be targeted by any other tenant’s Owner, regardless of size or security posture. The impact includes loss of confidentiality (email addresses) and loss of integrity (unauthorized password changes, elevation to super-admin).
The Patch
Developers released version 2.4.1, adding an explicit tenant check before any read or write operation on a user record. The fix scopes the query to the active company identifier, forcing Laravel to return only rows that belong to the requester’s tenant.
What Developers Should Learn
- Never rely on global primary keys in multi-tenant applications.
- Apply a tenant filter to every database lookup, not just delete or create actions.
- Make authorization policies validate both the actor’s role and the target object’s tenancy.
- Treat implicit framework features like route-model binding as conveniences that can hide security gaps unless you add explicit scoping.
Looking Ahead
The incident shows a broader risk for any SaaS that shares tables. Security audits should review all endpoints that accept identifiers and confirm that tenant scoping is enforced uniformly.
Takeaway: a single missing tenant check can turn a privileged user role into a universal backdoor. Proper scoping is not optional; it is the foundation of data isolation in any multi-tenant system.
