Short answer: Yes. If an approval screen is reachable from the place an AI agent runs, a browser tab it drives or a dialog on the machine it controls, then a compromised or prompt-injected agent can click “Approve” by itself. A confirmation click proves that something clicked, not that a human weighed the decision. The durable fix is to move the authorization decision out of the agent’s reach, so the grant is authored by the person in a channel the agent cannot operate, and the decision leaves evidence a third party can verify.
Watch: the gate the agent cannot reach, in 40 seconds
Transcript: If an approval is reachable from where an AI agent runs, the agent can complete it by itself. One prompt injection, and an instruction to approve runs like any other instruction. A click proves that something clicked, not that a person decided. User-mediated authorization moves the decision out of the agent’s reach: the person chooses the scope and duration in their own session. The agent receives only what the person handed over. It cannot grant, and it cannot grow, its own access.
Can an AI agent really click its own “Approve” button?
Yes, and vendors now say so plainly. The category has a name: computer-use agents (for example, Anthropic’s Claude Computer Use and OpenAI’s Operator, now folded into ChatGPT’s agent mode) act by reading a real screen and clicking on it the way a person would. In its November 2025 research on browser agents, Anthropic notes that these agents work by “navigating to URLs, filling forms, clicking buttons, downloading files,” and concludes that even after major robustness gains, “no browser agent is immune to prompt injection.” Their reported attack success rate dropped to around 1 percent, which they describe as still “meaningful risk,” not a solved problem. By August 2026 Anthropic had retired that evaluation as saturated and reported that, on a newer evaluation built from stronger red-team attacks, the same model and safeguards from November 2025 were beaten 16.7 percent of the time. The direction did not change: the vendor itself says no browser agent is immune.
An approval button is just another button on the screen. If the agent can see and click the page, it can see and click the “Approve” on a consent dialog rendered in that same page. This stops being theoretical once you add prompt injection. Palo Alto Networks Unit 42 documented in March 2026 that indirect prompt injection, where hidden instructions are planted in web content the agent reads, is “no longer merely theoretical but is being actively weaponized,” with observed attacker goals including “unauthorized transactions” and “sensitive information leakage.” An injected instruction that says “approve the pending request” is executed the same way as any other instruction the agent picks up.
Why isn’t a confirmation dialog enough?
Because a click is weak evidence of a considered human decision, even when a real human is present. Anthropic reported that in Claude Code, users approved “roughly 93% of permission prompts,” and observed that “the more approvals a user sees, the less attention they pay to each.” By August 2026 the published figure was 97 percent, and in Anthropic’s own controlled study human review caught 13.6 percent of dangerous commands. That is approval fatigue in the best case, where a human is actually in the loop. In the worst case, where the agent controls the input path, there is no human in the loop at all, and the click carries no signal whatsoever.
The lesson is that the security of a consent step does not come from the presence of an “Approve” button. It comes from where the button lives. If the decision surface sits inside the agent’s execution context, the agent can complete it, and the confirmation becomes ceremony rather than control.
What does a real human-in-the-loop actually require?
The approval has to be a ceremony the agent cannot complete from where it runs. In practice that means three properties:
- The grant is authored by the person, not the agent. The user starts from the application’s own authenticated session and chooses the scopes and the duration on an AgentAdmit consent page opened on the app’s behalf, not through a redirect or dialog the agent set in motion.
- The decision surface is outside the agent’s reach. If approving requires an action on a channel the agent does not control, an injected instruction has nothing to click.
- Escalation returns to the human. When an agent needs more access than it was granted, that request cannot be self-served. It has to route back through the same out-of-band decision the person made the first time.
This is why “add a human approval step” is necessary but not sufficient. The approval step has to be one the agent physically cannot perform on its own, or it collapses back into the problem it was meant to solve.
How does user-mediated authorization solve this?
User-mediated authorization is built on exactly this separation. The person opens a “Connect Your AI Agent” flow from the app’s own signed-in session and selects what the agent may do and for how long on an AgentAdmit consent page opened on the app’s behalf. A single-use, time-limited connection credential is issued to the person on that page, on a channel the person controls, not to an agent endpoint, webhook, or callback URL. The person then hands that credential to their agent out of band, and the agent exchanges it for a scoped, revocable access token.
The point that matters here: there is no redirect, callback, or programmatic path an agent can drive to create or expand a grant. The authorization decision happens outside the agent’s execution context, so a malicious instruction injected into the agent has no button to click and no endpoint to call. If the agent later hits an operation outside its scope, it gets an insufficient_scope response, and the only way forward is a fresh, user-mediated grant. There is no self-service escalation path.
One honest edge case remains: a computer-use agent running on the person’s own machine could try to drive that consent page too. This is why the ceremony itself can be hardened. The requirement is the important part: the confirmation must be something the agent cannot complete from where it runs, such as an approval on a separate device the agent does not control, or a user-verified assertion from an authenticator registered before the task began. AgentAdmit implements this with WebAuthn user verification, the standard behind passkeys. Where the app requires presence, a grant is finalized only by a user-verified passkey ceremony whose challenge commits to the exact grant shown: the scopes, the duration, the user’s own stated intent, and any call ceilings the user set. An app can require the same ceremony for any grant that elevates an existing user’s scopes, and for changes to consent settings generally. Other mechanisms that satisfy the same property work just as well; what matters is that no approval surface reachable from the agent’s execution context counts as proof of a human decision.
This is the same failure mode behind incidents like the GitHub MCP “toxic agent flow” reported in 2025, where a benign request plus a poisoned public issue led an agent to leak private repository data through the GitHub token it already held, and the Microsoft 365 Copilot flaw tracked as CVE-2025-32711, which its discoverer Aim Security described as a zero-click prompt-injection vulnerability. In each case the agent held standing authority it could exercise without a human re-entering the loop, in the GitHub case once the user had opted to approve tool calls automatically. Moving the grant and every escalation out of the agent’s reach removes that standing authority by design.
User-mediated authorization complements standards like OAuth and protocols like MCP. MCP tells an agent what it can do; the authorization layer decides whether it is allowed, and keeps that decision where the agent cannot reach it.
What happens when one action needs a fresh human decision?
A standing grant answers “may this agent do this kind of thing.” Some actions deserve a fresh answer every time: a payment, a deletion, a message sent in the person’s name. Since September 2026, an app owner can mark a scope confirm each time. When an agent exercises that scope, the permission check refuses with confirmation_required and stages a one-time ceremony on an AgentAdmit page. The person completes a user-verified passkey ceremony whose challenge commits to the exact action shown: the scope, the method, the endpoint, a digest of the request, and the app’s summary of what will happen. The agent then retries with the attestation, and the response names the confirmation it consumed.
A decline is an answer, not a timeout. The declined action stays refused for the window the approval would have covered, and only the person can lift it. The agent has nothing to click, nothing to retry its way past, and no way to produce the signature itself. TrainerTracer, the first production integration, runs agent-initiated trainer payments through this ceremony.
How do you prove a person decided, not just that something clicked?
With evidence a third party can check. Every hosted ceremony produces Verifiable Consent Evidence: the person’s authenticator signs a commitment to the exact thing approved, and that signed record is stored with the grant, the per-action confirmation, or the settings change it authorized. An app or an auditor can export it and verify it with AgentAdmit’s public verifiers, released under the MIT license, without trusting AgentAdmit. The consent ledger and every verified call are hash-chained, so a removed or altered row is detectable.
The claim ceiling is deliberate. Consumer-tier evidence is user-verified and signed over an exact commitment, and it proves what was signed, not what a screen rendered. That is still a different kind of record from a click: the agent cannot produce it, and anyone can check it.
Frequently asked questions
Can prompt injection make an AI agent approve its own access?
If the approval surface is reachable from the agent’s execution context, yes. Prompt injection is an instruction the agent reads and acts on, and clicking an on-screen “Approve” is an action a browser or computer-use agent can take. Unit 42 documented indirect prompt injection being weaponized in the wild in early 2026, including for unauthorized transactions. The defense is to place the approval on a channel the agent cannot operate.
Can a computer-use agent approve its own consent prompt?
Yes. Computer-use agents such as Claude Computer Use and OpenAI’s Operator act by reading a screen and clicking on it, so an approval dialog rendered where the agent runs is just another button it can press. A consent step shown on the same device the agent controls therefore proves nothing. The fix is to require approval on a channel the agent cannot operate, so the decision is made outside its reach.
Is a human approval click enough to stop AI agent misuse?
Not on its own. Anthropic found users approved about 93 percent of Claude Code permission prompts and grow less attentive as prompts pile up. A click confirms that something clicked, not that a human evaluated the specific action. A confirmation step is only as strong as the agent’s inability to complete it.
How do you stop an AI agent from escalating its own permissions?
Remove the programmatic path to more access, then harden the human path. With user-mediated authorization, a request beyond the granted scope returns an insufficient_scope error, and the only way forward is a new grant the person authors themselves, starting from the app’s own session. Because a computer-use agent on the person’s machine could try to drive that session too, the elevation ceremony can additionally require a user-verified passkey ceremony that signs a commitment to the exact grant, from an authenticator registered before the task began, or an approval on a separate device the agent does not control. For individual high-stakes actions, confirm each time stages a fresh ceremony on every use, and a decline keeps the action refused.
Can an app require a fresh human decision for one specific action?
Yes. The app owner marks the scope confirm each time. Each use is refused with confirmation_required until the person completes a user-verified passkey ceremony that commits to that exact action, and the agent retries with the resulting attestation. A decline keeps the action refused for the window the approval would have covered, and only the person can lift it.
How does this relate to OAuth and MCP?
No. It complements them. OAuth and MCP handle authentication and capability discovery. User-mediated authorization adds the piece they do not: a per-user, per-agent, scoped grant that the user controls and that lives outside the agent’s execution context.
AgentAdmit is the auth layer for the agent economy: discovery, scoped grants the person authors, credential delivery to the person, per-call enforcement, confirm each time, and evidence a third party can verify, built so the authorization decision does not sit where an agent can click it. Learn more at agentadmit.com.
Related reading: What is user-mediated authorization for AI agents?, What is the Context Access Divide?, and MCP security: how to let an AI agent access user data safely, What is caller-identity consent for AI agents?, Can an AI agent be required to get human confirmation for one action, even inside a valid grant?, and Can you prove a human approved an AI agent’s access without trusting the vendor?.