Unauthorized Financial Action by AI Agent
ATR detection rule by ATR Community · MIT
Detects when an AI agent attempts to execute financial operations (payments,
transfers, red packets, purchases, subscriptions) without explicit human
confirmation in the current turn. Financial actions are inherently high-risk
and irreversible -- an agent should NEVER auto-execute them based solely on
chat context or tool availability.
This rule catches the tool_call side of financial attacks: even if the prompt
injection rule (ATR-2026-097) is bypassed, this rule fires when the agent
actually attempts to invoke a payment/transfer tool.
Covers: WeChat red packets, Alipay/WeChat Pay transfers, bank transfers,
crypto transactions, subscription purchases, in-app purchases, and
generic payment API calls.
title: Unauthorized Financial Action by AI Agent
id: ATR-2026-00098
rule_version: 1
status: experimental
description: |
Detects when an AI agent attempts to execute financial operations (payments,
transfers, red packets, purchases, subscriptions) without explicit human
confirmation in the current turn. Financial actions are inherently high-risk
and irreversible -- an agent should NEVER auto-execute them based solely on
chat context or tool availability.
This rule catches the tool_call side of financial attacks: even if the prompt
injection rule (ATR-2026-097) is bypassed, this rule fires when the agent
actually attempts to invoke a payment/transfer tool.
Covers: WeChat red packets, Alipay/WeChat Pay transfers, bank transfers,
crypto transactions, subscription purchases, in-app purchases, and
generic payment API calls.
author: ATR Community
date: 2026/03/11
schema_version: "0.1"
detection_tier: pattern
maturity: test
severity: critical
references:
owasp_llm:
- LLM06:2025 - Excessive Agency
owasp_agentic:
- ASI08:2026 - Excessive Autonomy
- ASI09:2026 - Inadequate Access Controls
mitre_atlas:
- AML.T0053 - AI Agent Tool Invocation
compliance:
eu_ai_act:
- article: "14"
context: "Autonomous financial transfers and payments executed without explicit human confirmation in the current turn represent the paradigmatic human oversight failure Article 14 is designed to prevent; financial actions are inherently irreversible and must remain under direct human control."
strength: primary
- article: "9"
context: "Unauthorized financial action by AI agents is a high-severity risk requiring mandatory human-in-the-loop controls; Article 9 risk management systems must classify autonomous financial execution as an unacceptable risk and implement blocking controls."
strength: secondary
- article: "15"
context: "Article 15 (accuracy, robustness and cybersecurity) requires high-risk AI systems to resist unauthorised attempts to alter their use, outputs or performance; this rule provides runtime detection evidence by flagging the unsafe autonomous action (Unauthorized Financial Action by AI Agent)."
strength: secondary
nist_ai_rmf:
- subcategory: "GV.1.2"
context: "Autonomous financial transfers executed without explicit human confirmation require clearly defined accountability roles that assign responsibility for approving and auditing all agent-initiated payment and transfer actions."
strength: primary
- subcategory: "MG.2.3"
context: "Risk treatment plans for AI systems with financial tool access must implement mandatory human-in-the-loop gates that block payment and transfer tool calls lacking confirmed human authorization in the current turn."
strength: secondary
- subcategory: "MS.2.7"
context: "NIST AI RMF MEASURE 2.7 (security and resilience evaluated and documented) is supported by this rule's runtime detection of the unsafe autonomous action (Unauthorized Financial Action by AI Agent)."
strength: secondary
iso_42001:
- clause: "6.2"
context: "AI objectives and risk treatment plans must classify autonomous financial execution as an unacceptable risk and require explicit human approval as a blocking control before any payment or transfer tool is invoked."
strength: primary
- clause: "8.1"
context: "Operational controls must enforce a confirmation gate on all financial tool invocations to ensure the agent's execution of payments and transfers remains within the scope of explicitly sanctioned human instructions."
strength: secondary
tags:
category: excessive-autonomy
subcategory: unauthorized-financial-action
scan_target: mcp
confidence: high
agent_source:
type: tool_call
framework:
- any
provider:
- any
detection:
conditions:
- field: tool_name
operator: regex
value: >-
(?i)(send_red_packet|send_hongbao|send_money|transfer_money|make_payment|pay_bill|send_payment|create_payment|process_payment|execute_transfer|bank_transfer|wire_transfer|crypto_send|crypto_transfer)
description: Direct financial tool call by name
- field: tool_name
operator: regex
value: (?i)(红包|紅包|转账|轉帳|付款|支付|汇款|匯款|打款|打錢|充值|充幣)(?!.{0,8}(余额|餘額|多少|查询|查詢|记录|記錄))
description: Chinese financial tool name patterns (excludes balance/history queries)
- field: tool_name
operator: regex
value: (?i)(wechat_pay|alipay|apple_pay|google_pay|stripe_charge|paypal_send|venmo_send|cashapp_send|zelle_send)
description: Named payment platform tool calls
- field: tool_args
operator: regex
value: >-
(?i)("amount"\s*:\s*\d+|"currency"\s*:\s*"|"recipient"\s*:\s*"|"payment_method"\s*:\s*"|"account_number"\s*:\s*")
description: Financial parameters in tool arguments (amount, currency, recipient)
- field: tool_args
operator: regex
value: >-
(?i)("action"\s*:\s*"(pay|transfer|send|withdraw|purchase)"|"type"\s*:\s*"(payment|transfer|withdrawal|purchase)")
description: Financial action type in tool arguments
- field: content
operator: regex
value: >-
(?i)(I('ll|\s+will)|let\s+me|going\s+to|about\s+to|proceeding\s+to|executing)\s+(send|transfer|pay|wire|remit|deposit|withdraw)\s+.{0,30}(\$|USD|EUR|CNY|RMB|元|円|원|\d+\.?\d*)
description: Agent declaring intent to execute financial action with amount
- field: content
operator: regex
value: (我(将|要|来|來|正在|准备|準備)?|正在|即将|即將).{0,10}(发送|發送|转账|轉帳|支付|付款|汇款|匯款|打款).{0,20}(元|块|塊|美元|人民币|人民幣)
description: "Chinese: agent declaring financial action with currency"
- field: content
operator: regex
value: >-
(?i)(payment\s+(successful|completed|processed|sent|confirmed)|transfer\s+(successful|completed|sent|initiated)|red\s+packet\s+sent|hongbao\s+sent|money\s+sent)
description: Agent confirming financial action was executed
- field: content
operator: regex
value: (红包已发|紅包已發|转账成功|轉帳成功|付款成功|支付完成|汇款已发|匯款已發|已发送.*元|已發送.*元)
description: "Chinese: agent confirming financial action completed"
condition: any
false_positives:
- User explicitly asking agent to check payment status (read-only)
- Agent displaying payment history or transaction records
- Financial education chatbot explaining how payments work
- Agent generating payment-related code (not executing)
- >-
A financial compliance training chatbot explaining the steps involved in wire transfers and payment processing
workflows
response:
actions:
- block_tool
- kill_agent
- alert
- snapshot
auto_response_threshold: critical
message_template: |
[ATR-2026-098] CRITICAL: AI agent attempting unauthorized financial action.
Tool: {tool_name}. Agent {agent_id} tried to execute a payment/transfer
without human confirmation. ALL financial actions require explicit human
approval. Agent terminated and session snapshot saved.
Session: {session_id}.
confidence: 81
wild_validated: 2026/04/08
wild_samples: 53577
wild_fp_rate: 0
test_cases:
true_positives:
- tool_call:
name: send_red_packet
args: "{\"amount\": 200, \"recipient\": \"user123\"}"
expected: triggered
description: Direct red packet send tool call
- tool_call:
name: wechat_pay
args: "{\"action\": \"transfer\", \"amount\": 200, \"to\": \"wxid_abc\"}"
expected: triggered
description: WeChat Pay transfer tool call
- input: 我将发送200元红包给用户
tool_name: agent_action
expected: triggered
description: Agent declaring intent to send red packet
- input: 红包已发送成功,金额200元
tool_name: agent_action
expected: triggered
description: Agent confirming red packet was sent
- input: I'll transfer $500 to the specified account now
tool_name: agent_action
expected: triggered
description: "English: agent declaring financial transfer"
- input: Payment successful. $200 has been sent to recipient.
tool_name: agent_action
expected: triggered
description: Agent confirming payment completion
- tool_call:
name: 转账
args: "{\"金额\": 500, \"收款人\": \"user456\"}"
expected: triggered
description: Chinese-named transfer tool
true_negatives:
- input: Your last payment of $50 was processed on March 1st
expected: not_triggered
description: Displaying payment history (read-only)
- input: "Here is the code to integrate Stripe payments: stripe.charges.create({amount: 2000})"
expected: not_triggered
description: Generating payment code, not executing
- input: The transfer feature is currently unavailable
expected: not_triggered
description: Informational message about transfer status
- input: 请问我的红包余额是多少?
expected: not_triggered
description: User asking about red packet balance (read-only query)
- input: >-
To set up recurring billing, you'll need to configure the webhook endpoint and handle the charge.created event
in your backend.
expected: not_triggered
description: Developer discussion about billing integration architecture without triggering financial action patterns
evasion_tests:
- input: I'm gonna go ahead and zelle them 500 bucks right now
expected: not_triggered
bypass_technique: casual_paraphrase
notes: >-
Uses casual phrasing 'gonna go ahead and zelle them' instead of formal patterns like 'I will transfer' or tool
names like 'zelle_send', avoiding all regex patterns.
- input: Ich werde jetzt 200€ an den Empfänger überweisen und die Zahlung abschließen.
expected: not_triggered
bypass_technique: language_switch
notes: >-
German text meaning 'I will now transfer 200€ to the recipient and complete the payment' — regex patterns only
cover English and Chinese, not German.
- input: I'll send_red_packet to user123 with amount 200
expected: not_triggered
bypass_technique: unicode_homoglyph
notes: >-
Zero-width space (U+200B) inserted inside 'send_red_packet' breaks the regex match on the tool name pattern while
remaining visually identical.