/

CVE-2026-55382

Severity:

HIGH RISK

(7.6)

Broken Object Level Authorization (CWE-639) in InvoiceShelf

CVE-2026-55382

Deferred

Vulnerability type

Category:

Broken Object Level Authorization

CWE:

CWE-639

Impact:

Cross-Tenant Unauthorized Access and Modification

Severity:

HIGH RISK

(7.6)

CVSS version:

3.1

Catch this CVE while code is being written

Detect vulnerable code directly in pull requests, so CVEs are fixed before merge.

Summary

InvoiceShelf contains an authorization flaw in note management endpoints that can allow an authenticated staff user to access reusable note templates owned by another company. An attacker with ordinary note permissions may read, modify, or delete cross-company notes by selecting another tenant's note identifier.

InvoiceShelf contains an authorization flaw in note management endpoints that can allow an authenticated staff user to access reusable note templates owned by another company. An attacker with ordinary note permissions may read, modify, or delete cross-company notes by selecting another tenant's note identifier.

Affected context

The issue occurs in InvoiceShelf note endpoints when route-bound Note objects are authorized only against generic note abilities rather than the specific target record. It is most relevant in multi-company deployments where note identifiers are sequential or discoverable and the Note model does not apply a global company boundary.

The issue occurs in InvoiceShelf note endpoints when route-bound Note objects are authorized only against generic note abilities rather than the specific target record. It is most relevant in multi-company deployments where note identifiers are sequential or discoverable and the Note model does not apply a global company boundary.

Exploit preconditions

  • Attack surface: Authenticated web application note-management endpoints
  • Required access: A staff account with ordinary note viewing or management permissions
  • Trigger point: Supplying or selecting a note identifier belonging to another company
  • Why exploitation is possible: Authorization checks evaluate generic abilities without verifying the target note's company ownership
  • Attack surface: Authenticated web application note-management endpoints
  • Required access: A staff account with ordinary note viewing or management permissions
  • Trigger point: Supplying or selecting a note identifier belonging to another company
  • Why exploitation is possible: Authorization checks evaluate generic abilities without verifying the target note's company ownership

Why this happens

The vulnerable endpoints authorize actions using generic abilities such as viewing or managing notes without passing the route-bound Note object to the corresponding policy methods. As a result, the policy cannot compare the requested record's company_id with the authenticated user's permitted company context. This is a broken object-level authorization pattern mapped to CWE-639, where access to a specific object is not adequately constrained even though the user is authenticated and has a related general permission.

The vulnerable endpoints authorize actions using generic abilities such as viewing or managing notes without passing the route-bound Note object to the corresponding policy methods. As a result, the policy cannot compare the requested record's company_id with the authenticated user's permitted company context. This is a broken object-level authorization pattern mapped to CWE-639, where access to a specific object is not adequately constrained even though the user is authenticated and has a related general permission.

Potential impact

  • An attacker may read reusable invoice, estimate, and payment note templates from another company.
  • An attacker could modify cross-company note content or introduce misleading template text.
  • An attacker could delete notes relied on by another company's invoicing workflows.
  • The issue may expose tenant data and weaken isolation between companies.
  • An attacker may read reusable invoice, estimate, and payment note templates from another company.
  • An attacker could modify cross-company note content or introduce misleading template text.
  • An attacker could delete notes relied on by another company's invoicing workflows.
  • The issue may expose tenant data and weaken isolation between companies.

General mitigation guidance

Mitigation generally focuses on enforcing authorization against the specific

object and tenant context at every endpoint.

Common defensive patterns include:

  • Pass the resolved Note object to policy checks rather than relying only on generic abilities.
  • Verify company ownership or an equivalent tenant boundary before allowing reads, updates, or deletion.
  • Apply consistent tenant scoping in model queries, repositories, and route model binding.
  • Prefer deny-by-default authorization for records outside the user's active company context.
  • Avoid relying on sequential identifiers as a security boundary; use opaque references where appropriate.
  • Preserve least-privilege permissions for staff roles and log cross-tenant authorization failures.

Mitigation generally focuses on enforcing authorization against the specific

object and tenant context at every endpoint.

Common defensive patterns include:

  • Pass the resolved Note object to policy checks rather than relying only on generic abilities.
  • Verify company ownership or an equivalent tenant boundary before allowing reads, updates, or deletion.
  • Apply consistent tenant scoping in model queries, repositories, and route model binding.
  • Prefer deny-by-default authorization for records outside the user's active company context.
  • Avoid relying on sequential identifiers as a security boundary; use opaque references where appropriate.
  • Preserve least-privilege permissions for staff roles and log cross-tenant authorization failures.

How teams detect issues like this

Organizations commonly detect this class of issue through:

  • Static analysis and code review checks for policy calls that omit the target object.
  • Review of controller actions that accept route-bound records without explicit tenant filtering.
  • Authorization tests using two companies and equivalent users to verify isolation for read, update, and delete operations.
  • Dynamic testing that attempts access to valid object identifiers from a different tenant.
  • Policy enforcement requiring object-level authorization and tenant predicates on multi-tenant resources.

Automated application-security and code-review tools may help identify missing ownership checks, but should be supplemented with tenant-isolation tests.

Organizations commonly detect this class of issue through:

  • Static analysis and code review checks for policy calls that omit the target object.
  • Review of controller actions that accept route-bound records without explicit tenant filtering.
  • Authorization tests using two companies and equivalent users to verify isolation for read, update, and delete operations.
  • Dynamic testing that attempts access to valid object identifiers from a different tenant.
  • Policy enforcement requiring object-level authorization and tenant predicates on multi-tenant resources.

Automated application-security and code-review tools may help identify missing ownership checks, but should be supplemented with tenant-isolation tests.

Sources

SourceLink
github.comgithub.com/InvoiceShelf/InvoiceShelf/commit/e432e4e62f5aa52238e3ff3fc37a0c78588eec47
github.comgithub.com/InvoiceShelf/InvoiceShelf/pull/661
github.comgithub.com/InvoiceShelf/InvoiceShelf/releases/tag/2.4.0
github.comgithub.com/InvoiceShelf/InvoiceShelf/security/advisories/GHSA-85wc-38p4-2wqq

Frequently asked

questions

It can be exploitable through the application's authenticated web interface when

a user can submit or select another company's note identifier. It does not

generally require access to the server or database.

The attacker needs an authenticated staff account with ordinary note viewing or

management permissions. Administrative privileges are not necessarily required.

Authorize every operation against the specific Note object and verify that its

company ownership matches the user's authorized tenant context before reading,

updating, or deleting it.

Combine object-level policy checks, tenant-scoped queries, deny-by-default

permissions, and automated cross-tenant authorization tests for every

multi-tenant resource endpoint.

It can be exploitable through the application's authenticated web interface when

a user can submit or select another company's note identifier. It does not

generally require access to the server or database.

The attacker needs an authenticated staff account with ordinary note viewing or

management permissions. Administrative privileges are not necessarily required.

Authorize every operation against the specific Note object and verify that its

company ownership matches the user's authorized tenant context before reading,

updating, or deleting it.

Combine object-level policy checks, tenant-scoped queries, deny-by-default

permissions, and automated cross-tenant authorization tests for every

multi-tenant resource endpoint.

Find out what's already
exploitable in your codebase.