Synthetic example · no client data
Cross-tenant user update through missing ownership validation.
This page demonstrates the structure and level of evidence used in a client finding. The system, identities and endpoint below are fictional.
Executive impact
A user from one tenant can modify another tenant’s account.
The API trusts a user identifier supplied in the request path without verifying that the target user belongs to the authenticated customer. An attacker with an ordinary account can therefore modify another organization’s user record if a valid identifier is known.
Reproduction
Minimal proof of exploitability.
- Authenticate as a normal user in Tenant A.
- Obtain the identifier of a test user belonging to Tenant B.
- Send an update request while keeping Tenant A’s valid session.
- Observe that the API accepts the update and changes Tenant B’s record.
PUT /api/users/usr_tenant_b_1042
Authorization: Bearer <tenant-a-token>
Content-Type: application/json
{"display_name":"Cross-tenant proof"}
HTTP/1.1 200 OKThe successful response and subsequent read-back confirm that authorization is enforced at authentication level but not at tenant ownership level.
Root cause
Authorization checks identity, but not ownership.
The handler retrieves the target user directly by identifier and permits the operation after validating only that the requester is authenticated. The authorization layer does not compare the target record’s tenant identifier with the requester’s tenant.
Remediation
Bind authorization to the tenant context.
Resolve mutable user records through the authenticated tenant context rather than a global identifier lookup. Enforce the tenant relationship server-side for every read and write path, return a non-distinguishing error for out-of-scope identifiers, and add regression tests covering cross-tenant object access.
Retest criteria
What I would verify after the fix.
Repeat the original cross-tenant request with multiple roles and object identifiers, confirm that out-of-tenant operations fail consistently, test adjacent endpoints for the same authorization primitive, and verify that legitimate same-tenant workflows remain functional.