Illustrative only - not an engagement finding
Signed-In Users Can Cross Customer Record Boundaries
Critical
See where this finding applies on the diagrams: application zone · upload and intake step · CP1 public ingress
Illustrative only - not an engagement finding
Signed-In Users Can Cross Customer Record Boundaries
- Business Summary
- Sign-in proves who a caller is, but it does not prove that the caller may read or change every customer record exposed by an API.
- Possible Weakness
- An API accepts a customer or record identifier and performs the requested operation without rechecking ownership, tenant membership or role at the object boundary.
- Potential Impact
- A valid user could read, change or delete another customer’s documents and personally identifiable information.
- What an Assessment Verifies
- Trace authorization from FastAPI routes through service functions to Cosmos DB queries, compare it with the approved role matrix and run safe cross-customer negative tests using made-up customer records.
- Expected Fix
- Enforce default-deny object and tenant authorization in server-side FastAPI code for every read, update, retry and deletion operation.
- How to Check the Fix
- A user assigned to one test customer must receive 403 for every operation on another customer’s records without learning whether the target record exists.
Cross-Reference Evidence (Illustrative). This is cross-reference evidence showing how route, service and negative-test evidence support one authorization conclusion. In a real engagement each item below is a live pointer: a file-and-line link into the source repository, a reproducible read-only query against the deployed Azure environment, or replayable tool output. Here they lead to newly authored public demonstrations.
-
Example source-code authorization permalink
This is cross-reference evidence. A real assessment links the reviewed commit and exact lines across the route, service and data boundary so another reader can follow the complete control path.
if actor.tenant_id != record.tenant_id: raise Forbidden() -
Example cross-customer negative-test output
This is cross-reference evidence. A real report retains the tool version, safe test case, expected result and output needed to reproduce the conclusion.
security-regression --case "<illustrative-case>" --format json Illustrative output: {"result":"blocked as expected"} -
Example API identity configuration record
This is cross-reference evidence. A real assessment records a dated read-only identity or configuration query and explains what that result does and does not prove.
az resource show --ids "<illustrative-resource-id>" \ --query "identity.type" Illustrative output: "SystemAssigned"