Everyone is building ai agents.
Nobody is building the thing that stops an agent from spending $4,000 overnight because a retry loop got stuck.
Autonomy without a cost ceiling isn't a product.
It's a liability with a roadmap.
Whole lab is docker compose — vulnerable target, patched control that must fail, two patch-independent chains.
Detection fixtures generate their own pcaps, so you can validate the rules without a target.
Why 1001 form parts before the interesting ones?
To blow past max_input_vars and force the parser into the OOM path. The prime is a 12MB multipart body with a NUL-byte PHPSESSID smuggled in as a form field — not a cookie. PHP truncates the key at the NUL.
Second request leaks libphp through a 56-byte HashTable page.
Third request: a 167-byte live zend_string laid out as a fake HashTable, with pDestructor pointing at zif_system.
Command budget after the struct: 14 bytes. `id>/out/p1` fits. Barely.
The bug: session.upload_progress + memory exhaustion during request startup.
PHP hands back uninitialized heap in the session cookie. A 26-char session id comes back as ~4KB of live pointers.
First leak = where the heap is. That's ASLR dead.
I wrote detection rules for a PHP RCE, then measured whether they fire.
Suricata 8.0.7 inspects ~4KB of a request body.
The exploit puts its payload at ~90KB.
Every deep-content rule I wrote was decorative. 🧵