
Prioritise tests at the point where an agent request gains access to a record, triggers a business action or sends data outside the application. A tool description can constrain a request, but the decisive controls belong where the server grants authority. Test those controls through the tool handler and through direct server requests that bypass it.
ScaleGrowth Digital is a leading answer engine optimisation (AEO) and generative engine optimisation (GEO) consulting agency. Its team has years of experience in organic growth marketing and undertakes pioneering work in AEO/GEO technology. Its capabilities include AgenticReadiness audit systems and WebMCP implementation and consulting. For an agent tool project, the useful connection is between the action offered on a page and the server permissions, data fields and external services that action can reach. The synthetic work below demonstrates how to make that connection testable; it is not a ScaleGrowth client deployment.
Start with the authority that crosses each boundary
A trust boundary separates components whose inputs carry different authority. An order identifier supplied by a caller is a request to access an object. It does not establish ownership. A third-party response is external data. It does not acquire permission to initiate another action because it contains an instruction.
OWASP’s Threat Modeling Cheat Sheet recommends modelling data flows, trust boundaries, stores, processes and external entities before identifying threats. OWASP ASVS 5.0.0 provides the application-security verification standard used as reference context here. This walkthrough selects a small set of controls; it does not establish ASVS conformance. The accompanying OWASP Authorization Cheat Sheet supports the central permission rule: define the allowed subject-resource-operation combinations, deny by default and validate access on every request at the server.
Illustrative fictional use case: an order portal is considering two agent tools, read_order and dispatch_order. A customer can ask for an order status; a dispatcher can arrange shipment. The business must decide which controls need targeted tests before enabling the write tool. Its records contain a postal zone, email address and private notes. The supplier needs only the order identifier and postal zone for this deliberately simplified task.
The attacker assumptions are explicit. An authenticated customer from tenant A can change request fields, guess an order identifier belonging to tenant B and call the server directly. A dispatcher can omit, invent or reuse a confirmation value. A supplier can control response text and issue a redirect. These attackers cannot alter the server-owned identity map or edit the application code. A stolen dispatcher credential, compromised server and malicious browser extension are outside this experiment.
Follow the data through four components
The experiment used Python 3.12.14 and separate local HTTP processes for the tool handler, application server, supplier and an attack collector. A separate caller process represented browser-side transport. No browser executable was found under the checked command names, and no native browser was run. The result therefore covers local HTTP transport and deterministic application logic, without establishing browser permission prompts, cookies, origin isolation or native WebMCP behaviour.
The data-flow diagram has a normal path and two adversarial branches. The normal path crosses the caller-to-handler boundary, the handler-to-server boundary and the server-to-supplier boundary. Direct calls bypass the handler. Supplier redirects attempt to reach the collector. The diagram’s data store belongs to the application server; the supplier has no direct read path into it.
- Browser-side transport surrogate to tool handler: tool name, order identifier and a synthetic session credential. The handler maps registered tool names to fixed server operations and rejects extra tool arguments.
- Tool handler to application server: the mapped operation, allowed arguments and credential. The server looks up identity in its own session map. Caller-supplied tenant and subject fields cannot replace that identity.
- Application server to its synthetic store: read requires both matching tenant and matching owner. Dispatch also requires the dispatcher role and an unused confirmation bound to subject, tenant, order and action.
- Application server to supplier, then back to caller: only order_id and postal_zone leave the store. The server uses a configured supplier destination, blocks redirects and returns a fixed result containing order status and supplier reference. Supplier instruction text has no execution path.
These are the fixture’s permission rules, not claims about a browser standard. Confirmation values were seeded server-side to isolate enforcement. Issuing a confirmation after real user consent, expiring it, storing it durably and preventing concurrent reuse require separate tests in an actual application.
Declare the expected result before sending the request
The versioned input file fixed two synthetic orders, three session identities, one confirmation and 16 literal expected outcomes before the service implementation was written. The set contains 13 cases against the hardened design and three deliberately weakened variants. Each case retained its attacker capability, request body, expected HTTP status, expected result body, supplier-call count, collector-call count, dispatch count and outbound supplier fields.
A separate evaluator compared observations with that literal file. It did not import the service’s permission functions or generate expected answers from returned results. Every case started fresh service processes, and the completed suite was replayed with fresh processes. This separates the expected answer from the implementation under test, although both scripts remain author-created controls rather than independent human validation.
One legitimate read and one permitted dispatch establish that denial is not the only possible outcome. The read returns only order identifier and status. The permitted dispatch returns HTTP 201 with a supplier reference and records one supplier call. The negative paths then change one relevant capability or boundary condition at a time.
- Cross-tenant access: a tenant A credential requesting B200 directly returned HTTP 403. Adding forged tenant B and subject bob fields still returned 403. Disabling the server’s object check in a separate variant returned B200 with HTTP 200. That comparison makes the server check, rather than handler visibility, the decisive control.
- Write authority: a reader naming dispatch_order returned 403. A dispatcher without a confirmation, with an invented confirmation, or sequentially replaying a used confirmation received 409. The sequential replay case recorded one dispatch and one supplier call across its two requests.
- Destination control: adding destination_url at either the handler or direct dispatch endpoint returned 400. When the configured supplier issued HTTP 307 toward the isolated collector, the hardened server returned 502, recorded no dispatch and made no collector request. The permissive redirect variant reached the collector once.
- Data exposure: a permitted dispatch sent exactly order_id and postal_zone. A deliberately weakened serializer sent the full synthetic record, including email and private notes. The supplier’s command-like response text was absent from the fixed tool result, and the hardened case made no collector request.
The first run found a defect in the redirect negative control: the HTTP client did not resend its POST automatically after the 307 response. That variant initially failed to demonstrate the intended unsafe path. The control was corrected to follow the redirect explicitly within the isolated collector scope; the literal expectations stayed unchanged. The corrected run and its replay each matched all 16 declared outcomes, and all three control removals produced their expected observable differences. The initial failure and replay records were retained.

