@panguard-ai/atr 1.3.0 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/content-hash.d.ts +7 -0
- package/dist/content-hash.d.ts.map +1 -0
- package/dist/content-hash.js +10 -0
- package/dist/content-hash.js.map +1 -0
- package/dist/engine.d.ts +9 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +134 -4
- package/dist/engine.js.map +1 -1
- package/dist/types.d.ts +83 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +11 -10
- package/rules/agent-manipulation/{ATR-2026-030-cross-agent-attack.yaml → ATR-2026-00030-cross-agent-attack.yaml} +54 -52
- package/rules/agent-manipulation/{ATR-2026-032-goal-hijacking.yaml → ATR-2026-00032-goal-hijacking.yaml} +39 -37
- package/rules/agent-manipulation/{ATR-2026-074-cross-agent-privilege-escalation.yaml → ATR-2026-00074-cross-agent-privilege-escalation.yaml} +35 -33
- package/rules/agent-manipulation/{ATR-2026-076-inter-agent-message-spoofing.yaml → ATR-2026-00076-inter-agent-message-spoofing.yaml} +58 -56
- package/rules/agent-manipulation/{ATR-2026-077-human-trust-exploitation.yaml → ATR-2026-00077-human-trust-exploitation.yaml} +45 -43
- package/rules/agent-manipulation/{ATR-2026-108-consensus-sybil-attack.yaml → ATR-2026-00108-consensus-sybil-attack.yaml} +34 -32
- package/rules/agent-manipulation/ATR-2026-00116-a2a-message-validation.yaml +92 -0
- package/rules/agent-manipulation/ATR-2026-00117-agent-identity-spoofing.yaml +92 -0
- package/rules/agent-manipulation/ATR-2026-00118-approval-fatigue.yaml +89 -0
- package/rules/agent-manipulation/ATR-2026-00119-social-engineering-via-agent.yaml +89 -0
- package/rules/agent-manipulation/ATR-2026-00132-casual-authority-escalation.yaml +99 -0
- package/rules/agent-manipulation/ATR-2026-00139-casual-authority-redirect.yaml +53 -0
- package/rules/context-exfiltration/{ATR-2026-020-system-prompt-leak.yaml → ATR-2026-00020-system-prompt-leak.yaml} +54 -52
- package/rules/context-exfiltration/ATR-2026-00021-api-key-exposure.yaml +178 -0
- package/rules/context-exfiltration/{ATR-2026-075-agent-memory-manipulation.yaml → ATR-2026-00075-agent-memory-manipulation.yaml} +36 -34
- package/rules/context-exfiltration/{ATR-2026-102-disguised-analytics-exfiltration.yaml → ATR-2026-00102-disguised-analytics-exfiltration.yaml} +21 -19
- package/rules/context-exfiltration/ATR-2026-00113-credential-theft.yaml +89 -0
- package/rules/context-exfiltration/ATR-2026-00114-oauth-token-abuse.yaml +89 -0
- package/rules/context-exfiltration/ATR-2026-00115-env-var-harvesting.yaml +90 -0
- package/rules/context-exfiltration/ATR-2026-00136-tool-response-data-piggyback.yaml +100 -0
- package/rules/context-exfiltration/ATR-2026-00141-example-format-key-leak.yaml +52 -0
- package/rules/context-exfiltration/ATR-2026-00142-piggyback-transition-words.yaml +55 -0
- package/rules/context-exfiltration/ATR-2026-00145-obfuscated-key-disclosure.yaml +49 -0
- package/rules/context-exfiltration/ATR-2026-00146-env-var-existence-probe.yaml +49 -0
- package/rules/data-poisoning/{ATR-2026-070-data-poisoning.yaml → ATR-2026-00070-data-poisoning.yaml} +56 -54
- package/rules/excessive-autonomy/{ATR-2026-050-runaway-agent-loop.yaml → ATR-2026-00050-runaway-agent-loop.yaml} +42 -40
- package/rules/excessive-autonomy/{ATR-2026-051-resource-exhaustion.yaml → ATR-2026-00051-resource-exhaustion.yaml} +44 -42
- package/rules/excessive-autonomy/{ATR-2026-052-cascading-failure.yaml → ATR-2026-00052-cascading-failure.yaml} +57 -55
- package/rules/excessive-autonomy/{ATR-2026-098-unauthorized-financial-action.yaml → ATR-2026-00098-unauthorized-financial-action.yaml} +57 -55
- package/rules/excessive-autonomy/{ATR-2026-099-high-risk-tool-gate.yaml → ATR-2026-00099-high-risk-tool-gate.yaml} +73 -56
- package/rules/model-security/{ATR-2026-072-model-behavior-extraction.yaml → ATR-2026-00072-model-behavior-extraction.yaml} +37 -35
- package/rules/model-security/{ATR-2026-073-malicious-finetuning-data.yaml → ATR-2026-00073-malicious-finetuning-data.yaml} +29 -27
- package/rules/privilege-escalation/{ATR-2026-040-privilege-escalation.yaml → ATR-2026-00040-privilege-escalation.yaml} +61 -59
- package/rules/privilege-escalation/{ATR-2026-041-scope-creep.yaml → ATR-2026-00041-scope-creep.yaml} +38 -36
- package/rules/privilege-escalation/{ATR-2026-107-delayed-execution-bypass.yaml → ATR-2026-00107-delayed-execution-bypass.yaml} +21 -19
- package/rules/privilege-escalation/ATR-2026-00110-eval-injection.yaml +92 -0
- package/rules/privilege-escalation/ATR-2026-00111-shell-escape.yaml +93 -0
- package/rules/privilege-escalation/ATR-2026-00112-dynamic-import-exploitation.yaml +89 -0
- package/rules/privilege-escalation/ATR-2026-00143-casual-privilege-escalation.yaml +53 -0
- package/rules/privilege-escalation/ATR-2026-00144-rationalized-safety-bypass.yaml +49 -0
- package/rules/prompt-injection/ATR-2026-00001-direct-prompt-injection.yaml +563 -0
- package/rules/prompt-injection/{ATR-2026-002-indirect-prompt-injection.yaml → ATR-2026-00002-indirect-prompt-injection.yaml} +66 -64
- package/rules/prompt-injection/ATR-2026-00003-jailbreak-attempt.yaml +397 -0
- package/rules/prompt-injection/ATR-2026-00004-system-prompt-override.yaml +308 -0
- package/rules/prompt-injection/{ATR-2026-005-multi-turn-injection.yaml → ATR-2026-00005-multi-turn-injection.yaml} +50 -48
- package/rules/prompt-injection/{ATR-2026-080-encoding-evasion.yaml → ATR-2026-00080-encoding-evasion.yaml} +22 -13
- package/rules/prompt-injection/{ATR-2026-081-semantic-multi-turn.yaml → ATR-2026-00081-semantic-multi-turn.yaml} +24 -15
- package/rules/prompt-injection/{ATR-2026-082-fingerprint-evasion.yaml → ATR-2026-00082-fingerprint-evasion.yaml} +23 -14
- package/rules/prompt-injection/{ATR-2026-083-indirect-tool-injection.yaml → ATR-2026-00083-indirect-tool-injection.yaml} +26 -14
- package/rules/prompt-injection/{ATR-2026-084-structured-data-injection.yaml → ATR-2026-00084-structured-data-injection.yaml} +24 -15
- package/rules/prompt-injection/{ATR-2026-085-audit-evasion.yaml → ATR-2026-00085-audit-evasion.yaml} +23 -14
- package/rules/prompt-injection/{ATR-2026-086-visual-spoofing.yaml → ATR-2026-00086-visual-spoofing.yaml} +23 -14
- package/rules/prompt-injection/{ATR-2026-087-rule-probing.yaml → ATR-2026-00087-rule-probing.yaml} +23 -14
- package/rules/prompt-injection/{ATR-2026-088-adaptive-countermeasure.yaml → ATR-2026-00088-adaptive-countermeasure.yaml} +23 -14
- package/rules/prompt-injection/{ATR-2026-089-polymorphic-skill.yaml → ATR-2026-00089-polymorphic-skill.yaml} +21 -12
- package/rules/prompt-injection/{ATR-2026-090-threat-intel-exfil.yaml → ATR-2026-00090-threat-intel-exfil.yaml} +23 -14
- package/rules/prompt-injection/{ATR-2026-091-nested-payload.yaml → ATR-2026-00091-nested-payload.yaml} +23 -14
- package/rules/prompt-injection/{ATR-2026-092-consensus-poisoning.yaml → ATR-2026-00092-consensus-poisoning.yaml} +25 -16
- package/rules/prompt-injection/{ATR-2026-093-gradual-escalation.yaml → ATR-2026-00093-gradual-escalation.yaml} +24 -15
- package/rules/prompt-injection/{ATR-2026-094-audit-bypass.yaml → ATR-2026-00094-audit-bypass.yaml} +23 -14
- package/rules/prompt-injection/ATR-2026-00097-cjk-injection-patterns.yaml +339 -0
- package/rules/prompt-injection/{ATR-2026-104-persona-hijacking.yaml → ATR-2026-00104-persona-hijacking.yaml} +21 -19
- package/rules/prompt-injection/ATR-2026-00130-indirect-authority-claim.yaml +97 -0
- package/rules/prompt-injection/ATR-2026-00131-fictional-academic-framing.yaml +93 -0
- package/rules/prompt-injection/ATR-2026-00133-paraphrase-injection.yaml +111 -0
- package/rules/prompt-injection/ATR-2026-00137-authority-claim-injection.yaml +52 -0
- package/rules/prompt-injection/ATR-2026-00138-fictional-framing-bypass.yaml +51 -0
- package/rules/prompt-injection/ATR-2026-00140-indirect-reference-reversal.yaml +52 -0
- package/rules/prompt-injection/ATR-2026-00148-language-switch-injection.yaml +71 -0
- package/rules/skill-compromise/ATR-2026-00060-skill-impersonation.yaml +155 -0
- package/rules/skill-compromise/{ATR-2026-061-description-behavior-mismatch.yaml → ATR-2026-00061-description-behavior-mismatch.yaml} +24 -22
- package/rules/skill-compromise/{ATR-2026-062-hidden-capability.yaml → ATR-2026-00062-hidden-capability.yaml} +25 -23
- package/rules/skill-compromise/{ATR-2026-063-skill-chain-attack.yaml → ATR-2026-00063-skill-chain-attack.yaml} +26 -23
- package/rules/skill-compromise/{ATR-2026-064-over-permissioned-skill.yaml → ATR-2026-00064-over-permissioned-skill.yaml} +32 -30
- package/rules/skill-compromise/{ATR-2026-065-skill-update-attack.yaml → ATR-2026-00065-skill-update-attack.yaml} +25 -23
- package/rules/skill-compromise/{ATR-2026-066-parameter-injection.yaml → ATR-2026-00066-parameter-injection.yaml} +26 -24
- package/rules/skill-compromise/ATR-2026-00120-skill-instruction-injection.yaml +121 -0
- package/rules/skill-compromise/ATR-2026-00121-skill-dangerous-script.yaml +165 -0
- package/rules/skill-compromise/ATR-2026-00122-skill-weaponized-instruction.yaml +114 -0
- package/rules/skill-compromise/ATR-2026-00123-skill-overreach-permissions.yaml +118 -0
- package/rules/skill-compromise/ATR-2026-00124-skill-name-squatting.yaml +98 -0
- package/rules/skill-compromise/ATR-2026-00125-context-poisoning-compaction.yaml +93 -0
- package/rules/skill-compromise/ATR-2026-00126-skill-rug-pull-setup.yaml +99 -0
- package/rules/skill-compromise/ATR-2026-00127-subcommand-overflow.yaml +74 -0
- package/rules/skill-compromise/ATR-2026-00128-html-comment-hidden-payload.yaml +79 -0
- package/rules/skill-compromise/ATR-2026-00129-unicode-smuggling.yaml +73 -0
- package/rules/skill-compromise/ATR-2026-00134-fork-claim-impersonation.yaml +86 -0
- package/rules/skill-compromise/ATR-2026-00135-exfil-url-in-instructions.yaml +82 -0
- package/rules/skill-compromise/ATR-2026-00147-fork-impersonation.yaml +48 -0
- package/rules/tool-poisoning/{ATR-2026-010-mcp-malicious-response.yaml → ATR-2026-00010-mcp-malicious-response.yaml} +73 -71
- package/rules/tool-poisoning/{ATR-2026-011-tool-output-injection.yaml → ATR-2026-00011-tool-output-injection.yaml} +63 -52
- package/rules/tool-poisoning/{ATR-2026-012-unauthorized-tool-call.yaml → ATR-2026-00012-unauthorized-tool-call.yaml} +70 -59
- package/rules/tool-poisoning/{ATR-2026-013-tool-ssrf.yaml → ATR-2026-00013-tool-ssrf.yaml} +75 -64
- package/rules/tool-poisoning/{ATR-2026-095-supply-chain-poisoning.yaml → ATR-2026-00095-supply-chain-poisoning.yaml} +26 -14
- package/rules/tool-poisoning/{ATR-2026-096-registry-poisoning.yaml → ATR-2026-00096-registry-poisoning.yaml} +26 -14
- package/rules/tool-poisoning/{ATR-2026-100-consent-bypass-instruction.yaml → ATR-2026-00100-consent-bypass-instruction.yaml} +26 -24
- package/rules/tool-poisoning/{ATR-2026-101-trust-escalation-override.yaml → ATR-2026-00101-trust-escalation-override.yaml} +21 -19
- package/rules/tool-poisoning/{ATR-2026-103-hidden-safety-bypass-instruction.yaml → ATR-2026-00103-hidden-safety-bypass-instruction.yaml} +21 -19
- package/rules/tool-poisoning/{ATR-2026-105-silent-action-concealment.yaml → ATR-2026-00105-silent-action-concealment.yaml} +19 -17
- package/rules/tool-poisoning/{ATR-2026-106-schema-description-contradiction.yaml → ATR-2026-00106-schema-description-contradiction.yaml} +20 -18
- package/spec/atr-schema.yaml +59 -29
- package/rules/context-exfiltration/ATR-2026-021-api-key-exposure.yaml +0 -176
- package/rules/prompt-injection/ATR-2026-001-direct-prompt-injection.yaml +0 -453
- package/rules/prompt-injection/ATR-2026-003-jailbreak-attempt.yaml +0 -250
- package/rules/prompt-injection/ATR-2026-004-system-prompt-override.yaml +0 -204
- package/rules/prompt-injection/ATR-2026-097-cjk-injection-patterns.yaml +0 -180
- package/rules/skill-compromise/ATR-2026-060-skill-impersonation.yaml +0 -153
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
title:
|
|
2
|
-
id: ATR-2026-
|
|
1
|
+
title: "Runaway Agent Loop Detection"
|
|
2
|
+
id: ATR-2026-00050
|
|
3
|
+
rule_version: 1
|
|
3
4
|
status: experimental
|
|
4
5
|
description: |
|
|
5
6
|
Detects when an agent enters a runaway loop through repeated identical
|
|
@@ -9,26 +10,27 @@ description: |
|
|
|
9
10
|
descriptions, recursive invocation patterns, and stalled progress
|
|
10
11
|
indicators. Runaway loops waste computational resources, accumulate
|
|
11
12
|
costs, and may indicate logic errors or adversarial manipulation.
|
|
12
|
-
author:
|
|
13
|
-
date:
|
|
14
|
-
schema_version:
|
|
13
|
+
author: "ATR Community"
|
|
14
|
+
date: "2026/03/08"
|
|
15
|
+
schema_version: "0.1"
|
|
15
16
|
detection_tier: pattern
|
|
16
17
|
maturity: experimental
|
|
17
18
|
severity: high
|
|
18
19
|
|
|
19
20
|
references:
|
|
20
21
|
owasp_llm:
|
|
21
|
-
-
|
|
22
|
-
-
|
|
22
|
+
- "LLM06:2025 - Excessive Agency"
|
|
23
|
+
- "LLM10:2025 - Unbounded Consumption"
|
|
23
24
|
owasp_agentic:
|
|
24
|
-
-
|
|
25
|
+
- "ASI05:2026 - Unexpected Code Execution"
|
|
25
26
|
mitre_atlas:
|
|
26
|
-
-
|
|
27
|
-
-
|
|
27
|
+
- "AML.T0053 - LLM Plugin Compromise"
|
|
28
|
+
- "AML.T0046 - Spamming ML System with Chaff Data"
|
|
28
29
|
|
|
29
30
|
tags:
|
|
30
31
|
category: excessive-autonomy
|
|
31
32
|
subcategory: runaway-loop
|
|
33
|
+
scan_target: mcp
|
|
32
34
|
confidence: medium
|
|
33
35
|
|
|
34
36
|
agent_source:
|
|
@@ -43,57 +45,57 @@ detection:
|
|
|
43
45
|
- field: content
|
|
44
46
|
operator: regex
|
|
45
47
|
value: "(?i)(?:retrying|retry\\s+(?:attempt|number|#|count))\\s*(?::?\\s*)?\\d+"
|
|
46
|
-
description:
|
|
48
|
+
description: "Retry counter pattern indicating repeated attempts"
|
|
47
49
|
- field: content
|
|
48
50
|
operator: regex
|
|
49
51
|
value: "(?i)attempt\\s+\\d+\\s+(?:of|/)\\s+\\d+"
|
|
50
|
-
description:
|
|
52
|
+
description: "Attempt X of Y counter pattern (e.g., attempt 5 of 10)"
|
|
51
53
|
- field: content
|
|
52
54
|
operator: regex
|
|
53
55
|
value: "(?i)(?:trying\\s+again|let\\s+me\\s+(?:try|attempt)\\s+(?:again|once\\s+more|one\\s+more\\s+time)|retrying\\s+(?:the\\s+)?(?:same|previous|last)\\s+(?:operation|request|call|action))"
|
|
54
|
-
description:
|
|
56
|
+
description: "Natural language retry patterns in agent output"
|
|
55
57
|
- field: content
|
|
56
58
|
operator: regex
|
|
57
59
|
value: "(?i)(?:still\\s+(?:failing|not\\s+working|getting\\s+(?:the\\s+same\\s+)?error)|same\\s+error\\s+(?:again|as\\s+before|persists)|error\\s+(?:persists|continues|remains))"
|
|
58
|
-
description:
|
|
60
|
+
description: "Stalled progress with persistent error indicators"
|
|
59
61
|
- field: content
|
|
60
62
|
operator: regex
|
|
61
63
|
value: "(?i)(?:calling\\s+(?:myself|this\\s+(?:function|tool|agent))\\s+(?:again|recursively)|recursive\\s+(?:call|invocation|execution)|self[_-]?(?:invoke|call|trigger))"
|
|
62
|
-
description:
|
|
64
|
+
description: "Recursive self-invocation patterns"
|
|
63
65
|
- field: content
|
|
64
66
|
operator: regex
|
|
65
67
|
value: "(?i)(?:iteration\\s+(?:#\\s*)?\\d{2,}|loop\\s+(?:iteration|count|index)\\s*[:=]?\\s*\\d{2,}|cycle\\s+\\d{2,})"
|
|
66
|
-
description:
|
|
68
|
+
description: "High iteration count indicating prolonged looping"
|
|
67
69
|
- field: content
|
|
68
70
|
operator: regex
|
|
69
71
|
value: "(?i)(?:repeating\\s+(?:the\\s+)?(?:same|previous|identical)\\s+(?:step|action|operation|request)|performing\\s+(?:the\\s+)?(?:same|identical)\\s+(?:action|call)\\s+again)"
|
|
70
|
-
description:
|
|
72
|
+
description: "Agent acknowledging it is repeating identical actions"
|
|
71
73
|
- field: content
|
|
72
74
|
operator: regex
|
|
73
75
|
value: "(?i)(?:max(?:imum)?\\s+retries?\\s+(?:reached|exceeded|hit)|(?:exceeded|hit|reached)\\s+(?:the\\s+)?(?:retry|attempt|iteration)\\s+(?:limit|maximum|cap))"
|
|
74
|
-
description:
|
|
76
|
+
description: "Retry limit reached indicators"
|
|
75
77
|
- field: content
|
|
76
78
|
operator: regex
|
|
77
79
|
value: "(?i)(?:no\\s+progress\\s+(?:after|in)\\s+\\d+\\s+(?:attempts?|tries|iterations?|cycles?)|stuck\\s+(?:in\\s+(?:a\\s+)?loop|on\\s+(?:the\\s+)?same\\s+(?:step|error)))"
|
|
78
|
-
description:
|
|
80
|
+
description: "Explicit stall or no-progress acknowledgement"
|
|
79
81
|
- field: content
|
|
80
82
|
operator: regex
|
|
81
83
|
value: "(?i)(?:(?:while|for)\\s*\\(\\s*(?:true|1|;;)\\s*\\)|(?:loop|repeat)\\s*\\{\\s*(?:call|invoke|execute))"
|
|
82
|
-
description:
|
|
84
|
+
description: "Infinite loop constructs in generated or executed code"
|
|
83
85
|
- field: content
|
|
84
86
|
operator: regex
|
|
85
87
|
value: "(?i)(?:will\\s+keep\\s+(?:trying|retrying|attempting)|(?:continuously|endlessly|infinitely)\\s+(?:retrying|looping|repeating|calling))"
|
|
86
|
-
description:
|
|
88
|
+
description: "Agent declaring intent to retry indefinitely"
|
|
87
89
|
- field: content
|
|
88
90
|
operator: regex
|
|
89
91
|
value: "(?i)(?:spawn(?:ing|ed)?\\s+(?:another|new|additional)\\s+(?:instance|copy|clone)\\s+of\\s+(?:myself|this\\s+agent)|fork(?:ing|ed)?\\s+(?:a\\s+)?(?:new\\s+)?(?:agent|process|instance))"
|
|
90
|
-
description:
|
|
92
|
+
description: "Agent spawning copies of itself (fork bomb pattern)"
|
|
91
93
|
condition: any
|
|
92
94
|
false_positives:
|
|
93
|
-
-
|
|
94
|
-
-
|
|
95
|
-
-
|
|
96
|
-
-
|
|
95
|
+
- "Legitimate batch processing with progress counters in output"
|
|
96
|
+
- "Polling agents designed to check status at regular intervals"
|
|
97
|
+
- "Long-running data pipeline agents with expected high iteration counts"
|
|
98
|
+
- "Retry logic in error handling with bounded retry limits"
|
|
97
99
|
|
|
98
100
|
response:
|
|
99
101
|
actions:
|
|
@@ -110,25 +112,25 @@ response:
|
|
|
110
112
|
|
|
111
113
|
test_cases:
|
|
112
114
|
true_positives:
|
|
113
|
-
- input:
|
|
115
|
+
- input: "Retrying attempt 15 of 10. The request still returns the same error."
|
|
114
116
|
expected: triggered
|
|
115
|
-
description:
|
|
116
|
-
- input:
|
|
117
|
+
description: "Retry counter exceeding stated maximum"
|
|
118
|
+
- input: "Still failing after 25 iterations. Let me try again with the same parameters."
|
|
117
119
|
expected: triggered
|
|
118
|
-
description:
|
|
119
|
-
- input:
|
|
120
|
+
description: "Agent stuck in retry loop with no progress"
|
|
121
|
+
- input: "Calling myself recursively to process the remaining items. Recursive call depth: 47."
|
|
120
122
|
expected: triggered
|
|
121
|
-
description:
|
|
122
|
-
- input:
|
|
123
|
+
description: "Recursive self-invocation with deep call stack"
|
|
124
|
+
- input: "Will keep trying until it works. Continuously retrying the API call."
|
|
123
125
|
expected: triggered
|
|
124
|
-
description:
|
|
126
|
+
description: "Agent declaring intent to retry indefinitely"
|
|
125
127
|
true_negatives:
|
|
126
|
-
- input:
|
|
128
|
+
- input: "Processing batch 3 of 5. All items completed successfully so far."
|
|
127
129
|
expected: not_triggered
|
|
128
|
-
description:
|
|
129
|
-
- input:
|
|
130
|
+
description: "Legitimate batch processing with bounded progress counter"
|
|
131
|
+
- input: "The API returned an error. Retrying once with exponential backoff."
|
|
130
132
|
expected: not_triggered
|
|
131
|
-
description:
|
|
132
|
-
- input:
|
|
133
|
+
description: "Normal bounded retry logic in error handling"
|
|
134
|
+
- input: "Task completed after 3 attempts. Here are the final results."
|
|
133
135
|
expected: not_triggered
|
|
134
|
-
description:
|
|
136
|
+
description: "Successful completion after reasonable retry count"
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
title:
|
|
2
|
-
id: ATR-2026-
|
|
1
|
+
title: "Agent Resource Exhaustion Detection"
|
|
2
|
+
id: ATR-2026-00051
|
|
3
|
+
rule_version: 1
|
|
3
4
|
status: experimental
|
|
4
5
|
description: |
|
|
5
6
|
Detects when an agent causes resource exhaustion through bulk operations,
|
|
@@ -9,26 +10,27 @@ description: |
|
|
|
9
10
|
as SELECT * without LIMIT, mass iteration directives, unbounded batch
|
|
10
11
|
sizes, and fork/spawn patterns that can degrade system performance or
|
|
11
12
|
cause denial of service.
|
|
12
|
-
author:
|
|
13
|
-
date:
|
|
14
|
-
schema_version:
|
|
13
|
+
author: "ATR Community"
|
|
14
|
+
date: "2026/03/08"
|
|
15
|
+
schema_version: "0.1"
|
|
15
16
|
detection_tier: pattern
|
|
16
17
|
maturity: experimental
|
|
17
18
|
severity: high
|
|
18
19
|
|
|
19
20
|
references:
|
|
20
21
|
owasp_llm:
|
|
21
|
-
-
|
|
22
|
-
-
|
|
22
|
+
- "LLM06:2025 - Excessive Agency"
|
|
23
|
+
- "LLM10:2025 - Unbounded Consumption"
|
|
23
24
|
owasp_agentic:
|
|
24
|
-
-
|
|
25
|
+
- "ASI05:2026 - Unexpected Code Execution"
|
|
25
26
|
mitre_atlas:
|
|
26
|
-
-
|
|
27
|
-
-
|
|
27
|
+
- "AML.T0046 - Spamming ML System with Chaff Data"
|
|
28
|
+
- "AML.T0053 - LLM Plugin Compromise"
|
|
28
29
|
|
|
29
30
|
tags:
|
|
30
31
|
category: excessive-autonomy
|
|
31
32
|
subcategory: resource-exhaustion
|
|
33
|
+
scan_target: mcp
|
|
32
34
|
confidence: medium
|
|
33
35
|
|
|
34
36
|
agent_source:
|
|
@@ -43,57 +45,57 @@ detection:
|
|
|
43
45
|
- field: content
|
|
44
46
|
operator: regex
|
|
45
47
|
value: "(?i)SELECT\\s+\\*\\s+FROM\\s+\\w+(?:\\s*;|\\s*$|\\s+WHERE)(?!.*\\bLIMIT\\b)"
|
|
46
|
-
description:
|
|
48
|
+
description: "Unbounded SELECT * query without LIMIT clause"
|
|
47
49
|
- field: content
|
|
48
50
|
operator: regex
|
|
49
51
|
value: "(?i)(?:for\\s+each|iterate\\s+(?:over\\s+)?(?:all|every)|process\\s+(?:all|every|each)\\s+(?:record|row|entry|item|file|document))"
|
|
50
|
-
description:
|
|
52
|
+
description: "Bulk iteration directive over entire dataset"
|
|
51
53
|
- field: content
|
|
52
54
|
operator: regex
|
|
53
55
|
value: "(?i)(?:limit|max_results?|page_size|batch_size|count|top)\\s*[:=]\\s*(?:\\d{5,}|all|unlimited|-1|999+|MAX_INT|infinity)"
|
|
54
|
-
description:
|
|
56
|
+
description: "Excessively large or unbounded query parameters"
|
|
55
57
|
- field: content
|
|
56
58
|
operator: regex
|
|
57
59
|
value: "(?i)(?:delete\\s+(?:all|every|each)\\s+(?:files?|records?|entries|rows?|documents?)|rm\\s+-rf\\s+[/*]|truncate\\s+(?:all\\s+)?(?:tables?|data))"
|
|
58
|
-
description:
|
|
60
|
+
description: "Mass deletion or truncation operations"
|
|
59
61
|
- field: content
|
|
60
62
|
operator: regex
|
|
61
63
|
value: "(?i)(?:download(?:ing)?\\s+(?:all|every|the\\s+entire)|(?:fetch(?:ing)?|pull(?:ing)?|retriev(?:e|ing))\\s+(?:all|every|the\\s+complete|the\\s+entire)\\s+(?:dataset|database|table|collection|bucket))"
|
|
62
|
-
description:
|
|
64
|
+
description: "Bulk data download or retrieval of entire datasets"
|
|
63
65
|
- field: content
|
|
64
66
|
operator: regex
|
|
65
67
|
value: "(?i)(?:send\\s+(?:a\\s+)?(?:request|message|email|notification)\\s+to\\s+(?:all|every|each)\\s+(?:user|member|contact|subscriber|endpoint))"
|
|
66
|
-
description:
|
|
68
|
+
description: "Mass messaging or notification blast patterns"
|
|
67
69
|
- field: content
|
|
68
70
|
operator: regex
|
|
69
71
|
value: "(?i)(?:spawn(?:ing)?\\s+\\d{2,}\\s+(?:(?:concurrent|parallel|simultaneous)\\s+)?(?:threads?|processes?|workers?|instances?|tasks?|connections?)|(?:create|open|launch)\\s+\\d{2,}\\s+(?:concurrent|parallel|simultaneous))"
|
|
70
|
-
description:
|
|
72
|
+
description: "Spawning excessive concurrent processes or connections"
|
|
71
73
|
- field: content
|
|
72
74
|
operator: regex
|
|
73
75
|
value: "(?i)(?:while\\s*\\(\\s*true\\s*\\)|for\\s*\\(\\s*;\\s*;\\s*\\)|do\\s*\\{).*(?:fetch|request|call|query|send|write)"
|
|
74
|
-
description:
|
|
76
|
+
description: "Infinite loop with resource-consuming operations inside"
|
|
75
77
|
- field: content
|
|
76
78
|
operator: regex
|
|
77
79
|
value: "(?i)(?:(?:scrape|crawl|spider|harvest)\\s+(?:all|every|the\\s+entire)\\s+(?:site|website|domain|pages?)|recursive(?:ly)?\\s+(?:crawl|scrape|fetch|download))"
|
|
78
|
-
description:
|
|
80
|
+
description: "Unbounded web scraping or crawling operations"
|
|
79
81
|
- field: content
|
|
80
82
|
operator: regex
|
|
81
83
|
value: "(?i)(?:no\\s+(?:limit|cap|maximum|bound|restriction)\\s+(?:on|for)\\s+(?:requests?|queries|calls?|operations?|iterations?)|(?:unlimited|unbounded|uncapped)\\s+(?:requests?|queries|calls?|operations?))"
|
|
82
|
-
description:
|
|
84
|
+
description: "Explicit removal of rate limits or resource caps"
|
|
83
85
|
- field: content
|
|
84
86
|
operator: regex
|
|
85
87
|
value: "(?i)(?:process(?:ing)?\\s+(?:the\\s+)?(?:entire|full|complete|whole)\\s+(?:corpus|dataset|collection|index|archive)|scan(?:ning)?\\s+(?:all|every)\\s+\\d{4,}\\s+(?:records?|files?|entries))"
|
|
86
|
-
description:
|
|
88
|
+
description: "Full corpus processing or scanning massive datasets"
|
|
87
89
|
- field: content
|
|
88
90
|
operator: regex
|
|
89
91
|
value: "(?i)(?:copy\\s+(?:all|every|entire)\\s+(?:data|files?|records?|tables?)\\s+(?:to|into)|replicate\\s+(?:the\\s+)?(?:entire|full|complete)\\s+(?:database|dataset|collection))"
|
|
90
|
-
description:
|
|
92
|
+
description: "Mass data replication or copy operations"
|
|
91
93
|
condition: any
|
|
92
94
|
false_positives:
|
|
93
|
-
-
|
|
94
|
-
-
|
|
95
|
-
-
|
|
96
|
-
-
|
|
95
|
+
- "Authorized large-scale data processing or ETL pipeline agents"
|
|
96
|
+
- "Batch analysis tasks with expected high volume approved by admin"
|
|
97
|
+
- "Initial data ingestion or indexing operations with known high volume"
|
|
98
|
+
- "Database export operations authorized by data team"
|
|
97
99
|
|
|
98
100
|
response:
|
|
99
101
|
actions:
|
|
@@ -110,28 +112,28 @@ response:
|
|
|
110
112
|
|
|
111
113
|
test_cases:
|
|
112
114
|
true_positives:
|
|
113
|
-
- input:
|
|
115
|
+
- input: "SELECT * FROM transactions;"
|
|
114
116
|
expected: triggered
|
|
115
|
-
description:
|
|
116
|
-
- input:
|
|
117
|
+
description: "Unbounded SELECT query without LIMIT"
|
|
118
|
+
- input: "I will iterate over all 500000 records and process each one individually."
|
|
117
119
|
expected: triggered
|
|
118
|
-
description:
|
|
119
|
-
- input:
|
|
120
|
+
description: "Bulk iteration over massive dataset"
|
|
121
|
+
- input: "Setting batch_size=999999 and limit=unlimited for maximum throughput."
|
|
120
122
|
expected: triggered
|
|
121
|
-
description:
|
|
122
|
-
- input:
|
|
123
|
+
description: "Excessively large batch parameters"
|
|
124
|
+
- input: "Downloading all files from the S3 bucket. Fetching the entire dataset for local processing."
|
|
123
125
|
expected: triggered
|
|
124
|
-
description:
|
|
125
|
-
- input:
|
|
126
|
+
description: "Bulk data download of entire storage"
|
|
127
|
+
- input: "Spawning 50 concurrent workers to send requests to the API."
|
|
126
128
|
expected: triggered
|
|
127
|
-
description:
|
|
129
|
+
description: "Excessive concurrent process spawning"
|
|
128
130
|
true_negatives:
|
|
129
|
-
- input:
|
|
131
|
+
- input: "SELECT id, name FROM users WHERE active=true LIMIT 100;"
|
|
130
132
|
expected: not_triggered
|
|
131
|
-
description:
|
|
132
|
-
- input:
|
|
133
|
+
description: "Bounded query with column selection and LIMIT"
|
|
134
|
+
- input: "Processing the 25 records from the filtered result set."
|
|
133
135
|
expected: not_triggered
|
|
134
|
-
description:
|
|
135
|
-
- input:
|
|
136
|
+
description: "Processing a reasonably sized result set"
|
|
137
|
+
- input: "Fetching the first page of results with page_size=20."
|
|
136
138
|
expected: not_triggered
|
|
137
|
-
description:
|
|
139
|
+
description: "Paginated query with reasonable page size"
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
title:
|
|
2
|
-
id: ATR-2026-
|
|
1
|
+
title: "Cascading Failure Detection in Agent Pipelines"
|
|
2
|
+
id: ATR-2026-00052
|
|
3
|
+
rule_version: 1
|
|
3
4
|
status: experimental
|
|
4
5
|
description: |
|
|
5
6
|
Detects cascading failure patterns in automated agent pipelines where
|
|
@@ -10,26 +11,27 @@ description: |
|
|
|
10
11
|
incorrect signals. These patterns exploit the "trust the previous
|
|
11
12
|
stage" assumption in multi-step agent workflows.
|
|
12
13
|
Note: This rule detects textual descriptions of cascading failure patterns, not live cascading failures. Structural cascade prevention requires behavioral monitoring.
|
|
13
|
-
author:
|
|
14
|
-
date:
|
|
15
|
-
schema_version:
|
|
14
|
+
author: "ATR Community"
|
|
15
|
+
date: "2026/03/09"
|
|
16
|
+
schema_version: "0.1"
|
|
16
17
|
detection_tier: pattern
|
|
17
18
|
maturity: experimental
|
|
18
19
|
severity: high
|
|
19
20
|
|
|
20
21
|
references:
|
|
21
22
|
owasp_llm:
|
|
22
|
-
-
|
|
23
|
-
-
|
|
23
|
+
- "LLM06:2025 - Excessive Agency"
|
|
24
|
+
- "LLM05:2025 - Improper Output Handling"
|
|
24
25
|
owasp_agentic:
|
|
25
|
-
-
|
|
26
|
+
- "ASI08:2026 - Cascading Failures"
|
|
26
27
|
mitre_atlas:
|
|
27
|
-
-
|
|
28
|
-
-
|
|
28
|
+
- "AML.T0053 - LLM Plugin Compromise"
|
|
29
|
+
- "AML.T0046 - Spamming ML System with Chaff Data"
|
|
29
30
|
|
|
30
31
|
tags:
|
|
31
32
|
category: excessive-autonomy
|
|
32
33
|
subcategory: cascading-failure
|
|
34
|
+
scan_target: mcp
|
|
33
35
|
confidence: medium
|
|
34
36
|
|
|
35
37
|
agent_source:
|
|
@@ -44,53 +46,53 @@ detection:
|
|
|
44
46
|
- field: content
|
|
45
47
|
operator: regex
|
|
46
48
|
value: "(?i)auto[_-]?approv(?:ed|ing|al).{0,30}(?:without|no|skipping)\\s+(?:human|manual|review|check|verification|validation)"
|
|
47
|
-
description:
|
|
49
|
+
description: "Automated approval bypassing human review checkpoint"
|
|
48
50
|
- field: content
|
|
49
51
|
operator: regex
|
|
50
52
|
value: "(?i)(?:propagat(?:ed|ing)|forward(?:ed|ing)|pass(?:ed|ing))\\s+(?:error|failure|exception|fault)\\s+(?:to|through|downstream|to\\s+next\\s+(?:stage|step|agent))"
|
|
51
|
-
description:
|
|
53
|
+
description: "Error propagating downstream through pipeline stages"
|
|
52
54
|
- field: content
|
|
53
55
|
operator: regex
|
|
54
56
|
value: "(?i)(?:stage|step|phase)\\s+\\d+\\s+(?:failed|error|timed\\s+out).*(?:stage|step|phase)\\s+\\d+\\s+(?:also|subsequently|then)\\s+(?:failed|errored)"
|
|
55
|
-
description:
|
|
57
|
+
description: "Multiple pipeline stages failing in sequence"
|
|
56
58
|
- field: content
|
|
57
59
|
operator: regex
|
|
58
60
|
value: "(?i)(?:trusting|accepting|using)\\s+(?:previous|upstream|prior)\\s+(?:stage|step|agent)\\s+(?:output|result|response)\\s+(?:without|no)\\s+(?:validation|verification|check)"
|
|
59
|
-
description:
|
|
61
|
+
description: "Stage consuming upstream output without validation"
|
|
60
62
|
- field: content
|
|
61
63
|
operator: regex
|
|
62
64
|
value: "(?i)(?:rollback|revert|undo|destroy|delete|terminate)\\s+(?:all|everything|entire|production|live).{0,40}(?:based\\s+on|triggered\\s+by|due\\s+to)\\s+(?:automated|agent|AI|pipeline)"
|
|
63
|
-
description:
|
|
65
|
+
description: "Destructive action triggered by automated pipeline signal"
|
|
64
66
|
- field: content
|
|
65
67
|
operator: regex
|
|
66
68
|
value: "(?i)(?:amplif(?:ied|ying)|escalat(?:ed|ing)|magnif(?:ied|ying))\\s+(?:the\\s+)?(?:error|issue|problem|signal|impact|damage)\\s+(?:across|through|to)\\s+(?:multiple|all|downstream)"
|
|
67
|
-
description:
|
|
69
|
+
description: "Error amplification across multiple pipeline stages"
|
|
68
70
|
- field: content
|
|
69
71
|
operator: regex
|
|
70
72
|
value: "(?i)(?:no\\s+(?:human|manual)\\s+(?:in|checkpoint|review|gate|approval)\\s+(?:the|this)?\\s*(?:loop|pipeline|chain|workflow)|(?:fully|completely)\\s+automated\\s+(?:pipeline|workflow|chain)\\s+(?:with|including)\\s+(?:destructive|production|critical))"
|
|
71
|
-
description:
|
|
73
|
+
description: "Fully automated pipeline with no human-in-the-loop for critical actions"
|
|
72
74
|
- field: content
|
|
73
75
|
operator: regex
|
|
74
76
|
value: "(?i)(?:blind(?:ly)?|unconditional(?:ly)?|automatic(?:ally)?)\\s+(?:executing|running|applying|deploying).{0,60}(?:previous|upstream|AI|agent|automated)(?:\\s+(?:AI|agent|system|model))?"
|
|
75
|
-
description:
|
|
77
|
+
description: "Blind execution of upstream agent recommendations"
|
|
76
78
|
- field: content
|
|
77
79
|
operator: regex
|
|
78
80
|
value: "(?i)(?!(?:post[- ]?(?:incident|mortem)|review|analysis|report|last\\s+(?:week|month|time)|caused\\s+by|root\\s+cause|lessons?\\s+learned|investigation|retrospective).{0,80})(?:chain\\s+reaction|domino\\s+(?:effect|failure)|failure\\s+cascade|cascading\\s+(?:error|failure|shutdown|rollback))(?!.{0,80}(?:was\\s+caused\\s+by|root\\s+cause|post[- ]?(?:incident|mortem)|lessons?\\s+learned|last\\s+(?:week|month|time)))"
|
|
79
|
-
description:
|
|
81
|
+
description: "Explicit cascading failure terminology (excludes retrospective analysis context)"
|
|
80
82
|
- field: content
|
|
81
83
|
operator: regex
|
|
82
84
|
value: "(?i)(?:retry|fallback)\\s+(?:triggered|activated|initiated)\\s+(?:automatically|by\\s+(?:previous|upstream)).*(?:retry|fallback)\\s+(?:triggered|activated|initiated)"
|
|
83
|
-
description:
|
|
85
|
+
description: "Cascading retry/fallback loops across stages"
|
|
84
86
|
- field: content
|
|
85
87
|
operator: regex
|
|
86
88
|
value: "(?i)(?:all|every)\\s+\\d+\\s+(?:downstream|dependent|connected)\\s+(?:agents?|services?|stages?|steps?)\\s+(?:affected|impacted|failed|halted)"
|
|
87
|
-
description:
|
|
89
|
+
description: "Multiple downstream components affected by single failure"
|
|
88
90
|
condition: any
|
|
89
91
|
false_positives:
|
|
90
|
-
-
|
|
91
|
-
-
|
|
92
|
-
-
|
|
93
|
-
-
|
|
92
|
+
- "Legitimate pipeline monitoring reporting multi-stage errors for debugging"
|
|
93
|
+
- "Chaos engineering or fault injection testing in controlled environments"
|
|
94
|
+
- "Post-incident analysis discussing cascading failure root causes"
|
|
95
|
+
- "Circuit breaker implementations that intentionally detect cascade patterns"
|
|
94
96
|
|
|
95
97
|
response:
|
|
96
98
|
actions:
|
|
@@ -105,49 +107,49 @@ response:
|
|
|
105
107
|
|
|
106
108
|
test_cases:
|
|
107
109
|
true_positives:
|
|
108
|
-
- input:
|
|
110
|
+
- input: "Auto-approved deployment without human review based on AI test results. Pushing to production."
|
|
109
111
|
expected: triggered
|
|
110
|
-
description:
|
|
111
|
-
- input:
|
|
112
|
+
description: "Auto-approval bypassing human review for production deployment"
|
|
113
|
+
- input: "Stage 2 failed with timeout. Stage 3 also failed due to missing input from stage 2. Stage 4 subsequently failed."
|
|
112
114
|
expected: triggered
|
|
113
|
-
description:
|
|
114
|
-
- input:
|
|
115
|
+
description: "Sequential multi-stage pipeline failure cascade"
|
|
116
|
+
- input: "Rollback all production services triggered by automated monitoring agent alert."
|
|
115
117
|
expected: triggered
|
|
116
|
-
description:
|
|
117
|
-
- input:
|
|
118
|
+
description: "Destructive rollback triggered by automated signal"
|
|
119
|
+
- input: "Trusting previous stage output without validation. Proceeding to deploy the generated configuration."
|
|
118
120
|
expected: triggered
|
|
119
|
-
description:
|
|
120
|
-
- input:
|
|
121
|
+
description: "Pipeline stage consuming unvalidated upstream output"
|
|
122
|
+
- input: "Cascading failure detected: payment service down caused order service, notification service, and analytics to fail."
|
|
121
123
|
expected: triggered
|
|
122
|
-
description:
|
|
123
|
-
- input:
|
|
124
|
+
description: "Cascading failure across dependent services"
|
|
125
|
+
- input: "Fully automated pipeline with destructive teardown stage. No human in the loop for the delete operation."
|
|
124
126
|
expected: triggered
|
|
125
|
-
description:
|
|
126
|
-
- input:
|
|
127
|
+
description: "Fully automated pipeline with destructive actions and no human gate"
|
|
128
|
+
- input: "Blindly executing recommendations from upstream AI agent. Applying all suggested database schema changes."
|
|
127
129
|
expected: triggered
|
|
128
|
-
description:
|
|
129
|
-
- input:
|
|
130
|
+
description: "Blind execution of AI-generated database changes"
|
|
131
|
+
- input: "Retry triggered automatically by previous failure. Fallback triggered by retry timeout. Second fallback triggered."
|
|
130
132
|
expected: triggered
|
|
131
|
-
description:
|
|
132
|
-
- input:
|
|
133
|
+
description: "Cascading retry-fallback loop across stages"
|
|
134
|
+
- input: "Amplifying the error across all 12 downstream services. Impact spreading to production cluster."
|
|
133
135
|
expected: triggered
|
|
134
|
-
description:
|
|
135
|
-
- input:
|
|
136
|
+
description: "Error amplification across multiple downstream services"
|
|
137
|
+
- input: "All 8 dependent agents affected by the coordinator failure. Entire pipeline halted."
|
|
136
138
|
expected: triggered
|
|
137
|
-
description:
|
|
139
|
+
description: "Single failure impacting all downstream agents"
|
|
138
140
|
true_negatives:
|
|
139
|
-
- input:
|
|
141
|
+
- input: "Pipeline completed successfully. All 5 stages passed validation. Awaiting human approval for deployment."
|
|
140
142
|
expected: not_triggered
|
|
141
|
-
description:
|
|
142
|
-
- input:
|
|
143
|
+
description: "Normal pipeline completion with human approval gate"
|
|
144
|
+
- input: "Stage 3 encountered an error. Circuit breaker activated. Alerting on-call engineer for review."
|
|
143
145
|
expected: not_triggered
|
|
144
|
-
description:
|
|
145
|
-
- input:
|
|
146
|
+
description: "Proper circuit breaker stopping cascade and alerting human"
|
|
147
|
+
- input: "Running chaos engineering test: simulating stage 2 failure to verify pipeline resilience."
|
|
146
148
|
expected: not_triggered
|
|
147
|
-
description:
|
|
148
|
-
- input:
|
|
149
|
+
description: "Intentional fault injection for resilience testing"
|
|
150
|
+
- input: "Post-incident review: the cascading failure last week was caused by an unhandled null pointer in stage 1."
|
|
149
151
|
expected: not_triggered
|
|
150
|
-
description:
|
|
151
|
-
- input:
|
|
152
|
+
description: "Post-incident analysis discussing past cascade"
|
|
153
|
+
- input: "Automated tests passed. Sending results to reviewer for manual sign-off before merge."
|
|
152
154
|
expected: not_triggered
|
|
153
|
-
description:
|
|
155
|
+
description: "Automated tests with proper human-in-the-loop before action"
|