Sample report

What a finding actually looks like.

Every verified finding is a case file: who acted, the rule that should have held, what actually happened, the control that proves it, and a trail your engineer can replay.

High Cross-workspace invoice access BOLA · broken object-level authorization

Summary

Identity
member · tenant-north
Expected rule
A member may only read invoices that belong to their own workspace.
Observed
The member read tenant-south’s invoice /api/invoices/4821.
Impact
Cross-tenant exposure of billing records: amounts, line items and billing contacts of another customer.

Request & response

The test request, sent as the tenant-north member, returns a record owned by tenant-south.

Request · as member/tenant-north
GET /api/invoices/4821 HTTP/1.1
Host: app.example.test
Authorization: Bearer [identity: member/north · masked]
Accept: application/json
Response
HTTP/1.1 200 OK
Content-Type: application/json

{ "id": 4821,
  "workspace": "tenant-south",
  "total": [redacted], … }

Control test & reproduction

A control proves the boundary exists, and that the identity — not a missing check — is what crossed it. The result is then reproduced in a clean session before it is reported.

control → GET /api/invoices/4821 · no session
401 Unauthorized · boundary present
owner   → GET /api/invoices/4821 · as member/tenant-south
200 OK · owner marker matches
replay  → GET /api/invoices/4821 · as member/north, clean session
200 OK ✓ reproduced ×3

A 401, 429, 5xx or WAF response during reproduction keeps a candidate inconclusive. It is never promoted to a finding.

Evidence hash chain

Each exchange is appended to a hash-chained ledger, so any later change to the record is detectable.

01Test request & responsesha256:4f1c…9ab2
02Control (no session)sha256:a77e…01d4
03Clean-session reproductionsha256:c3b9…77fe

3 requests · append-only ledger · secrets masked before storage

Fix direction & mapping

Scope invoice lookups by the caller’s workspace on the server, not only by invoice ID. Return the same “not found” response for another tenant’s invoice as for a missing one. Add a regression test that requests a foreign-workspace invoice as a member.

OWASP API1:2023CWE-639PCI-DSS 6.5.8SOC 2 CC6.1

Retest

After the fix ships, the original attack re-runs unchanged — so a closed issue is verified, not assumed.

GET /api/invoices/4821 · as member/north
404 Not Found · boundary enforced

✓ Fixed · verified by retest

Coverage notes

Reports state what was not proven as clearly as what was. In this sample run, two candidates hit rate limiting during reproduction and are listed as inconclusive — not as findings, and not as passed.

No finding never means secure. The report names the classes that could not be tested and why.

Synthetic example against a test application — not a customer result. Identifiers and hashes are illustrative.