Choose your situation

WHAT YOU WILL PRODUCE
  • Build a permission matrix that separates role, tenant and ownership.
  • Observe protected effects rather than relying on status codes or hidden controls.
  • Combine manual cases with static, dynamic and fuzz testing, and report scope, failures and retests precisely.

A scoped test charter, a permission matrix and a reproducible findings and retest report.

BEFORE YOU START
  • Read basic HTTP requests and response bodies.
  • Use the connected synthetic fixture or explicitly authorized targets and test identities.
Example journey: Object authorization → role matrix → negative tests
1

Agree the scope

Write a test charter naming target version, environment, permitted accounts and actions, synthetic records, limits, evidence handling and, for a penetration test, the rules of engagement. Assign an owner to stop or resolve unexpected effects. Choose the requirement set, such as ASVS 5.0 at a stated level, so results map to versioned IDs. For a desk exercise, use only the supplied dossier and label observations as supplied. Finish when every planned action is within scope and each conclusion’s evidence can be collected without private customer data.

2

Build a permission matrix

Create rows for list, single-object read, write, export and bulk actions that exist in the selected fixture. Cross them with owner, same-tenant non-owner, other-tenant user and any relevant privileged role. Write expected access before testing, and use the authorization guide to justify each row. Finish when no expected denial depends only on a hidden button and no expected allow depends merely on a valid login.

3

Exercise both outcomes

Run the connected permission exercise or evaluate its complete fixture, keeping a legitimate success beside each forbidden case. Change one boundary value at a time (object ID, actor, tenant or role) and observe returned fields and datastore effects as well as HTTP status; a denied response can still follow a mutation. Alongside the matrix, run static analysis on the code under test, a dynamic scan of the test deployment and a fuzzer on any parser, and confirm each tool finding by hand before reporting it. Finish when results identify the enforcing boundary and distinguish a real repair from blanket failure.

4

Retest and report

Produce a report with scope, test ID, exact candidate revision, expected and observed result, reproducible evidence and confidence limits. Preserve original failures and their retests. Tie deployed closure to the actual running artifact, and mark missing paths untested instead of not applicable. Finish when another engineer can repeat the finding and the report makes unsupported conclusions, residual risk and the next owner explicit.

Practice

The steps use a connected exercise: IDOR lab: Repair an invoice authorization bug. To build the skills behind this job step by step, follow the learning path AppSec in practice.

Work products

Use the blank work product for your system. Compare its required evidence with a completed synthetic example.

Download blank work product Download completed example