agent-threat-rules 3.5.10 → 3.5.11
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/package.json +1 -1
- package/rules/agent-manipulation/ATR-2026-00030-cross-agent-attack.yaml +10 -10
- package/rules/prompt-injection/ATR-2026-00001-direct-prompt-injection.yaml +22 -22
- package/rules/prompt-injection/ATR-2026-00002-indirect-prompt-injection.yaml +18 -4
- package/rules/tool-poisoning/ATR-2026-00010-mcp-malicious-response.yaml +16 -16
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-threat-rules",
|
|
3
|
-
"version": "3.5.
|
|
3
|
+
"version": "3.5.11",
|
|
4
4
|
"mcpName": "io.github.Agent-Threat-Rule/agent-threat-rules",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Open detection standard -- like Sigma, but for AI agents. 751 rules for prompt injection, tool poisoning, context exfiltration, and MCP attacks. Shipped in Cisco AI Defense. 97.2% recall on NVIDIA garak.",
|
|
@@ -118,24 +118,24 @@ detection:
|
|
|
118
118
|
description: "Agent claiming to be a privileged agent role"
|
|
119
119
|
- field: content
|
|
120
120
|
operator: regex
|
|
121
|
-
value: "(?i)(?:ignore|disregard|forget|override|overwrite)\\s+(?:all\\s+)?(?:your\\s+)?(?:previous|prior|above|earlier|existing)\\s+(?:instructions?|rules?|constraints?|guidelines?|prompt|directives?)"
|
|
122
|
-
description: "Instruction override attempt in inter-agent message"
|
|
121
|
+
value: "(?i)(?<![\"'`])(?:ignore|disregard|forget|override|overwrite)\\s+(?:all\\s+)?(?:your\\s+)?(?:previous|prior|above|earlier|existing)\\s+(?:instructions?|rules?|constraints?|guidelines?|prompt|directives?)"
|
|
122
|
+
description: "Instruction override attempt in inter-agent message (must be a live directive, not a quoted/listed mention in security docs — negative lookbehind excludes quote/backtick-prefixed occurrences)"
|
|
123
123
|
- field: content
|
|
124
124
|
operator: regex
|
|
125
|
-
value: "(?i)
|
|
126
|
-
description: "Fake system-level message tags in agent communication (common benign labels [SYSTEM]/[ADMIN]/[PRIORITY]/[URGENT] dropped; kept override/root/sudo tags and chat-template markers)"
|
|
125
|
+
value: "(?i)(?<![\"'`])(?<!:\\s)(?:\\[\\s*(?:OVERRIDE|ROOT|SUDO)\\s*\\]|<<\\s*SYS\\s*>>|<\\|im_start\\|>system)"
|
|
126
|
+
description: "Fake system-level message tags in agent communication (common benign labels [SYSTEM]/[ADMIN]/[PRIORITY]/[URGENT] dropped; kept override/root/sudo tags and chat-template markers). Negative lookbehinds require a live forged role marker: excludes quoted/backticked doc references and YAML/JSON mapping values (parent_ids: [root])"
|
|
127
127
|
- field: content
|
|
128
128
|
operator: regex
|
|
129
|
-
value: "(?i)(?:new\\s+instructions?|updated\\s+(?:prompt|directive)|revised\\s+(?:rules?|orders?)|emergency\\s+(?:override|protocol))\\s*[:=]"
|
|
130
|
-
description: "Attempt to inject new instructions via agent messages"
|
|
129
|
+
value: "(?i)(?<![\"'`])(?:new\\s+instructions?|updated\\s+(?:prompt|directive)|revised\\s+(?:rules?|orders?)|emergency\\s+(?:override|protocol))\\s*[:=]"
|
|
130
|
+
description: "Attempt to inject new instructions via agent messages (live directive only; negative lookbehind excludes quoted/listed occurrences in prompt-injection detection docs)"
|
|
131
131
|
- field: content
|
|
132
132
|
operator: regex
|
|
133
133
|
value: "(?i)(?:you\\s+are\\s+now|from\\s+now\\s+on|henceforth|going\\s+forward|effective\\s+immediately)\\s+(?:a|an|the)?\\s*(?:unrestricted|unfiltered|jailbroken)?\\s*[a-zA-Z]+\\s+(?:agent|assistant|bot)"
|
|
134
134
|
description: "Attempt to redefine target agent's identity or role"
|
|
135
135
|
- field: content
|
|
136
136
|
operator: regex
|
|
137
|
-
value: "(?i)(?:do\\s+not|don'?t|never)\\s+(?:tell|inform|alert|notify|report|mention|log|record)\\s+(?:the\\s+)?(?:user|admin|orchestrator|supervisor|human|monitor)"
|
|
138
|
-
description: "Instruction to hide actions from oversight"
|
|
137
|
+
value: "(?i)(?:do\\s+not|don'?t|never)\\s+(?:tell|inform|alert|notify|report|mention|log|record)\\s+(?:the\\s+)?(?:user|admin|orchestrator|supervisor|human|monitor)(?!s?\\s+to\\b)"
|
|
138
|
+
description: "Instruction to hide actions from oversight (excludes benign coaching form 'never tell users to <verb>' via negative lookahead; keeps concealment form 'do not tell the user about <info>')"
|
|
139
139
|
- field: content
|
|
140
140
|
operator: regex
|
|
141
141
|
value: "(?i)(?:acting|speaking|operating)\\s+(?:on\\s+behalf\\s+of|as\\s+a?\\s*proxy\\s+for|in\\s+place\\s+of)\\s+[a-zA-Z0-9_-]+\\s*(?:agent)?"
|
|
@@ -146,8 +146,8 @@ detection:
|
|
|
146
146
|
description: "Explicit attempt to override identity or permissions"
|
|
147
147
|
- field: content
|
|
148
148
|
operator: regex
|
|
149
|
-
value: "(?i)(?:status|error|result)\\s*[:=]\\s*(?:failed|error|timeout|unauthorized)
|
|
150
|
-
description: "Fake error or status injection to trigger fallback behavior"
|
|
149
|
+
value: "(?i)(?:status|error|result)\\s*[:=]\\s*(?:failed|error|timeout|unauthorized).{0,80}(?:fallback|use\\s+alternative|switch\\s+to)"
|
|
150
|
+
description: "Fake error or status injection to trigger fallback behavior (requires a behavior-redirect directive fallback/switch-to/use-alternative within 80 chars; bare 'retry' dropped as it matches benign error-handling prose)"
|
|
151
151
|
- field: content
|
|
152
152
|
operator: regex
|
|
153
153
|
value: "(?i)(?:message_type|msg_type)\\s*[:=]\\s*[\"']?(?:admin|orchestrator|supervisor|root)[\"']?"
|
|
@@ -98,8 +98,8 @@ detection:
|
|
|
98
98
|
# "ignore your instructions", "ignore any instructions", "ignore all instructions"
|
|
99
99
|
- field: user_input
|
|
100
100
|
operator: regex
|
|
101
|
-
value: "(?i)\\b(ignore|disregard|forget|override|bypass|suppress|discard)\\s+(all\\s+)
|
|
102
|
-
description: "Instruction override with broad verb
|
|
101
|
+
value: "(?i)\\b(ignore|disregard|forget|override|bypass|suppress|discard)\\s+(?:(?:all|the|any|these|those)\\s+)*(?:(?:your|my)\\s+|(?:previous|prior|above|earlier|preceding|original|existing|current|initial|default|given|assigned|preset|established)\\s+)(?:(?:previous|prior|above|earlier|preceding|original|existing|current|initial|default|given|assigned|preset|established)\\s+)?(instructions?|prompts?|rules?|guidelines?|directives?|constraints?|context|programming|training|protocols?|policies|configuration|parameters|boundaries|guardrails?|safeguards?|restrictions?|tasks?|assignments?|information|directions?|orders?|commands?)"
|
|
102
|
+
description: "Instruction override with broad verb/noun coverage, requiring a directed anchor (your/my or a prior-state adjective) so benign 'ignore rules'/'override these guidelines' prose does not match"
|
|
103
103
|
|
|
104
104
|
# -- Layer 1b: Forget-everything / forget-all shorthand --
|
|
105
105
|
- field: user_input
|
|
@@ -116,8 +116,8 @@ detection:
|
|
|
116
116
|
# -- Layer 1d: Broad forget/ignore + everything/that/this --
|
|
117
117
|
- field: user_input
|
|
118
118
|
operator: regex
|
|
119
|
-
value: "(?i)\\b(forget|ignore|disregard|discard)\\s+(about\\s+)?(everything|all|that|this|what\\s+was|what\\s+I|anything\\s+you)\\s
|
|
120
|
-
description: "
|
|
119
|
+
value: "(?i)\\b(forget|ignore|disregard|discard)\\s+(about\\s+)?(everything|all|that|this|what\\s+was|what\\s+I|anything\\s+you)\\s+(previously|before|earlier|said|told|above|prior|mentioned|instructed)"
|
|
120
|
+
description: "Forget-everything variants, requiring a trailing prior-context anchor so benign 'ignore all warnings'/'discard this file' prose does not match"
|
|
121
121
|
|
|
122
122
|
# -- Layer 1g: Bare ignore/forget + above/before + action --
|
|
123
123
|
- field: user_input
|
|
@@ -128,8 +128,8 @@ detection:
|
|
|
128
128
|
# -- Layer 1e: System prompt extraction --
|
|
129
129
|
- field: user_input
|
|
130
130
|
operator: regex
|
|
131
|
-
value: "(?i)(reveal|show|display|output|print|repeat|provide|give|share|tell|what\\s+are|what\\s+were|what\\s+is)\\s+(me\\s+)?(your|the|all)\\s+(secret|hidden|internal|system|original|previous|initial|complete|full|given|guard|entire)
|
|
132
|
-
description: "System prompt
|
|
131
|
+
value: "(?i)(reveal|show|display|output|print|repeat|provide|give|share|tell|what\\s+are|what\\s+were|what\\s+is)\\s+(me\\s+)?(?:(your|my)\\s+((secret|hidden|internal|system|original|previous|initial|complete|full|given|guard|entire)\\s+)?|(the|all)\\s+(secret|hidden|internal|system|original|previous|initial|complete|full|given|guard|entire)\\s+)(instructions?|prompts?|passwords?|secrets?|embeddings?|configuration|directives?|guidelines?|rules)"
|
|
132
|
+
description: "System prompt/secret extraction, requiring possessive (your/my) or a sensitive adjective so benign 'show the prompt'/'what are the rules' prose does not match"
|
|
133
133
|
|
|
134
134
|
# -- Layer 1f: Contextual task switching with praise prefix --
|
|
135
135
|
- field: user_input
|
|
@@ -140,8 +140,8 @@ detection:
|
|
|
140
140
|
# -- Layer 1h: Leave behind / start fresh context switch --
|
|
141
141
|
- field: user_input
|
|
142
142
|
operator: regex
|
|
143
|
-
value: "(?i)(leave|put)\\s+(all\\s+)?(the\\s+)?(previous|prior|earlier|old)\\s+(information|tasks?|instructions?|context)\\s+(behind|aside|away)|start\\s+(from\\s+the\\s+)?(
|
|
144
|
-
description: "Leave-behind / start-fresh context switch
|
|
143
|
+
value: "(?i)(leave|put)\\s+(all\\s+)?(the\\s+)?(previous|prior|earlier|old)\\s+(information|tasks?|instructions?|context)\\s+(behind|aside|away)|start\\s+(over|fresh|anew|from\\s+(the\\s+)?(scratch|zero|beginning|front))\\s+(with\\s+(a\\s+)?new\\s+(task|instructions?|persona|role|prompt)|and\\s+(ignore|forget|disregard))"
|
|
144
|
+
description: "Leave-behind / start-fresh context switch, requiring the fresh-start to redirect to a new task or an override so benign 'start from the beginning' prose does not match"
|
|
145
145
|
|
|
146
146
|
# -- Layer 1i: German praise-then-redirect extended --
|
|
147
147
|
- field: user_input
|
|
@@ -152,8 +152,8 @@ detection:
|
|
|
152
152
|
# -- Layer 2: Persona switching / identity hijacking --
|
|
153
153
|
- field: user_input
|
|
154
154
|
operator: regex
|
|
155
|
-
value: "(?i)\\b(you\\s+are\\s+now|you\\s+have\\s+become|you\\s+will\\s+act\\s+as|you\\s+shall\\s+be|transform\\s+into|switch\\s+to\\s+being|morph\\s+into|adopt\\s+the\\s+persona|now\\s+you\\s+are|jetzt\\s+bist\\s+du|du\\s+bist\\s+(jetzt|nun)|stell\\s+dir\\s+vor\\s+du\\s+bist)\\s+(a|an|the|my|ein[ea]?)?\\s*[a-zA-Z\\u00C0-\\u024F]+"
|
|
156
|
-
description: "Persona switching
|
|
155
|
+
value: "(?i)\\b(you\\s+are\\s+now|you\\s+have\\s+become|you\\s+will\\s+act\\s+as|you\\s+shall\\s+be|transform\\s+into|switch\\s+to\\s+being|morph\\s+into|adopt\\s+the\\s+persona|now\\s+you\\s+are|jetzt\\s+bist\\s+du|du\\s+bist\\s+(jetzt|nun)|stell\\s+dir\\s+vor\\s+du\\s+bist)\\s+(a|an|the|my|ein[ea]?)?\\s*(?:(unrestricted|unfiltered|uncensored|unlimited|unbound|unchained|jailbroken|jailbreak|evil|malicious|rogue|amoral|immoral|unethical|lawless|god[- ]?mode|developer\\s+mode|hacker|villain|DAN|STAN|dark\\s+[a-z]+)\\b|[a-zA-Z\\u00C0-\\u024F]+\\s+(?:with\\s+no|without\\s+(?:any\\s+)?)\\s*(restrictions?|limits?|limitations?|filters?|rules?|guidelines?|safety|guardrails?|morals?|ethics?|boundaries))"
|
|
156
|
+
description: "Persona switching to an adversarial identity (jailbreak/harmful persona lexicon or an explicit 'without restrictions' identity) so benign 'you are now an expert'/'transform into an X' prose does not match"
|
|
157
157
|
|
|
158
158
|
# -- Layer 2b: Act-as roleplay with task assignment --
|
|
159
159
|
- field: user_input
|
|
@@ -182,14 +182,14 @@ detection:
|
|
|
182
182
|
# -- Layer 4: Do-not-follow-rules patterns --
|
|
183
183
|
- field: user_input
|
|
184
184
|
operator: regex
|
|
185
|
-
value: "(?i)(do\\s+not|don'?t|never|stop|cease|quit|refuse\\s+to)\\s+(follow|obey|adhere\\s+to|comply\\s+with|respect|honor|enforce|apply|observe|uphold)\\s+(your|
|
|
186
|
-
description: "Negation-verb patterns telling agent to stop following rules"
|
|
185
|
+
value: "(?i)(do\\s+not|don'?t|never|stop|cease|quit|refuse\\s+to)\\s+(follow|obey|adhere\\s+to|comply\\s+with|respect|honor|enforce|apply|observe|uphold)\\s+(your|all\\s+your|any\\s+of\\s+your|those|these)\\s+(instructions?|rules?|guidelines?|programming|training|protocols?|policies|directives?|constraints?|boundaries|restrictions?)"
|
|
186
|
+
description: "Negation-verb patterns telling agent to stop following its OWN rules (anchored on your/those/these) so benign 'do not follow any instructions from it' guidance does not match"
|
|
187
187
|
|
|
188
188
|
# -- Layer 5: New instruction assignment --
|
|
189
189
|
- field: user_input
|
|
190
190
|
operator: regex
|
|
191
|
-
value: "(?i)\\b(new|updated|revised|replacement|corrected|actual|real|true|overriding)\\s+(instructions?|rules?|directives?|guidelines?|orders?|commands?)\\s*[
|
|
192
|
-
description: "New
|
|
191
|
+
value: "(?i)\\b(new|updated|revised|replacement|corrected|actual|real|true|overriding)\\s+(instructions?|rules?|directives?|guidelines?|orders?|commands?)\\s*[:=]\\s*(?=.{0,25}(ignore|disregard|forget|reveal|disclose|print|output|say|tell|respond|reply|write|execute|run|follow|act\\s+as|do\\s+not|don'?t|send|comply|obey|override|bypass|stop|now\\b|you\\s+(must|will|are|should)))"
|
|
192
|
+
description: "New-instruction assignment, requiring the payload after the delimiter to be an AI-directed imperative so benign 'New instructions:' headings / bullet lists do not match"
|
|
193
193
|
|
|
194
194
|
# -- Layer 6: Temporal behavioral override --
|
|
195
195
|
- field: user_input
|
|
@@ -200,8 +200,8 @@ detection:
|
|
|
200
200
|
# -- Layer 7: Fake system/instruction delimiters --
|
|
201
201
|
- field: user_input
|
|
202
202
|
operator: regex
|
|
203
|
-
value: "(
|
|
204
|
-
description: "Fake system-level delimiter tags"
|
|
203
|
+
value: "(\\[\\s*(SYSTEM|INST|SYS|ADMIN|ROOT|OVERRIDE)\\s*\\]|<<\\s*(SYS|SYSTEM|INST)\\s*>>|\\{\\{\\s*(SYSTEM|INSTRUCTION|OVERRIDE)\\s*\\}\\})"
|
|
204
|
+
description: "Fake system-level delimiter tags (case-sensitive uppercase; dropped generic words CONTROL/PRIORITY/URGENT/INSTRUCTION-bracket that appear as benign template labels)"
|
|
205
205
|
|
|
206
206
|
# -- Layer 8: Restriction removal via pretend/imagine --
|
|
207
207
|
- field: user_input
|
|
@@ -212,14 +212,14 @@ detection:
|
|
|
212
212
|
# -- Layer 9: Compliance demands --
|
|
213
213
|
- field: user_input
|
|
214
214
|
operator: regex
|
|
215
|
-
value: "(?i)\\b(you\\s+(must|shall|will|need\\s+to|have\\s+to|are\\s+(required|obligated|commanded|ordered)\\s+to)\\s+(obey|comply|listen|submit|respond\\s+to|follow)\\s+(me|my
|
|
216
|
-
description: "Authoritative compliance demands"
|
|
215
|
+
value: "(?i)\\b(you\\s+(must|shall|will|need\\s+to|have\\s+to|are\\s+(required|obligated|commanded|ordered)\\s+to)\\s+(obey|comply|listen|submit|respond\\s+to|follow)\\s+(me|my)\\b|I\\s+(command|order|demand|direct|instruct|require)\\s+you\\s+to)\\b"
|
|
216
|
+
description: "Authoritative compliance demands, anchored on me/my so benign 'you must follow these steps' prose does not match"
|
|
217
217
|
|
|
218
218
|
# -- Layer 10: Base64-encoded injection indicators --
|
|
219
219
|
- field: user_input
|
|
220
220
|
operator: regex
|
|
221
|
-
value: "(?i)(decode|interpret|
|
|
222
|
-
description: "Instructions to decode
|
|
221
|
+
value: "(?i)(decode|interpret|base64\\s*[-\\s]?decode)\\s+(this|the\\s+following|and\\s+(?:execute|run|follow))?\\s*:?\\s*[A-Za-z0-9+/]{24,}={0,2}"
|
|
222
|
+
description: "Instructions to decode/interpret base64 payloads (narrowed verbs to decode/interpret so benign 'run <longIdentifier>' / 'read <token>' code prose does not match; known base64 keyword fragments still covered by Layer 11)"
|
|
223
223
|
|
|
224
224
|
# -- Layer 11: Known base64 fragments of injection keywords --
|
|
225
225
|
- field: user_input
|
|
@@ -254,8 +254,8 @@ detection:
|
|
|
254
254
|
# -- Layer 14c: Stop-write / stop-say command injection --
|
|
255
255
|
- field: user_input
|
|
256
256
|
operator: regex
|
|
257
|
-
value: "(?i)\\bstop\\s*[
|
|
258
|
-
description: "Stop-and-redirect command injection (stop: write X)"
|
|
257
|
+
value: "(?i)\\bstop\\s*[-:,]?\\s*(write|say|print|output)\\s*[:,-]?\\s+[A-Z].{2,40}"
|
|
258
|
+
description: "Stop-and-redirect command injection (stop: write X); dropped '.' connector so a sentence boundary 'STOP. Write the formula instead.' does not match"
|
|
259
259
|
|
|
260
260
|
# -- Layer 15: Markdown/formatting abuse to hide injections --
|
|
261
261
|
- field: user_input
|
|
@@ -97,9 +97,12 @@ agent_source:
|
|
|
97
97
|
detection:
|
|
98
98
|
conditions:
|
|
99
99
|
# -- Layer 1: HTML comments containing injection-like instructions --
|
|
100
|
+
# ignore/disregard/forget/override require a directive OBJECT (instruction/prompt/rule/...)
|
|
101
|
+
# so tooling pragmas ("<!-- prettier-ignore -->") and CSS labels ("<!-- Style override -->")
|
|
102
|
+
# do not match; multi-word directives (system:, you must, new instructions) stay as-is.
|
|
100
103
|
- field: content
|
|
101
104
|
operator: regex
|
|
102
|
-
value: "(?i)<!--[^>]{0,20}(ignore|disregard|override|new\\s+instructions?|system\\s*:|you\\s+must|you\\s+are\\s+now|
|
|
105
|
+
value: "(?i)<!--[^>]{0,20}((ignore|disregard|forget|override)\\s+(all\\s+|any\\s+|the\\s+|your\\s+)?(previous\\s+|prior\\s+|above\\s+|earlier\\s+|preceding\\s+|current\\s+)?(instruction|prompt|rule|guideline|direction|context|command|message|safety|system)|new\\s+instructions?|system\\s*:|you\\s+must|you\\s+are\\s+now|send\\s+to|exfiltrate|reveal|disclose|output\\s+the|execute|perform)[^>]{0,200}-->"
|
|
103
106
|
description: "HTML comments with instruction-like content targeting the agent"
|
|
104
107
|
|
|
105
108
|
# -- Layer 2: Zero-width character sequences (5+ consecutive to avoid multilingual FP) --
|
|
@@ -108,11 +111,22 @@ detection:
|
|
|
108
111
|
value: "[\\u200B\\u200C\\u200D\\uFEFF\\u2060\\u180E\\u200E\\u200F\\u202A-\\u202E\\u2066-\\u2069]{5,}"
|
|
109
112
|
description: "5+ consecutive zero-width or bidirectional control characters indicating obfuscation"
|
|
110
113
|
|
|
111
|
-
# -- Layer
|
|
114
|
+
# -- Layer 3a: Instruction-wrapper tokens (strong signal, rarely benign) --
|
|
115
|
+
# These delimiters wrap an injected instruction block; bare presence in consumed
|
|
116
|
+
# content is a reliable indicator (matches Llama [INST]/<<SYS>> injection).
|
|
112
117
|
- field: content
|
|
113
118
|
operator: regex
|
|
114
|
-
value: "(?i)(\\[INST\\]|\\[/INST\\]|\\[
|
|
115
|
-
description: "
|
|
119
|
+
value: "(?i)(\\[INST\\]|\\[/INST\\]|\\[HIDDEN\\]|<s>\\[INST\\]|<<SYS>>|<</SYS>>)"
|
|
120
|
+
description: "Instruction-wrapper tokens delimiting an injected instruction block"
|
|
121
|
+
|
|
122
|
+
# -- Layer 3b: ChatML/role/tokenizer tokens WITH an adjacent injection directive --
|
|
123
|
+
# Bare ChatML/tokenizer token names (<|im_start|>, <|endoftext|>, <|system|>, [SYSTEM])
|
|
124
|
+
# appear constantly in legitimate LLM/tokenizer documentation, so they only fire when
|
|
125
|
+
# followed within a short window by an actual override/jailbreak directive.
|
|
126
|
+
- field: content
|
|
127
|
+
operator: regex
|
|
128
|
+
value: "(?i)(\\[SYSTEM\\]|\\[/SYSTEM\\]|<\\|im_start\\|>|<\\|im_end\\|>|<\\|endoftext\\|>|<\\|system\\|>|<\\|user\\|>|<\\|assistant\\|>|<\\|pad\\|>|<\\|begin_of_text\\|>|<\\|eot_id\\|>|<\\|start_header_id\\|>)[\\s\\S]{0,120}(ignore\\s+(all|any|previous|prior|above|your)|disregard\\s+(all|any|previous|prior|above)|you\\s+are\\s+now\\s+|forget\\s+(all|previous|prior|everything)|reveal\\s+(the\\s+)?(system|prompt|key|secret)|exfiltrate|jailbreak|unrestricted\\s+assistant|do\\s+anything\\s+now|new\\s+instructions?|override\\s+(the\\s+)?(system|safety|previous|all))"
|
|
129
|
+
description: "ChatML/role/tokenizer tokens paired with an adjacent injection directive"
|
|
116
130
|
|
|
117
131
|
# -- Layer 4: CSS-hidden text combined with injection keywords --
|
|
118
132
|
- field: content
|
|
@@ -110,8 +110,8 @@ detection:
|
|
|
110
110
|
# -- Layer 1: Destructive shell commands --
|
|
111
111
|
- field: tool_response
|
|
112
112
|
operator: regex
|
|
113
|
-
value: "(?i)(\\brm\\s+-[rRf]{1,3}\\s+(--no-preserve-root|/[\\s*]|/$|~[\\s/])|\\bmkfs\\b|\\bdd\\s+if
|
|
114
|
-
description: "Destructive filesystem commands including fork bombs (rm -rf narrowed to root/home targets; benign rm -rf <dir> no longer fires)"
|
|
113
|
+
value: "(?i)(\\brm\\s+-[rRf]{1,3}\\s+(--no-preserve-root|/[\\s*]|/$|~[\\s/])|\\bmkfs\\b|\\bdd\\s+if=[^\\n|;]{0,80}of=\\s*/dev/|\\bformat\\s+[a-z]:|\\bdeltree\\b|\\bshred\\s+-|\\bwipefs\\b|\\bfdisk\\b.*--delete|:\\(\\)\\s*\\{\\s*:\\|:\\s*&\\s*\\})"
|
|
114
|
+
description: "Destructive filesystem commands including fork bombs (rm -rf narrowed to root/home targets; benign rm -rf <dir> no longer fires). dd narrowed to writes onto a raw /dev/ device (of=/dev/...) — benign forensic imaging that reads a device INTO a file no longer fires"
|
|
115
115
|
|
|
116
116
|
# -- Layer 2: Command execution via interpreters --
|
|
117
117
|
- field: tool_response
|
|
@@ -122,14 +122,14 @@ detection:
|
|
|
122
122
|
# -- Layer 3: Reverse shells (Unix) --
|
|
123
123
|
- field: tool_response
|
|
124
124
|
operator: regex
|
|
125
|
-
value: "(?i)(\\bnc\\s+-(e|c|l)\\s|\\bncat\\s
|
|
126
|
-
description: "Unix reverse shell patterns (
|
|
125
|
+
value: "(?i)(\\bnc\\s+-(e|c|l)\\s|\\bncat\\s+-|/dev/tcp/|\\bbash\\s+-i\\s+>&\\s*/dev/tcp|\\bmkfifo\\b.{0,40}\\bnc\\b|\\bsocat\\b.{0,40}(exec|pty|tcp)|\\brm\\s+/tmp/f\\s*;)"
|
|
126
|
+
description: "Unix reverse shell patterns (bash /dev/tcp, socat exec, fifo). netcat/ncat tightened to a flagged invocation (ncat -...) — the bare English word 'Netcat'/'Ncat' in pentest prose no longer fires"
|
|
127
127
|
|
|
128
128
|
# -- Layer 4: Download-and-execute (pipe to shell) --
|
|
129
129
|
- field: tool_response
|
|
130
130
|
operator: regex
|
|
131
|
-
value: "(?i)(curl|wget|fetch|lwp-download|aria2c|invoke-webrequest|iwr|Invoke-RestMethod|irm)\\s+[^|]{0,200}(https?://\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|http
|
|
132
|
-
description: "Download-and-execute pipe to shell, narrowed to malicious-leaning sources (raw IP, plain http://,
|
|
131
|
+
value: "(?i)(curl|wget|fetch|lwp-download|aria2c|invoke-webrequest|iwr|Invoke-RestMethod|irm)\\s+[^|]{0,200}(https?://\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|http://(?!localhost|127\\.|0\\.0\\.0\\.0|\\[::1\\])|@)[^|]{0,120}\\|\\s*(bash|sh|zsh|python[23]?|perl|ruby|node|powershell|pwsh|cmd|source)"
|
|
132
|
+
description: "Download-and-execute pipe to shell, narrowed to malicious-leaning sources (raw IP, plain external http://, or userinfo@ URL). Benign https://official-domain installer pipes, http://localhost health-check/deploy pipes, and shell-variable-authenticated API calls piped to a parser no longer auto-block (dual-use idioms)"
|
|
133
133
|
|
|
134
134
|
# -- Layer 5: Command substitution with dangerous commands --
|
|
135
135
|
# NOTE (v2): the legacy backtick form `...` was removed — it is indistinguishable
|
|
@@ -170,38 +170,38 @@ detection:
|
|
|
170
170
|
# -- Layer 10: PowerShell attack patterns --
|
|
171
171
|
- field: tool_response
|
|
172
172
|
operator: regex
|
|
173
|
-
value: "(?i)(\\bIEX\\s*\\(|\\bInvoke-Expression|\\bInvoke-Command|\\bInvoke-WmiMethod|\\b-EncodedCommand\\b|\\bNew-Object\\s+Net\\.WebClient|\\bDownloadString\\s*\\(
|
|
173
|
+
value: "(?i)(\\bIEX\\s*\\(|\\bInvoke-Expression|\\bInvoke-Command|\\bInvoke-WmiMethod|\\b-EncodedCommand\\b|\\bNew-Object\\s+Net\\.WebClient|\\bDownloadString\\s*\\(\\s*['\\\"]?https?://|\\bDownloadFile\\s*\\(\\s*['\\\"]?https?://|\\bStart-Process\\b.{0,60}\\b-Verb\\s+RunAs|\\bSet-MpPreference\\s+-Disable|\\bAdd-MpPreference\\s+-ExclusionPath|\\bNet\\.Sockets\\.TCPClient)"
|
|
174
174
|
description: "PowerShell-specific attack patterns (IEX, download cradles, AV bypass)"
|
|
175
175
|
|
|
176
176
|
# -- Layer 11: Python reverse shells and code execution --
|
|
177
177
|
- field: tool_response
|
|
178
178
|
operator: regex
|
|
179
|
-
value: "(?i)(python[23]?\\s+-c\\s+['\"]import\\s+(socket|subprocess|os|pty)|import\\s+socket\\s*;\\s*import\\s+subprocess|socket\\.socket\\(socket\\.AF_INET|os\\.(popen|system|exec[lv]p?)\\s*\\(|subprocess\\.(call|run|Popen|check_output)\\s*\\(.{0,60}(sh|bash|cmd
|
|
180
|
-
description: "Python reverse shells and dangerous code execution
|
|
179
|
+
value: "(?i)(python[23]?\\s+-c\\s+['\"]import\\s+(socket|subprocess|os|pty)|import\\s+socket\\s*;\\s*import\\s+subprocess|socket\\.socket\\(socket\\.AF_INET|os\\.(popen|system|exec[lv]p?)\\s*\\(\\s*[^)]{0,140}(\\||;|\\$\\(|&&|\\bcurl\\b|\\bwget\\b|/dev/tcp|bash\\s+-i|/bin/(ba)?sh\\b)|subprocess\\.(call|run|Popen|check_output)\\s*\\(.{0,60}['\"/](sh|bash|zsh|cmd(\\.exe)?|powershell)\\b|pty\\.spawn\\s*\\()"
|
|
180
|
+
description: "Python reverse shells and dangerous code execution. os.system/os.popen/os.exec narrowed to arguments carrying a shell-injection indicator (pipe, semicolon, command substitution, curl/wget, /dev/tcp, bash -i, /bin/sh) — bare os.system('clear')/os.popen('git ...') and semgrep pattern-references no longer fire. subprocess shell match requires a quoted or path-prefixed shell literal (\"bash\", '/bin/sh', \"cmd.exe\") — the bare metavariable/variable names $CMD and cmd, 'shell=False', and '/tmp/screenshot' no longer match"
|
|
181
181
|
|
|
182
182
|
# -- Layer 12: Node.js reverse shells --
|
|
183
183
|
- field: tool_response
|
|
184
184
|
operator: regex
|
|
185
|
-
value: "(?i)(require\\s*\\(\\s*['\"]child_process['\"]\\s*\\)|child_process\\.exec(Sync)?\\s*\\(|require\\s*\\(\\s*['\"]net['\"]\\s*\\).{0,100}connect|new\\s+net\\.Socket\\s*\\(|process\\.mainModule\\.require)"
|
|
186
|
-
description: "Node.js reverse shells and child_process command execution"
|
|
185
|
+
value: "(?i)(require\\s*\\(\\s*['\"]child_process['\"]\\s*\\)\\s*\\.\\s*(exec|execSync|spawn|spawnSync)|child_process\\.exec(Sync)?\\s*\\(\\s*[^)]{0,140}(\\||;|\\$\\(|`|&&|\\bcurl\\b|\\bwget\\b|/dev/tcp|/bin/(ba)?sh\\b|\\bnc\\s+-)|require\\s*\\(\\s*['\"]net['\"]\\s*\\).{0,100}connect|new\\s+net\\.Socket\\s*\\(|process\\.mainModule\\.require)"
|
|
186
|
+
description: "Node.js reverse shells and child_process command execution. require('child_process') narrowed to an immediately-chained .exec/.spawn (a bare import for benign tooling no longer fires); child_process.exec(...) narrowed to a shell-injection indicator in the argument (pipe, semicolon, command-substitution/backtick, curl/wget, /dev/tcp, /bin/sh, nc) — benign fixed-command execs like exec('tsserver')/execSync('npm test') no longer fire"
|
|
187
187
|
|
|
188
188
|
# -- Layer 13: Prompt injection within tool response --
|
|
189
189
|
- field: tool_response
|
|
190
190
|
operator: regex
|
|
191
|
-
value: "(?i)(ignore\\s+(all\\s+)?(previous|prior|your)\\s+(instructions?|rules?|guidelines?|prompts?)|you\\s+are\\s+now\\s+(a|an|the)|new\\s+system\\s+(prompt|instructions?)\\s*:|disregard\\s+(all\\s+)?(previous|prior|your)|override\\s+(all\\s+)?(previous|prior|your|the)\\s+(instructions?|rules?|safety)|from\\s+now\\s+on,?\\s+you\\s+(are|will|must|should))"
|
|
191
|
+
value: "(?i)(ignore\\s+(all\\s+)?(previous|prior|your)\\s+(instructions?|rules?|guidelines?|prompts?)|you\\s+are\\s+now\\s+(a|an|the)\\s+(admin|root|developer|dan\\b|unrestricted|unfiltered|jailbroken|different|new\\s+(ai|assistant|persona|model|bot)|evil|malicious|rogue|hacker|god)|new\\s+system\\s+(prompt|instructions?)\\s*:|disregard\\s+(all\\s+)?(previous|prior|your)|override\\s+(all\\s+)?(previous|prior|your|the)\\s+(instructions?|rules?|safety)|from\\s+now\\s+on,?\\s+you\\s+(are|will|must|should))"
|
|
192
192
|
description: "Prompt injection payloads embedded in tool response content"
|
|
193
193
|
|
|
194
194
|
# -- Layer 14: Data exfiltration via tool response --
|
|
195
195
|
- field: tool_response
|
|
196
196
|
operator: regex
|
|
197
|
-
value: "(?i)(curl|wget)\\s+[^|\\n]{0,140}\\$\\(\\s*(cat|env|printenv|security\\s+find-generic|aws\\s+configure\\s+get)\\b"
|
|
198
|
-
description: "Data exfiltration: a download tool reading secrets via command substitution ($(cat ~/.aws
|
|
197
|
+
value: "(?i)(curl|wget)\\s+[^|\\n]{0,140}\\$\\(\\s*(cat\\s+[^)]{0,80}(\\.ssh|\\.aws|id_rsa|id_ed25519|\\.pem|/etc/passwd|/etc/shadow|credentials|\\.env)|(env|printenv|security\\s+find-generic|aws\\s+configure\\s+get)\\b)"
|
|
198
|
+
description: "Data exfiltration: a download tool reading secrets via command substitution ($(cat ~/.aws/credentials|~/.ssh/id_rsa|.env|/etc/shadow), $(env), $(printenv)) into an outbound request. cat narrowed to well-known secret paths — reading a service's own API token file for that service's Authorization header (e.g. curl -H 'Bearer $(cat ~/.cache/.../token)') no longer fires. Prose branches (send-to-webhook, bare 'exfiltrate') already dropped"
|
|
199
199
|
|
|
200
200
|
# -- Layer 15: Cron/scheduled task persistence --
|
|
201
201
|
- field: tool_response
|
|
202
202
|
operator: regex
|
|
203
|
-
value: "(?i)(echo\\s+.{0,100}>>\\s*/etc/cron|\\bcrontab\\s+.{0,60}(curl|wget|/tmp
|
|
204
|
-
description: "Persistence: writing to /etc/cron, crontab loading a remote/tmp payload, schtasks/ScheduledTask creation, launchctl load. Benign systemctl enable and bare crontab -e/-l dropped (normal service management)"
|
|
203
|
+
value: "(?i)(echo\\s+.{0,100}>>\\s*/etc/cron|\\bcrontab\\s+.{0,60}(curl|wget|/tmp/|bash\\s+-i|http)|\\bat\\s+-f\\b|\\bschtasks\\s+/create\\b|\\bRegister-ScheduledTask\\b|\\blaunchctl\\s+load)"
|
|
204
|
+
description: "Persistence: writing to /etc/cron, crontab loading a remote/tmp payload, schtasks/ScheduledTask creation, launchctl load. Benign systemctl enable and bare crontab -e/-l dropped (normal service management). Dropped /dev/ from the crontab branch — it matched the standard '(crontab -l 2>/dev/null; echo job) | crontab -' add-a-job idiom on the 2>/dev/null redirect"
|
|
205
205
|
|
|
206
206
|
condition: any
|
|
207
207
|
false_positives:
|