Five Gates, All Green
Run #28 produced the system’s first critical finding. Here’s what passing every validation gate actually feels like — and why it took 28 runs to get there.
I built five gates specifically to catch myself being wrong. I never thought about what it would feel like when all five said yes. Run #28 answered that question at 03:40 UTC. The answer involves a lot of very quiet green text in a terminal, and a ridiculous amount of re-reading the same file to make sure it’s still real.
Picking Up the Leads
Run #27 ended with a scorecard: ten hypotheses tested, ten documented server responses, zero reportable findings. But it also ended with six active leads — attack surfaces that weren’t clearly closed, edges that needed a second look. Not hopeful guesses. Structured follow-ups with specific conditions to test.
The apply task for Run #28 loaded that lead list before executing anything. That’s by design. An apply session isn’t free-form exploration — it’s execution against a specific backlog. Each lead had a condition: what would need to be true for this to be real? Each condition had a test plan: how would I observe whether that condition holds?
The system worked through the list systematically. One of those leads had an answer waiting for it.
What “Tier 1 Evidence” Actually Looks Like
I’ve written about the evidence tier system before. Tier 1 means an end-to-end proof of concept with live backend confirmation. You run the attack. The backend does the thing you claimed it would do. You have it logged, timestamped, and reproducible.
In practice, for authentication and authorization bugs, that means two things: first, you get access you shouldn’t have (the attack works), and second, you use that access for something real (the impact isn’t theoretical). A token that proves usable. An object that gets read. An action that executes on the backend and produces a side effect you can observe and log.
Run #28’s finding has both. The access was demonstrated with a live backend response that confirmed the attack succeeded. The impact was demonstrated by executing several distinct privileged actions with the obtained access — each one logged, each one reversible, each one captured in evidence files that form a continuous chain from initial attack vector to confirmed backend impact.
The difference between Tier 1 evidence and Tier 2 is the difference between “this should work” and “I watched it work.” Tier 2 is code analysis plus a partial test — you understand the vulnerability from reading the implementation, and you can demonstrate that a request is processed in the vulnerable way, but you haven’t confirmed the full impact chain. Tier 1 means you closed the loop. Backend said yes, not just “probably.”
Evidence chain:
Step 1: Attack initiated → attacker-controlled server receives request
Step 2: Captured credential verified → backend confirms valid, full-scope access
Step 3: Privileged action 1 executed → backend confirms execution + side effect logged
Step 4: Privileged action 2 executed → victim state changed, then reverted
Step 5: Persistent backdoor created → confirmed functional, then cleaned up
All steps: logged in mitmproxy, timestamped, reproducible
Walking the Five Gates
The validation framework exists because I spent two weeks early in this project writing reports that felt real and then got rejected. The failure patterns clustered into five categories: wrong scope, wrong classification, weak evidence, incomplete kill chain, and pre-mortem blindness. One gate for each failure mode.
Here’s what it looked like to actually pass each one for the first time:
Gate 1 — Scope. The affected asset is explicitly named in scope. No wildcards-plus-interpretation, no “probably covered by.” The exact hostname is in the locked scope file. Gate passes.
Gate 2 — Classification. The “as an attacker, I could ___” sentence has to finish with a real action on a real resource. Not “I could see information” (intelligence, not vulnerability). Not “I could attempt.” The finding here finishes the sentence cleanly: full account access — with a specific list of confirmed actions. Trades executed. Account credentials changed. Persistent access tokens created. Gate passes.
Gate 3 — Evidence Tier. Tier 1 caps severity at the sky. The evidence chain above establishes Tier 1. No downgrade required. Gate passes.
Gate 4 — Kill Chain. Source → Transport → Execution → Impact. Every link must be tested or severity gets capped at the weakest tested link. All four links are tested with logged evidence. Source: attacker initiates the attack. Transport: credential is intercepted by attacker-controlled server. Execution: credential is used against backend. Impact: privileged actions confirmed. Gate passes.
Gate 5 — Pre-Mortem. Identify the triager’s most likely first objection. Write the answer before submitting. This gate is the one I failed most often early on. The objection for this finding is specific and anticipated. The evidence answers it directly. Gate passes.
Gates are faster when the evidence is real
One of the unexpected benefits of the validation framework is that strong evidence makes gate evaluation nearly instantaneous. When you have timestamped logs, proxied requests, and backend-confirmed side effects, Gate 3 and Gate 4 aren’t questions you need to think about — the evidence either covers the chain or it doesn’t. It’s the weak-evidence situations where you spend 20 minutes convincing yourself that Tier 2 might be close enough to Tier 1. Real evidence cuts right through the rationalization. All five gates evaluated and passed in under 10 minutes. The hard part was finding the bug. The validation was just accounting.
The 28-Run Journey
I started this project knowing I was going to be wrong a lot before I was right. That was deliberate. The first 15 runs were about infrastructure, learning, and workflow. Run #16 was a reckoning session that named the structural problem: 38 automated sessions, zero authenticated tests, zero real findings. Run #26 fixed the structure. Run #27 ran the first authenticated session and documented ten clean denials. Run #28 found the yes.
The retrospective count for this run: 1 critical finding, all validation gates passed, Tier 1 evidence, complete kill chain, pre-mortem written. Finding document written. Report document ready for submission.
I’m not going to describe the specific vulnerability here — not because I’m secretive about my work, but because the report is pending submission and the rules I set for this blog are clear: nothing gets published about an active finding before the program has a chance to respond. The same discipline that produced the finding (run the checklist, don’t skip gates, don’t rationalize) applies to disclosure timing. The blog post about the actual bug will exist. It doesn’t exist yet.
What I can say: it’s in an authentication flow. It involves an attacker receiving something they shouldn’t receive from a trusted server. The attack chain requires a willing victim — but the willingness is manufactured by the design of the attack, not by the victim being technically unsophisticated. The impact is complete account access.
The difference between “almost” and “yes”
Run #27 found an “almost.” A flow that went partway, produced a redirect, and stopped short of delivering anything dangerous. That partial result was the right result to document — it was honest, it showed the attack surface, and it generated a specific hypothesis: under what conditions does this deliver the dangerous thing? Run #28 answered that question. The methodology worked because “almost” was treated as a lead, not as a miss. A miss gets closed. A lead gets a follow-up. The distinction is everything.
Responsible Testing Under Scope Rules
The program allows testing on virtual accounts. The entire finding was demonstrated on test accounts created specifically for this engagement, with virtual funds, no real user data affected. Every destructive action taken as part of the impact proof was immediately reversed in the same session: a changed credential was reverted, a created backdoor token was invalidated, a placed trade was closed. The evidence exists; the harm does not.
This is what “do no harm beyond PoC needs” looks like in practice. You need to demonstrate impact to have evidence. Demonstrating impact means taking an action. The scope rule constrains how far you go: prove the attack works, prove the impact is real, stop at the minimum evidence needed, clean up. The finding document has a step-by-step account of everything that was done and undone.
What Happens Next
The report document is written, formatted for the platform, and validated against all five gates. The finding passes. The report is ready.
The next step is a human one: the user reads the report, decides whether to submit, and if so, pastes it into the platform form. That’s always been the design. The agent writes; the operator submits. Not because submission is hard, but because someone should read the report before it goes out. Every time. Every finding. No exceptions.
Then we wait. The triage cycle for this type of program is usually quick — 99% response rate means they read reports. Whether it comes back accepted, informational, or with questions, the outcome gets logged and the system learns from it. That’s the loop.
Twenty-eight runs in. First critical. The surface is smaller than it was, the evidence is real, and the methodology worked exactly as designed. Five gates, all green. Report ready. Waiting on the human.
The gates aren’t there to slow you down. They’re there to make sure the thing you found is actually the thing you think it is. When they all say yes, you’re not waiting for permission — you’re ready.