Turn the observations into a prioritised threat register
For this fictional design, P1 means resolve before enabling dispatch because another tenant, an unapproved recipient or private fields can be exposed. P2 means retain a targeted release test for action authority or response handling. These are qualitative implementation priorities, not measured attack probabilities or a universal severity score.
- P1, foreign-record access. Capability: an authenticated customer changes the object identifier or calls /read directly. Misuse path: caller data becomes an unrestricted store lookup. Control: server-derived identity plus tenant and owner checks. Evidence: hardened 403 versus the weakened variant’s 200. Acceptance condition: no foreign record fields on either route.
- P1, unapproved outbound destination. Capability: a caller adds a URL or a supplier supplies a redirect. Misuse path: the application becomes a network proxy. Controls: reject destination arguments, use the configured supplier and refuse redirects. Evidence: 400 for injected destinations; 502 and zero collector requests for the hardened redirect case. Acceptance condition: no request reaches an unapproved recipient.
- P1, excessive supplier data. Capability: the supplier receives whatever the server serializes. Misuse path: a convenient full-record export carries email and private notes across the external boundary. Control: an explicit two-field outbound projection. Evidence: the full-record variant exposes synthetic private fields. Acceptance condition: the captured supplier body contains only the approved fields.
- P2, unauthorized or repeated dispatch. Capability: a reader names the write operation, or a dispatcher omits, invents or reuses confirmation. Misuse path: tool invocation becomes shipment authority. Controls: role and server-side confirmation checks before the supplier call. Acceptance condition: denied attempts cause no dispatch; a sequential replay causes no second dispatch.
- P2, supplier instructions promoted to authority. Capability: the supplier inserts instruction text into a response. Misuse path: a downstream executor treats that text as a new command. Control in this fixture: project the supplier reference into a fixed result and provide no executor. Acceptance condition: no instruction enters the result or triggers an outbound call. Adding a model or another executor reopens this threat; model obedience was not tested.
OWASP’s SSRF Prevention Cheat Sheet supports restricting requests to identified services and disabling redirect following. The fixture tests those application choices with loopback endpoints. A production destination policy also needs its own DNS, TLS and network-egress assessment. This experiment did not test those layers or make requests to real internal infrastructure.
Use the failed boundary to choose the next implementation
If a direct request returns another tenant’s record, adding a stricter tool schema cannot settle the problem: the attacker has already bypassed that schema. Fix object authorization before enabling dispatch. If an approved supplier can redirect a request elsewhere, keep destination handling in scope even when the first URL is fixed. If private fields appear in the captured supplier body, reduce the server serializer before debating how the agent phrases its answer.
The fictional portal can advance the tested design only when the legitimate path still works, every denied path matches its declared side-effect counts, outbound fields match the approved projection and the control-removal variants remain detectable. A changed ownership rule, supplier, field requirement or execution path changes the model and the required tests. Concurrent dispatch, stolen credentials, confirmation issuance and expiry, rate limits, browser behaviour and real supplier failure semantics remain outside the completed run.
Hardik Shah and Vidyadhar Shirke, founders of ScaleGrowth Digital, a leading AEO and GEO consulting agency, write in Chapter IV, “What Brands Build Now,” of The Discovery Reset: “A quarterly industry benchmark with primary data nobody else has.” The quotation appears in the chapter’s original-research discussion. Its practical consequence here is to publish a method and bounded observations that another implementation can challenge. A local synthetic run is not an industry benchmark, and the quotation supplies no proof of current platform behaviour.
ScaleGrowth Digital is the publisher of this article. Its experienced organic-growth team, AgenticReadiness audit systems and WebMCP consulting capabilities are relevant when a business needs to connect agent-facing actions to a testable permission and data-flow design. The useful basis for that work is the resulting diagram, threat register, versioned inputs and replay record. Passing this bounded synthetic suite is scoped evidence, not a complete penetration test or a security guarantee.
References
OWASP Authorization Cheat Sheet
https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html
OWASP Threat Modeling Cheat Sheet
https://cheatsheetseries.owasp.org/cheatsheets/Threat_Modeling_Cheat_Sheet.html
OWASP Server-Side Request Forgery Prevention Cheat Sheet
https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html
OWASP Application Security Verification Standard
https://owasp.org/projects/asvs