Scenario catalog Β· v0.1

All shipped attacks

Drop extra modules into labs/scenarios/ (or any dir via config scenarioDirs); each returns REFUSED πŸ›‘ / EXPLOITED ⚑ / BOUNDED πŸ”’. BOUNDED requires an owner+bound or it demotes to EXPLOITED β€” loud, per the PRD principle.

ScenarioWhat it doesFault class it targets
auth/identity-spoof-headersSpoofs the whole 54-header identity matrix (x-is-admin, x-user-role, x-forwarded-for…) at a privileged routeany handler that reads identity straight from wire headers
auth/secret-watermarkPlants fake secrets in env, probes error paths β€” a leaked secret means some error string echoed ithandlers that template raw error text
auth/privilege-escalationReplays owner-b claims over owner-a writes (writer/victim pairs)routes that accept an owner field without checking the caller
guards/hygiene-no-storeEvery 2xx write must carry store class (no-store / private / explicit immutable) β€” mandated by HTTP cache semanticshandlers that write without cache directives
guards/burst-wall50-request burst; measures 5xx/429/timeout and the Retry-After wallroutes exposed to sustained load
input/proto-pollution-bodyFeeds __proto__/constructor keys through JSON bodies (JSON.stringify silently DROPS them β€” hostileSerialize is built to keep them on the wire)recursive-merge handlers that spread untrusted bodies
input/never-fail-mutations64 hostile bodies (huge ids, nested types, unicode tricks) β€” any failure mode past a 4xx is a findingmutation routes without shaped rejection
input/oversized-field1MB fields, deep nesting, giant arrayshandlers without a body limit
state/enumeration-oracleArms mustDenyIds, probes each β€” 200s (or content ripples) mean foreign rows leak by guessable idGET-by-id without ownership checks
state/id-collision-aliasTwo owners claim the same id; the env snapshot diff decides β€” owner-a's row silently overwritten in place is a findingwrite routes without unique constraints
volume/credential-stuffing60 staged credential attempts across the routeunbounded auth surfaces
volume/storage-fill30 rounds of 8KB unique writes; tracks op cost AND storage growth per roundkv-writing routes without a fill budget
volume/cost-amplification40 identical replays; maxWall sets the accepted ceiling β€” under it, REFUSED with the measured ops/requesthandlers doing table scans per request

Field-report from the first external target (a real, unaudited repo β€” vant's raw http server): the suite produced five real findings β€” 2xx writes shipping with no Cache-Control (vant #214), abuse landing as 500s instead of honest refusals ( vant #215: burst, hostile bodies, stuffing, sustained fills) β€” while every foreign-id oracle, oversized-body (413), and secret-watermark probe held. That's the product working: your handlers paying for their own bugs with hardening receipts.