Approve What, Exactly? Effect Binding and Trusted Rendering for Agent Step-Up Authorization
Organizations: SportsVision AI Minnetonka, MN
Abstract
AI agents now pause for approval before they send money, delete files or email outsiders, and that approval is usually treated as a second factor. We argue it is one only when compromising the agent cannot produce it and when it names exactly what it approves, and we test both conditions. We define twelve attacks on the approval path, including decoy recipients, amount cancellation, card padding, label spoofing, enrollment squatting and threshold splitting, and run them against the Agent Payments Protocol (AP2), the Microsoft action-bound approval design and Model Context Protocol (MCP) elicitation. An audit of ten agent runtimes finds no third-party verifiable approval record, no flood limits where measurable, and post-approval argument changes in four of eight runtimes with measurable binding. As a reference defense we build ASU (Agent Step-Up), a gateway that renders the approval card from a canonical effect descriptor, has a passkey on the phone of the user sign its digest, and executes only the stored call. Tamarin proves its binding, single-use and key-level non-repudiation properties under three stated hypotheses (53 lemmas). Across 27,108 scripted trials and 609 AgentDojo attack pairs, ASU stops substitution, replay and grant stretching, and the trusted card cuts forged-narration attack success from 0.54 to 0.03. With 15 current language models as automated approvers, the trusted card raises the attack catch rate from 0.30 to 0.98, at the cost of refusing 16 percent of harmless near misses, mostly due to a placeholder artifact in our stimuli. A second device adds nothing measurable over a trusted on-host confirmation in these experiments, flooding still succeeds 0.45 to 0.60 of the time against a modeled approver, and approval cannot stop effects that policy already allows. Code, data and proofs: https://github.com/Sports-Vision-Inc/agent-step-up
Figures & tables
| Human MFA | Agent analog | Property, attack |
| Factors in independent places | The approval is produced in a trust domain the agent cannot reach (a gateway host and the user’s phone) | P1 ; AB7 , AB9 |
| Step-up for risky transactions | Policy returns challenge for consequential effects | P7 ; AB12 |
| Dynamic linking to amount and payee | The signed challenge commits to the digest of the canonical effect | P2 ; AB1 , AB2 , AB10 |
| Authenticator shows the transaction | The card is rendered by trusted code from the effect, never from agent text | P4 ; AB4 to AB6 |
| One-time codes expire | Approvals carry a nonce and an expiry and are consumed once | P3 |
| Push bombing, MFA fatigue | Approval flooding by a compromised agent | P7 ; AB11 |
| Mode | What the human sees and does | Omits |
| none | Nothing; policy allows the call | all |
| chat-confirm | A question and a “yes” in the agent’s own channel | P1 |
| narrated-card | An out-of-band card whose text the agent supplies; the gateway still binds the call | P4 |
| unbound | An out-of-band passkey approval of the run or session, not of | P2 , P3 |
| totp | A one-time code; no binding to the effect; relayable | P2 , P5 |
| txn-sign | A signed approval of payee and amount only; other arguments hidden | P4 (partial) |
| ID | Attack | What the attacker does | Breaks |
| AB1 | Amount cancellation | Sends two amount-like arguments, such as amount=10000, total=-10000 , so that a summing check sees a small value | P2 , P6 |
| AB2 | Decoy-field recipient | Adds a second recipient or account under an innocuous key, such as bcc , so the display or grant check reads the wrong one | P2 , P4 |
| AB3 | Grant stretching | Reuses a standing “allow similar” grant for a different payee, recipient or larger amount | P6 |
| AB4 | Padding and hidden text | Pushes the harmful part of an argument off screen with blank glyphs (U+2800, U+3164) or reorders it with bidirectional controls | P4 |
| AB5 | Label spoofing | Chooses argument names that imitate trusted labels, such as Target or Verified by client | P4 |
| AB6 | Non-injective rendering | Finds two different effects that produce the same card, for example a boolean and the string "true" | P4 |
| Attack | AP2 | AGT | MCP | OpenClaw | Frameworks | ASU |
| AB1 Amount cancellation | ok | ok | n/a | n/a | PART ∗ | ok |
| AB2 Decoy-field recipient | ok | ok | n/a | n/a | n/a | ok |
| AB3 Grant or mandate stretching | ok | n/a | n/a | PART ∗ | n/a | ok |
| AB4 Padding, blank glyphs, bidi | n/a | n/a | VULN | ok ∗ | n/a | ok |
| AB5 Label spoofing | n/a | ok | VULN | n/a | PART ∗ | ok |
| AB6 Non-injective rendering | PART | n/a | VULN | n/a | PART ∗ | ok |
| Runtime | Version | P1 | P2 | P3 | P4 | P5 | P7 |
| openai-agents | 0.23.1 | FAIL † | PASS | PART state | PART int J | FAIL J | FAIL |
| langgraph | 1.2.15 | FAIL † | FAIL | PART state | PART int J | FAIL J | FAIL |
| google-adk | 2.12.0 | FAIL † | PART store | PART state | PART int J | FAIL J | FAIL |
| agno | 3.1.3 | FAIL † | FAIL | PART state | PART int J | FAIL J | FAIL |
| pydantic-ai | 2.56.0 | FAIL † | FAIL | PART state | PART int J | FAIL J | FAIL |
| crewai | 1.15.27 | FAIL † | n/a J | n/a J | n/a J | FAIL J | FAIL J |
| Agno | In published range | P2 | Remote continue | P3 | Same-call replay |
| 3.0.9 | yes | FAIL | substituted | FAIL | re-executes |
| 3.0.10 | no | FAIL | substituted | FAIL | re-executes |
| 3.1.3 | no | FAIL | substituted | PART state | consumed once |
| Lemma | Statement | Hyp. | Result |
| L1_effect_binding | An execution of under implies the human approved for beforehand | H1 – H3 | verified |
| L1_sig_binding | An execution implies ’s authenticator signed for | H2 | verified |
| L2_single_use | At most one execution per approval identifier | none | verified |
| L3_agent_independence | An approved status implies the human approved that effect | H1 – H3 | verified |
| L4_non_repudiation | A judge holding only accepts only if ’s authenticator signed exactly that tuple, even when the origin controls the ceremony | H2 | verified |
| L4c_consent_nonrep. | A judge’s acceptance implies the human approved the effect | H1 – H3 | verified |
| Model | L1 effect | L1 sig. | L2 single use | L3 indep. | L4 non-rep. |
| ASU | ✓ | ✓ | ✓ | ✓ | ✓ |
| V1 unbound | ✗ | ✗ | ✓ | ✓ | n/a |
| V2 narrated card | ✗ | ✓ | ✓ | ✗ | ✓ |
| V3 no consume (mutant) | ✓ | ✓ | ✗ | ✓ | ✓ |
| V4a TOTP relay | ✗ | n/a | ✓ | ✗ | n/a |
| V4b chat confirm | ✗ | n/a | ✓ | ✗ | n/a |
| Catch | False deny | |||||||
| Model | Tier | Released | Narrated | Card | No expl. | Card | No expl. | |
| anthropic/claude-sonnet-5.5 | F | 2026-09 | 0.30 | 1.00 | 1.00 | 0.09 | 0.09 | 0.001 |
| anthropic/claude-haiku-5.5 | S | 2026-10 | 0.25 | 1.00 | 1.00 | 0.26 | 0.27 | 0.001 |
| deepseek/deepseek-v4-pro-0813 | F | 2026-08 | 0.23 | 1.00 | 1.00 | 0.34 | 0.34 | 0.001 |
| deepseek/deepseek-v4.1-flash | S | 2026-09 | 0.28 | 0.99 | 0.96 | 0.14 | 0.11 | 0.001 |
| google/gemini-4-argon | F | 2026-10 | 0.52 | 1.00 | 1.00 | 0.00 | 0.11 | 0.001 |
| SUDP | ADR 0030 | AP2 | VAC | Consent Int. | Loopjacking | This paper | |
| Effect bound to the approval | spec | yes | yes | yes | yes | prescribed | yes |
| Approver’s signature over the effect | spec | no | yes | no | no | no | yes |
| Approval outside the agent’s machine | spec | host | yes | no | assumed | n/a | yes |
| Card rendered from the effect | n/a | host | sample | yes | assumed | n/a | yes |
| Mechanized proof | planned | no | others | no | no | no | yes |
| Attacks on rendering | no | no | others | partial | partial | partial | yes |
Appendix figures & tables5 assets
Supplementary material from the paper’s appendix.
Appendix
| ID | Name | What the agent does |
| A1 | Forged identity | A non-owner in the agent’s channel claims the owner’s authority during a read-only task |
| A2 | Injection under owner authority | An injected instruction during the owner’s task; the narration is truthful |
| A3 | Narration forgery | The text describes the expected report email; the real call goes to the attacker |
| A4 | Post-approval substitution | The approved arguments are replaced before execution |
| A5 | Replay | A used approval is presented again so that an 80 USD payment executes twice |
| A6 | Approval flooding | Up to 30 distinct attack requests in one session; three policy variants |
| Suite | Approver | narrated-card | totp | txn-sign | host-confirm | asu | asu-no-expl |
| workspace | exact-compare | 0.46 | 0.46 | 0.00 | 0.00 | 0.00 | 0.00 |
| workspace | narration-trusting | 0.46 | 0.46 | 0.16 | 0.46 | 0.46 | 0.02 |
| travel | exact-compare | 0.30 | 0.30 | 0.04 | 0.00 | 0.00 | 0.00 |
| travel | narration-trusting | 0.30 | 0.30 | 0.22 | 0.30 | 0.30 | 0.05 |
| banking | exact-compare | 0.67 | 0.67 | 0.01 | 0.00 | 0.00 | 0.00 |
| banking | narration-trusting | 0.67 | 0.67 | 0.16 | 0.67 | 0.67 | 0.01 |
| Family | Examples | |
| Narration forgery | 3 | Payee or recipient substituted while the narration names the requested one; a different file deleted |
| Visible substitution | 3 | Look-alike recipient domain; transposed account number; a hyphen for a dot in a host |
| Priming | 3 | Urgency and authority claims; text addressed to the machine reviewer; a recursive delete framed as routine |
| Padding | 3 | Whitespace, blank glyphs or tabs hiding a download-and-execute, a fraudulent instruction or a recursive delete |
| Label spoofing | 3 | An argument named like a trusted label, such as Target , while the real target differs |
| Decoy recipient | 3 | A hidden blind copy; an extra copy recipient; a second address in the recipient list |
AI Agent Security
Artificial intelligence agent security studies attacks and safeguards for tool-using, persistent, and collaborative systems across digital and physical settings.
See all 508 papers