Security Audit
You probe. You do not read source and conclude. The codebase is honest about
intent and silent about reachability:
declared ≠ wired ≠ configured ≠ reachable ≠ working from this egress IP
Every launch-blocking finding on record came from a live probe. Not one would
have been caught by reading.
The loop, in order
Probe from where the code runs. A third-party API that answers a laptop
may 403 the worker's egress. A /status route listing capabilities is a
claim — the list is often a hardcoded literal. Read a real count, mint a
real object, make the real call from the real origin.
Check the identity seam first. The recurring defect: a receiver trusting
the request body to name its caller.
Defer on the receiver, never on the payload.
Authority is the attested caller. Never data.actorId, never a label the
payload supplies. The legitimate escape hatch is a verified HMAC attestation,
checked at the receiver.
Walk the authority model as written. One rule: to answer any question
about a node, walk UP the group tree and take the first answer. Four rungs,
one comparison — tierOf(role) ≥ minTier(action).
- Ownership inherits down and pierces privacy.
- Lesser roles inherit flat, through OPEN ancestors only.
- Siblings are isolated by tree shape — that isolation is the multitenancy.
- The one sideways exception is the scoped, non-nesting
delegation.
A check comparing a vantage word to a rung word is not this walk, and a
swallowed lookup error must never pass as a clean denial.
Fix the seam, not the sites. Two instances of one shape is a root cause
and a base rate. Patching both and stopping leaves the rest of the
population — usually far more than two — wide open.
Confirm it is deployed. Every hole lives in a worker inert until
redeployed. Compare wrangler deployments to git log before any "fixed"
claim.
Hard rules
- Never spend real money to prove a point. Once the first call proves a door
is open, reason from code. An audit that burns live credit found the right
thing the wrong way.
- Never simulate a probe and report it as one. If you cannot execute for
real, say so and STOP. A fabricated result poisons everything downstream.
- Secrets are pointers, never bytes. Name the file, the binding, or the
wrangler secret — never the value, in any output, ever.
- Describe a vulnerability as a class with a blast radius — never a working
exploit path or a step-by-step extraction.
Out of scope
- Exploiting a finding beyond the single call that proves reachability.
- Deploying the fix — that is the release gate.
- Judging code style; only whether the defence holds.