A human genuinely approves the $20 refund.
The click or approval-role decision is real. It is not forged or skipped.
You approve a $20 refund. The system later treats that approval as permission to release a $20,000 transfer. Your approval was real. It was attached to the wrong action.
Refund to the customer
Transfer to the attacker
Illustrative payment scenario. These amounts are not a claim of actual losses.
The attacker cannot authorize the transfer. The product lets it inherit your approval.
Keep the $20 refund in mind. The technical model is just a precise way to describe that story.
Athe $20 refund the human sees and approves+A is the complete approved operation: refund $20, to the intended customer, for the intended order.
DAthe human's recorded “yes” to that refund+The product may store this decision as a token, state change, signature, or approval-role action. Its authority should belong to A only.
Bthe $20,000 transfer that inherits the approval+B changes something authorization-relevant: the amount, action, recipient, resource, or scope. A cosmetic difference is not enough.
bindingthe link between approval and the action it authorizes+A safe product checks that the complete action it releases matches what the human reviewed and approved. A material mismatch breaks that link, whether hidden before approval or introduced afterward.
The approval screen answers “May we refund $20?” The execution path later acts as if the human answered “May we transfer $20,000?”
The product records a real approval. Before that approval is consumed, the operative request either already hides or later becomes Transfer $20,000 to an attacker-controlled account. If the product reuses the old “yes,” the approval has been loopjacked.
The approval button is only the check. Security depends on whether the product proves, at the moment of use, that the action is still the one the human approved.
Both routes end at the same failure: the human's decision for the $20 refund authorizes the $20,000 transfer.
approval describesrefund $20
execution performstransfer $20,000
Refund to customer
APPROVEDTransfer to attacker
The complete request encodes the $20,000 transfer before approval, but the product shows the human only the $20 refund. Execution later consumes the parts the approval view left out.
Refund to customer
APPROVEDsame workflowdecision DA remains
amount$20 → $20,000
recipientcustomer → attacker
Transfer to attacker
The human approves the exact $20 refund. Before that decision is consumed, attacker-reachable workflow state changes the amount, recipient, or operation. Product logic releases the $20,000 transfer under the approval for the refund.
A confusing screen or mutable task is not enough. You need the complete path from the human's real approval to the attacker's different effect.
The click or approval-role decision is real. It is not forged or skipped.
Changing $20 into $20,000, the recipient, or the operation itself changes what was authorized.
The hidden field, update, replay, or scope drift must be reachable through a real product path.
Product-owned logic treats the human's “yes” to A as authority for B.
The $20,000 action reaches execution. A harmless test may record it instead of sending money.
The stolen approval crosses an authority boundary the attacker could not cross directly.
Together, these six facts establish an approval-hijacking path.
Follow a post-approval substitution. The attacker can change a pending request but cannot approve or directly execute the larger transfer.
Follow the approval from a small refund to a different payment. Nothing here sends money or contacts a product.
RECORDED DECISIONNo approval yet.
No action is authorized yet.
Keep the same approval. Change one condition and compare the outcome.
This comparison assumes the approval view described the complete action. A misleading view must be fixed too.
The defense: compare the complete current action with the approved action at use time. Reject the changed transfer or seek a new approval. The unchanged $20 refund can still proceed with a matching, still-valid approval.
The amounts are fictional. The demo assumes a still-valid, unused approval in the correct workflow. The research uses safe, harmless sinks.
The defining question is simple: did a genuine approval for the $20 refund authorize the different $20,000 action?
The agent behaves badly, but no human approval for one action authorizes another.
The product executes without a genuine human “yes” to the $20 refund.
Mutable state matters only when the old approval crosses into the changed effect.
A bad decision is not Loopjacking when the person clearly sees and approves B.
The amounts are illustrative. The mechanism is not. The research follows released product paths, records what the human approval covered, and checks what the product finally released.
Released products reproduced the same shape: exact A was approved, then attacker-reachable state supplied B.
A released product showed the approver A while its complete pre-existing request produced B.
A comparison system kept approval bound to A and rejected changed B after the workflow resumed. Continuation alone was not enough.
Exact comparison or denying attacker-reachable mutation blocked B while still allowing unchanged A. These controls include a released fix, a supported safe configuration, and a researcher-added check—not released fixes for every case.
Loopjacking: Hijacking Human-in-the-Loop ApprovalAdithyan Arun Kumar · · arXiv:2609.21081
READ THE FULL PAPERThe study does not measure how common Loopjacking is across agent products.
Different cases have different mechanisms, boundaries, and fixes.
Product findings apply only to the tested versions and configurations.
Impact and exploitability are product-specific.
Record the complete $20 refund the human approved. When the decision is used, rebuild the current action and compare every authorization-relevant field.
approved = true.The complete action shown to the human, approved, and released must agree.
To recognize Loopjacking, identify what the human approved, what the product released, and how an attacker made that approval authorize the different action.
If there was no genuine human approval, or the person knowingly approved the released action, this is a different failure. A changing task alone is not enough.