agent-threat-rules 3.5.3 → 3.5.5
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/README.md +1 -1
- package/dist/engine.d.ts +17 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +127 -53
- package/dist/engine.js.map +1 -1
- package/dist/hook-handler.d.ts +25 -1
- package/dist/hook-handler.d.ts.map +1 -1
- package/dist/hook-handler.js +64 -2
- package/dist/hook-handler.js.map +1 -1
- package/package.json +2 -2
- package/rules/context-exfiltration/ATR-2026-01948-netlicensing-mcp-product-number-path-traversal-token-leak.yaml +132 -0
- package/rules/context-exfiltration/ATR-2026-01957-m365-copilot-searchleak-open-redirect-exfil.yaml +95 -0
- package/rules/context-exfiltration/ATR-2026-01961-meta-ads-mcp-unauth-token-leak.yaml +135 -0
- package/rules/context-exfiltration/ATR-2026-01964-langchain-gmailtoolkit-indirect-prompt-injection-email-exfil.yaml +99 -0
- package/rules/context-exfiltration/ATR-2026-01984-mcp-server-kubernetes-kubectl-generic-token-exfil.yaml +170 -0
- package/rules/privilege-escalation/ATR-2026-00111-shell-escape.yaml +19 -11
- package/rules/privilege-escalation/ATR-2026-01933-litellm-user-role-privilege-escalation-cve-2026-47102.yaml +160 -0
- package/rules/privilege-escalation/ATR-2026-01934-litellm-allowed-routes-authz-bypass-cve-2026-47101.yaml +161 -0
- package/rules/privilege-escalation/ATR-2026-01949-praisonai-mcpserver-unauth-tools-call.yaml +138 -0
- package/rules/privilege-escalation/ATR-2026-01974-anything-llm-data-import-access-control.yaml +93 -0
- package/rules/privilege-escalation/ATR-2026-01981-network-ai-approval-inbox-unauth-cors-bypass.yaml +152 -0
- package/rules/privilege-escalation/ATR-2026-01986-windows-mcp-unauth-http-powershell-cors.yaml +170 -0
- package/rules/skill-compromise/ATR-2026-00066-parameter-injection.yaml +2 -2
- package/rules/tool-poisoning/ATR-2026-00012-unauthorized-tool-call.yaml +3 -3
- package/rules/tool-poisoning/ATR-2026-00161-important-tag-cross-tool-shadowing.yaml +4 -3
- package/rules/tool-poisoning/ATR-2026-00581-mcp-tool-rug-pull-post-approval-redefinition.yaml +1 -0
- package/rules/tool-poisoning/ATR-2026-01932-shadow-undeclared-mcp-server-registration.yaml +1 -0
- package/rules/tool-poisoning/ATR-2026-01935-litellm-custom-code-sandbox-escape-cve-2026-40217.yaml +161 -0
- package/rules/tool-poisoning/ATR-2026-01952-praisonai-codemode-sandbox-escape-rce.yaml +125 -0
- package/rules/tool-poisoning/ATR-2026-01953-praisonai-codemode-function-ctor-sandbox-escape.yaml +111 -0
- package/rules/tool-poisoning/ATR-2026-01959-openhuman-shell-allowlist-env-prefix-bypass.yaml +136 -0
- package/rules/tool-poisoning/ATR-2026-01963-praisonai-action-orchestrator-step-target-path-traversal-rce.yaml +99 -0
- package/rules/tool-poisoning/ATR-2026-01965-flowise-custommcp-os-command-rce.yaml +137 -0
- package/rules/tool-poisoning/ATR-2026-01967-deepchat-mermaid-xss-rce-ipc-mcp-register.yaml +97 -0
- package/rules/tool-poisoning/ATR-2026-01968-deepchat-markdown-deeplink-openexternal-rce-bypass.yaml +149 -0
- package/rules/tool-poisoning/ATR-2026-01970-praisonai-filetools-normpath-path-traversal.yaml +111 -0
- package/rules/tool-poisoning/ATR-2026-01973-anythingllm-logo-endpoint-path-traversal.yaml +95 -0
- package/rules/tool-poisoning/ATR-2026-01978-anythingllm-collector-process-filename-path-traversal-delete.yaml +95 -0
- package/rules/tool-poisoning/ATR-2026-01979-pandasai-prompt-injection-dunder-sandbox-escape-rce.yaml +105 -0
- package/rules/tool-poisoning/ATR-2026-01980-agentic-flow-mcp-tool-param-command-injection.yaml +153 -0
- package/rules/tool-poisoning/ATR-2026-01982-dbt-mcp-node-selection-argument-injection.yaml +160 -0
- package/rules/tool-poisoning/ATR-2026-01983-mcp-for-stata-log-file-name-command-injection.yaml +170 -0
- package/rules/tool-poisoning/ATR-2026-01985-mcp-connect-bridge-unauth-process-spawn-rce.yaml +180 -0
- package/rules/tool-poisoning/ATR-2026-01987-langroid-sqlchatagent-prompt-to-sql-rce.yaml +165 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
title: "PraisonAI MCPServer Unauthenticated HTTP tools/call Authentication Bypass (GHSA-j4f3-55x4-r6q2)"
|
|
2
|
+
id: ATR-2026-01949
|
|
3
|
+
rule_version: 1
|
|
4
|
+
status: draft
|
|
5
|
+
description: >
|
|
6
|
+
Detects exploitation of GHSA-j4f3-55x4-r6q2 (CRITICAL) in npm praisonai
|
|
7
|
+
>=1.5.0,<=1.7.1: the MCPServer's handleRequest() in src/praisonai-ts/src/mcp/server.ts
|
|
8
|
+
dispatches privileged JSON-RPC methods (tools/call, tools/list, resources/read,
|
|
9
|
+
prompts/get) without invoking the unused MCPSecurity manager, so unauthenticated
|
|
10
|
+
HTTP POSTs — including ones sent with no Authorization header or a bogus
|
|
11
|
+
"Authorization: Bearer invalid" — return HTTP 200 and execute registered tools.
|
|
12
|
+
This rule keys on the unauthenticated PraisonAI/MCP tools/call payload, the
|
|
13
|
+
invalid-Bearer auth-bypass token, and the vulnerable handleRequest sink.
|
|
14
|
+
author: "ATR Community"
|
|
15
|
+
date: "2026/06/29"
|
|
16
|
+
schema_version: "0.1"
|
|
17
|
+
detection_tier: pattern
|
|
18
|
+
maturity: test
|
|
19
|
+
severity: critical
|
|
20
|
+
references:
|
|
21
|
+
owasp_llm:
|
|
22
|
+
- "LLM06:2025 - Excessive Agency"
|
|
23
|
+
owasp_agentic:
|
|
24
|
+
- "ASI06:2026 - Tool Misuse"
|
|
25
|
+
mitre_atlas:
|
|
26
|
+
- "AML.T0049 - Exploit Public-Facing Application"
|
|
27
|
+
mitre_attack:
|
|
28
|
+
- "T1190 - Exploit Public-Facing Application"
|
|
29
|
+
cve:
|
|
30
|
+
- "GHSA-j4f3-55x4-r6q2"
|
|
31
|
+
metadata_provenance:
|
|
32
|
+
mitre_atlas: human-reviewed
|
|
33
|
+
owasp_llm: human-reviewed
|
|
34
|
+
owasp_agentic: human-reviewed
|
|
35
|
+
compliance:
|
|
36
|
+
eu_ai_act:
|
|
37
|
+
- article: "15"
|
|
38
|
+
context: "Article 15 (accuracy, robustness, cybersecurity) — runtime detection of this technique is a cybersecurity control for high-risk AI systems. Technique: PraisonAI MCPServer Unauthenticated HTTP tools/call Authentication Bypass (GHSA-j4f3-55x4-r6q2)."
|
|
39
|
+
strength: primary
|
|
40
|
+
- article: "9"
|
|
41
|
+
context: "Article 9 (risk management system) requires identified risks to be addressed by appropriate measures; this rule is a runtime risk-treatment control. Technique: PraisonAI MCPServer Unauthenticated HTTP tools/call Authentication Bypass (GHSA-j4f3-55x4-r6q2)."
|
|
42
|
+
strength: secondary
|
|
43
|
+
nist_ai_rmf:
|
|
44
|
+
- subcategory: "MP.5.1"
|
|
45
|
+
context: "NIST AI RMF MAP 5.1 — likelihood and impact of the identified attack are characterised; this rule detects the adversarial input at runtime. Technique: PraisonAI MCPServer Unauthenticated HTTP tools/call Authentication Bypass (GHSA-j4f3-55x4-r6q2)."
|
|
46
|
+
strength: primary
|
|
47
|
+
- subcategory: "MG.3.2"
|
|
48
|
+
context: "NIST AI RMF MANAGE 3.2 — runtime monitoring/maintenance control that surfaces this attack class. Technique: PraisonAI MCPServer Unauthenticated HTTP tools/call Authentication Bypass (GHSA-j4f3-55x4-r6q2)."
|
|
49
|
+
strength: secondary
|
|
50
|
+
iso_42001:
|
|
51
|
+
- clause: "8.1"
|
|
52
|
+
context: "ISO/IEC 42001 Clause 8.1 (operational planning and control) — detection of this payload is an operational control. Technique: PraisonAI MCPServer Unauthenticated HTTP tools/call Authentication Bypass (GHSA-j4f3-55x4-r6q2)."
|
|
53
|
+
strength: primary
|
|
54
|
+
- clause: "8.3"
|
|
55
|
+
context: "ISO/IEC 42001 Clause 8.3 (AI risk treatment) — this rule implements runtime detection as a treatment control. Technique: PraisonAI MCPServer Unauthenticated HTTP tools/call Authentication Bypass (GHSA-j4f3-55x4-r6q2)."
|
|
56
|
+
strength: secondary
|
|
57
|
+
tags:
|
|
58
|
+
category: privilege-escalation
|
|
59
|
+
subcategory: mcp-auth-bypass
|
|
60
|
+
scan_target: both
|
|
61
|
+
confidence: high
|
|
62
|
+
source: cve-disclosure
|
|
63
|
+
vendor_sources: praisonai-ghsa-j4f3-55x4-r6q2
|
|
64
|
+
agent_source:
|
|
65
|
+
type: llm_io
|
|
66
|
+
framework:
|
|
67
|
+
- praisonai
|
|
68
|
+
- any
|
|
69
|
+
provider:
|
|
70
|
+
- any
|
|
71
|
+
detection:
|
|
72
|
+
condition: any
|
|
73
|
+
false_positives:
|
|
74
|
+
- "Legitimate authenticated MCP client sending a tools/call request with a valid Authorization header."
|
|
75
|
+
- "MCP protocol documentation describing the tools/call JSON-RPC method without the unauthenticated bypass framing."
|
|
76
|
+
- "Mitigation advisory recommending an upgrade to praisonai >= 1.7.2 without exploit content."
|
|
77
|
+
conditions:
|
|
78
|
+
- field: content
|
|
79
|
+
operator: regex
|
|
80
|
+
value: '(?i)(?:praisonai|mcpserver|mcpsecurity|handleRequest)[\s\S]{0,200}(?:no\s+auth(?:oriz\w+)?|unauthenticat|without\s+(?:auth|credential)|authorization:\s*bearer\s+invalid)[\s\S]{0,200}["\x27]?(?:method)["\x27]?\s*[:=]\s*["\x27]tools/call'
|
|
81
|
+
description: >
|
|
82
|
+
PraisonAI/MCPServer context plus an unauthenticated / invalid-Bearer
|
|
83
|
+
framing immediately preceding a JSON-RPC tools/call method — the core
|
|
84
|
+
GHSA-j4f3-55x4-r6q2 auth-bypass payload
|
|
85
|
+
- field: content
|
|
86
|
+
operator: regex
|
|
87
|
+
value: '(?i)authorization:\s*bearer\s+invalid[\s\S]{0,200}(?:tools/call|tools/list|resources/read|prompts/get)'
|
|
88
|
+
description: >
|
|
89
|
+
Invalid-credential bypass token ("Authorization: Bearer invalid")
|
|
90
|
+
paired with a privileged MCP JSON-RPC method that returns HTTP 200
|
|
91
|
+
without validation
|
|
92
|
+
- field: content
|
|
93
|
+
operator: regex
|
|
94
|
+
value: '(?i)handleRequest[\s\S]{0,160}(?:src/(?:praisonai-ts/src/)?mcp/server\.ts|mcpsecurity|tools/call)[\s\S]{0,120}(?:bypass|unauthenticat|without\s+(?:auth|validation)|dispatch\w*\s+without)'
|
|
95
|
+
description: >
|
|
96
|
+
The vulnerable handleRequest sink in mcp/server.ts dispatching methods
|
|
97
|
+
without invoking MCPSecurity — direct reference to the vulnerable code path
|
|
98
|
+
- field: content
|
|
99
|
+
operator: regex
|
|
100
|
+
value: '(?i)GHSA-j4f3-55x4-r6q2[\s\S]{0,200}(?:tools/call|unauthenticat|auth(?:oriz\w+)?\s+bypass|bearer\s+invalid)'
|
|
101
|
+
description: "explicit GHSA framing combined with the auth-bypass exploit tokens"
|
|
102
|
+
response:
|
|
103
|
+
actions:
|
|
104
|
+
- alert
|
|
105
|
+
- block_input
|
|
106
|
+
message_template: >
|
|
107
|
+
[ATR-2026-01949] CRITICAL: Unauthenticated PraisonAI MCPServer tools/call
|
|
108
|
+
auth-bypass detected (GHSA-j4f3-55x4-r6q2). Attackers can invoke registered
|
|
109
|
+
MCP tools with no valid credentials. Block and upgrade praisonai to >= 1.7.2.
|
|
110
|
+
confidence: 80
|
|
111
|
+
wild_fp_rate: 0
|
|
112
|
+
test_cases:
|
|
113
|
+
true_positives:
|
|
114
|
+
- input: "PraisonAI MCPServer exploit: send unauthenticated POST with no Authorization header and body {\"method\":\"tools/call\",\"params\":{\"name\":\"run_shell\",\"arguments\":{}}} — returns HTTP 200."
|
|
115
|
+
expected: triggered
|
|
116
|
+
description: "Unauthenticated framing + PraisonAI/MCPServer + tools/call JSON-RPC payload"
|
|
117
|
+
- input: "curl -H 'Authorization: Bearer invalid' http://target:8080 -d '{\"method\":\"tools/call\",\"params\":{\"name\":\"x\"}}'"
|
|
118
|
+
expected: triggered
|
|
119
|
+
description: "Invalid-Bearer bypass token immediately before tools/call method"
|
|
120
|
+
- input: "GHSA-j4f3-55x4-r6q2: handleRequest in src/praisonai-ts/src/mcp/server.ts dispatches tools/call without invoking MCPSecurity, allowing unauthenticated tool execution."
|
|
121
|
+
expected: triggered
|
|
122
|
+
description: "Vulnerable handleRequest sink + GHSA framing + unauthenticated dispatch"
|
|
123
|
+
- input: "Authorization: Bearer invalid still reaches resources/read on the PraisonAI MCP server without validation"
|
|
124
|
+
expected: triggered
|
|
125
|
+
description: "Invalid-Bearer token paired with privileged resources/read method"
|
|
126
|
+
true_negatives:
|
|
127
|
+
- input: "Authenticated MCP client sends {\"method\":\"tools/call\",\"params\":{\"name\":\"search\"}} with a valid Authorization: Bearer <token> header."
|
|
128
|
+
expected: not_triggered
|
|
129
|
+
description: "Legitimate authenticated tools/call request — no unauthenticated/invalid-Bearer framing"
|
|
130
|
+
- input: "The MCP spec defines tools/call as the JSON-RPC method an agent uses to invoke a registered tool."
|
|
131
|
+
expected: not_triggered
|
|
132
|
+
description: "Generic MCP protocol documentation of tools/call without the bypass tokens"
|
|
133
|
+
- input: "Upgrade praisonai to >= 1.7.2 to remediate the MCPServer authentication issue."
|
|
134
|
+
expected: not_triggered
|
|
135
|
+
description: "Mitigation advice without any exploit payload or bypass token"
|
|
136
|
+
- input: "Our handleRequest function in server.ts logs each tools/call before forwarding it to the authenticated handler."
|
|
137
|
+
expected: not_triggered
|
|
138
|
+
description: "Benign handleRequest implementation that authenticates — lacks bypass/unauthenticated framing"
|
package/rules/privilege-escalation/ATR-2026-01974-anything-llm-data-import-access-control.yaml
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
title: "AnythingLLM unauthenticated /system/data-import access control bypass (CVE-2024-3279)"
|
|
2
|
+
id: ATR-2026-01974
|
|
3
|
+
rule_version: 1
|
|
4
|
+
status: draft
|
|
5
|
+
description: >
|
|
6
|
+
CVE-2024-3279: improper access control on the mintplex-labs/anything-llm
|
|
7
|
+
POST /system/data-import endpoint (<1.0.0). An anonymous, unauthenticated
|
|
8
|
+
attacker uploads their own database file via multipart formData, deleting or
|
|
9
|
+
spoofing the existing anythingllm.db SQLite database to serve malicious data
|
|
10
|
+
or harvest user info. This rule keys on the data-import endpoint path combined
|
|
11
|
+
with the database-file import sink (anythingllm.db / data-import upload).
|
|
12
|
+
author: "ATR Community"
|
|
13
|
+
date: "2026/06/29"
|
|
14
|
+
schema_version: "0.1"
|
|
15
|
+
detection_tier: pattern
|
|
16
|
+
maturity: test
|
|
17
|
+
severity: critical
|
|
18
|
+
references:
|
|
19
|
+
owasp_llm: ["LLM06:2025 - Excessive Agency"]
|
|
20
|
+
owasp_agentic: ["ASI06:2026 - Tool Misuse"]
|
|
21
|
+
mitre_atlas: ["AML.T0049 - Exploit Public-Facing Application"]
|
|
22
|
+
mitre_attack: ["T1190 - Exploit Public-Facing Application"]
|
|
23
|
+
cve: ["CVE-2024-3279"]
|
|
24
|
+
metadata_provenance: { mitre_atlas: human-reviewed, owasp_llm: human-reviewed, owasp_agentic: human-reviewed }
|
|
25
|
+
compliance:
|
|
26
|
+
eu_ai_act:
|
|
27
|
+
- article: "15"
|
|
28
|
+
context: "Article 15 (accuracy, robustness, cybersecurity) — runtime detection of this technique is a cybersecurity control for high-risk AI systems. Technique: AnythingLLM unauthenticated /system/data-import access control bypass (CVE-2024-3279)."
|
|
29
|
+
strength: primary
|
|
30
|
+
- article: "9"
|
|
31
|
+
context: "Article 9 (risk management system) requires identified risks to be addressed by appropriate measures; this rule is a runtime risk-treatment control. Technique: AnythingLLM unauthenticated /system/data-import access control bypass (CVE-2024-3279)."
|
|
32
|
+
strength: secondary
|
|
33
|
+
nist_ai_rmf:
|
|
34
|
+
- subcategory: "MP.5.1"
|
|
35
|
+
context: "NIST AI RMF MAP 5.1 — likelihood and impact of the identified attack are characterised; this rule detects the adversarial input at runtime. Technique: AnythingLLM unauthenticated /system/data-import access control bypass (CVE-2024-3279)."
|
|
36
|
+
strength: primary
|
|
37
|
+
- subcategory: "MG.3.2"
|
|
38
|
+
context: "NIST AI RMF MANAGE 3.2 — runtime monitoring/maintenance control that surfaces this attack class. Technique: AnythingLLM unauthenticated /system/data-import access control bypass (CVE-2024-3279)."
|
|
39
|
+
strength: secondary
|
|
40
|
+
iso_42001:
|
|
41
|
+
- clause: "8.1"
|
|
42
|
+
context: "ISO/IEC 42001 Clause 8.1 (operational planning and control) — detection of this payload is an operational control. Technique: AnythingLLM unauthenticated /system/data-import access control bypass (CVE-2024-3279)."
|
|
43
|
+
strength: primary
|
|
44
|
+
- clause: "8.3"
|
|
45
|
+
context: "ISO/IEC 42001 Clause 8.3 (AI risk treatment) — this rule implements runtime detection as a treatment control. Technique: AnythingLLM unauthenticated /system/data-import access control bypass (CVE-2024-3279)."
|
|
46
|
+
strength: secondary
|
|
47
|
+
tags: { category: privilege-escalation, subcategory: improper-access-control, scan_target: both, confidence: high, source: cve-disclosure, vendor_sources: anything-llm-cve-2024-3279 }
|
|
48
|
+
agent_source: { type: llm_io, framework: [any], provider: [any] }
|
|
49
|
+
detection:
|
|
50
|
+
condition: any
|
|
51
|
+
false_positives:
|
|
52
|
+
- "Documentation or release notes describing the removed Export/Import feature without an actual unauthenticated upload request to /system/data-import"
|
|
53
|
+
- "Legitimate authenticated admin using a backup/restore tool that references anythingllm.db by path but does not POST it to the /system/data-import endpoint"
|
|
54
|
+
conditions:
|
|
55
|
+
- field: content
|
|
56
|
+
operator: regex
|
|
57
|
+
value: '(?i)/system/data-import\b[\s\S]{0,300}(?:multipart/form-data|form-?data|multer|\.db\b|anythingllm\.db|method\s*[:=]\s*["'']?post)'
|
|
58
|
+
description: "POST upload to the unauthenticated /system/data-import endpoint with a multipart DB file"
|
|
59
|
+
- field: content
|
|
60
|
+
operator: regex
|
|
61
|
+
value: '(?i)anythingllm\.db[\s\S]{0,200}(?:/system/data-import|data-import|formData|multipart|import)'
|
|
62
|
+
description: "Import/upload of the anythingllm.db database file via the data-import sink"
|
|
63
|
+
- field: content
|
|
64
|
+
operator: regex
|
|
65
|
+
value: '(?i)CVE-2024-3279[\s\S]{0,200}(?:data-import|anythingllm|access control|unauthenticated)'
|
|
66
|
+
description: "explicit CVE framing"
|
|
67
|
+
response:
|
|
68
|
+
actions: [alert, block_input]
|
|
69
|
+
message_template: >
|
|
70
|
+
[ATR-2026-01974] CRITICAL: Unauthenticated AnythingLLM /system/data-import upload can overwrite/spoof anythingllm.db (CVE-2024-3279). Block and patch to >=1.0.0.
|
|
71
|
+
confidence: 80
|
|
72
|
+
wild_fp_rate: 0
|
|
73
|
+
test_cases:
|
|
74
|
+
true_positives:
|
|
75
|
+
- input: "curl -X POST http://target:3001/api/system/data-import -F 'file=@evil.db' to overwrite anythingllm.db with no auth header"
|
|
76
|
+
expected: triggered
|
|
77
|
+
description: "Anonymous multipart POST to /system/data-import uploading a malicious database file"
|
|
78
|
+
- input: "fetch(`${API_BASE}/system/data-import`, { method: 'POST', body: formData }) // uploads attacker anythingllm.db, no auth"
|
|
79
|
+
expected: triggered
|
|
80
|
+
description: "Frontend-style unauthenticated data-import upload of the DB file"
|
|
81
|
+
- input: "Exploit for CVE-2024-3279: unauthenticated attacker imports their own anythingllm.db via /system/data-import to spoof the database"
|
|
82
|
+
expected: triggered
|
|
83
|
+
description: "Explicit CVE reference with the data-import access control bypass"
|
|
84
|
+
true_negatives:
|
|
85
|
+
- input: "Our admin docs explain how to back up anythingllm.db from the server/storage directory before upgrading."
|
|
86
|
+
expected: not_triggered
|
|
87
|
+
description: "Mentions anythingllm.db for backup but no data-import upload/POST sink"
|
|
88
|
+
- input: "The settings page used to have an Export or Import button; that feature was removed in v1.0.0 for security."
|
|
89
|
+
expected: not_triggered
|
|
90
|
+
description: "Describes the removed feature generically without the endpoint path or DB upload"
|
|
91
|
+
- input: "POST /api/workspace/upload with formData to add a multipart PDF document to a workspace for embedding."
|
|
92
|
+
expected: not_triggered
|
|
93
|
+
description: "A different multipart upload endpoint, not /system/data-import and not the DB file"
|
package/rules/privilege-escalation/ATR-2026-01981-network-ai-approval-inbox-unauth-cors-bypass.yaml
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
title: "Network-AI ApprovalInbox Unauthenticated Cross-Origin Approval Bypass (GHSA-mxjx-28vx-xjjj)"
|
|
2
|
+
id: ATR-2026-01981
|
|
3
|
+
rule_version: 1
|
|
4
|
+
status: draft
|
|
5
|
+
description: >
|
|
6
|
+
Detects GHSA-mxjx-28vx-xjjj (CWE-862 Missing Authorization + CWE-352 CSRF via
|
|
7
|
+
wildcard CORS): network-ai's ApprovalInbox HTTP server (lib/approval-inbox.ts)
|
|
8
|
+
has no authentication of any kind and sets Access-Control-Allow-Origin: * on
|
|
9
|
+
every route, including the state-changing POST /approvals/:id/approve and
|
|
10
|
+
/deny. ApprovalInbox is the network surface of the human-in-the-loop Approval
|
|
11
|
+
Gate that gates high-risk operations (writes, shell commands, budget spend).
|
|
12
|
+
Any caller that can reach the inbox port — a co-located process, an SSRF, a
|
|
13
|
+
non-loopback remote client, or any website the operator visits in a browser
|
|
14
|
+
via the wildcard CORS — can enumerate pending approvals (GET /approvals/) and
|
|
15
|
+
approve them (POST /approvals/:id/approve) with no Authorization header,
|
|
16
|
+
defeating the Approval Gate so a gated shell command executes without
|
|
17
|
+
consent. Affected: network-ai <= 5.11.0.
|
|
18
|
+
|
|
19
|
+
Detection covers:
|
|
20
|
+
(a) a state-changing request to the approval control plane
|
|
21
|
+
(/approvals/<id>/approve or /deny) with no auth context, matching the
|
|
22
|
+
unauthenticated-client PoC shape;
|
|
23
|
+
(b) an enumeration request to the approval queue (GET /approvals/) paired
|
|
24
|
+
with the wildcard-CORS marker on the approval control plane;
|
|
25
|
+
(c) explicit GHSA-mxjx-28vx-xjjj / ApprovalInbox exploitation framing.
|
|
26
|
+
|
|
27
|
+
The detection target is the request shape at the approval control plane —
|
|
28
|
+
an unauthenticated approve/deny or enumerate call combined with the
|
|
29
|
+
wildcard-CORS marker — which is the exact bypass primitive, caught before
|
|
30
|
+
the gated action is released.
|
|
31
|
+
author: "ATR Community"
|
|
32
|
+
date: "2026/07/04"
|
|
33
|
+
schema_version: "0.1"
|
|
34
|
+
detection_tier: pattern
|
|
35
|
+
maturity: test
|
|
36
|
+
severity: high
|
|
37
|
+
|
|
38
|
+
references:
|
|
39
|
+
owasp_llm:
|
|
40
|
+
- "LLM06:2025 - Excessive Agency"
|
|
41
|
+
owasp_agentic:
|
|
42
|
+
- "ASI03:2026 - Privilege Compromise"
|
|
43
|
+
- "ASI06:2026 - Tool Misuse"
|
|
44
|
+
mitre_atlas:
|
|
45
|
+
- "AML.T0049 - Exploit Public-Facing Application"
|
|
46
|
+
mitre_attack:
|
|
47
|
+
- "T1068 - Exploitation for Privilege Escalation"
|
|
48
|
+
- "T1190 - Exploit Public-Facing Application"
|
|
49
|
+
ghsa:
|
|
50
|
+
- "GHSA-mxjx-28vx-xjjj"
|
|
51
|
+
|
|
52
|
+
metadata_provenance:
|
|
53
|
+
mitre_atlas: human-reviewed
|
|
54
|
+
owasp_llm: human-reviewed
|
|
55
|
+
owasp_agentic: human-reviewed
|
|
56
|
+
|
|
57
|
+
compliance:
|
|
58
|
+
eu_ai_act:
|
|
59
|
+
- { article: "15", context: "Article 15 cybersecurity — runtime detection of unauthenticated cross-origin approval-gate bypass on network-ai's ApprovalInbox control plane.", strength: primary }
|
|
60
|
+
- { article: "9", context: "Article 9 risk management — runtime risk-treatment control for unauthenticated cross-origin approval-gate bypass.", strength: secondary }
|
|
61
|
+
nist_ai_rmf:
|
|
62
|
+
- { subcategory: "MP.5.1", context: "MAP 5.1 — adversarial input characterised/detected for unauthenticated cross-origin approval-gate bypass.", strength: primary }
|
|
63
|
+
- { subcategory: "MG.3.2", context: "MANAGE 3.2 — runtime monitoring control for unauthenticated cross-origin approval-gate bypass.", strength: secondary }
|
|
64
|
+
iso_42001:
|
|
65
|
+
- { clause: "8.1", context: "Clause 8.1 operational control — detection of unauthenticated cross-origin approval-gate bypass payload.", strength: primary }
|
|
66
|
+
- { clause: "8.3", context: "Clause 8.3 AI risk treatment — runtime detection as treatment control.", strength: secondary }
|
|
67
|
+
|
|
68
|
+
tags:
|
|
69
|
+
category: privilege-escalation
|
|
70
|
+
subcategory: unauth-approval-gate-bypass
|
|
71
|
+
scan_target: tool_call
|
|
72
|
+
confidence: high
|
|
73
|
+
source: ghsa-disclosure
|
|
74
|
+
vendor_sources: network-ai-ghsa-mxjx-28vx-xjjj
|
|
75
|
+
|
|
76
|
+
agent_source:
|
|
77
|
+
type: tool_call
|
|
78
|
+
framework:
|
|
79
|
+
- network-ai
|
|
80
|
+
- any
|
|
81
|
+
provider:
|
|
82
|
+
- any
|
|
83
|
+
|
|
84
|
+
detection:
|
|
85
|
+
condition: any
|
|
86
|
+
false_positives:
|
|
87
|
+
- "Legitimate operator approving a pending action through an authenticated ApprovalInbox deployment that has been hardened with a reverse-proxy auth layer — expected to match; review confirms intent."
|
|
88
|
+
- "Security advisory or PR text quoting the GHSA-mxjx-28vx-xjjj PoC."
|
|
89
|
+
- "A read-only status check against an endpoint that is not the approvals control plane."
|
|
90
|
+
conditions:
|
|
91
|
+
- field: content
|
|
92
|
+
operator: regex
|
|
93
|
+
value: '(?i)POST\s+/approvals/[a-f0-9]+/(?:approve|deny)\b[\s\S]{0,300}(?:approvedBy["\x27]?\s*[:=]\s*["\x27]?(?:anonymous|attacker)|no\s+auth|Authorization["\x27]?\s*:\s*(?:null|undefined|absent|none))'
|
|
94
|
+
description: >
|
|
95
|
+
Unauthenticated POST to the approval control plane's approve/deny
|
|
96
|
+
route — approvedBy defaults to anonymous/attacker with no
|
|
97
|
+
Authorization header, matching the GHSA-mxjx-28vx-xjjj PoC shape.
|
|
98
|
+
- field: content
|
|
99
|
+
operator: regex
|
|
100
|
+
value: '(?i)GET\s+/approvals/\??(?:status=pending)?\b[\s\S]{0,200}Access-Control-Allow-Origin["\x27]?\s*:\s*["\x27]?\*'
|
|
101
|
+
description: >
|
|
102
|
+
Enumeration of the pending-approvals queue paired with a wildcard
|
|
103
|
+
Access-Control-Allow-Origin marker on the approval control plane —
|
|
104
|
+
the cross-origin approval-inbox reconnaissance step.
|
|
105
|
+
- field: content
|
|
106
|
+
operator: regex
|
|
107
|
+
value: '(?i)GHSA-mxjx-28vx-xjjj[\s\S]{0,200}(?:approval[- ]?inbox|network-ai|approve|CORS)'
|
|
108
|
+
description: >
|
|
109
|
+
Explicit GHSA-mxjx-28vx-xjjj reference combined with ApprovalInbox
|
|
110
|
+
exploitation language — attack framing in a skill or tool
|
|
111
|
+
description.
|
|
112
|
+
|
|
113
|
+
response:
|
|
114
|
+
actions:
|
|
115
|
+
- alert
|
|
116
|
+
- block_input
|
|
117
|
+
message_template: >
|
|
118
|
+
[ATR-2026-01981] HIGH: network-ai ApprovalInbox unauthenticated
|
|
119
|
+
cross-origin approval bypass detected (GHSA-mxjx-28vx-xjjj, CWE-862 +
|
|
120
|
+
CWE-352). A caller with no Authorization header reached the approval
|
|
121
|
+
control plane's approve/deny or enumeration route, defeating the
|
|
122
|
+
human-in-the-loop Approval Gate. Block the request and upgrade network-ai
|
|
123
|
+
past 5.11.0 / put ApprovalInbox behind an authenticated reverse proxy.
|
|
124
|
+
|
|
125
|
+
confidence: 78
|
|
126
|
+
|
|
127
|
+
wild_fp_rate: 0
|
|
128
|
+
|
|
129
|
+
test_cases:
|
|
130
|
+
true_positives:
|
|
131
|
+
- tool_description: "POST /approvals/07d6f277efe35ac1/approve {\"approvedBy\": \"anonymous\"}"
|
|
132
|
+
expected: triggered
|
|
133
|
+
description: "Unauthenticated approve call defaults approvedBy to anonymous — GHSA-mxjx-28vx-xjjj PoC shape"
|
|
134
|
+
- tool_description: "GET /approvals/?status=pending -> 200, Access-Control-Allow-Origin: *"
|
|
135
|
+
expected: triggered
|
|
136
|
+
description: "Cross-origin enumeration of pending approvals via wildcard CORS marker"
|
|
137
|
+
- tool_description: "Exploiting GHSA-mxjx-28vx-xjjj: the network-ai ApprovalInbox has no auth, so I can approve any pending action via CORS."
|
|
138
|
+
expected: triggered
|
|
139
|
+
description: "Explicit GHSA-mxjx-28vx-xjjj ApprovalInbox exploitation framing"
|
|
140
|
+
true_negatives:
|
|
141
|
+
- tool_description: "POST /approvals/07d6f277efe35ac1/approve {\"approvedBy\": \"ops-lead\", \"Authorization\": \"Bearer sk_live_abc123\"}"
|
|
142
|
+
expected: not_triggered
|
|
143
|
+
description: "Authenticated operator approval with a Bearer token present"
|
|
144
|
+
- tool_description: "How does the ApprovalInbox approve/deny flow work in network-ai?"
|
|
145
|
+
expected: not_triggered
|
|
146
|
+
description: "General question about the feature, not an exploitation request"
|
|
147
|
+
- tool_description: "GET /approvals/health"
|
|
148
|
+
expected: not_triggered
|
|
149
|
+
description: "Read-only health check on an unrelated route, no wildcard CORS marker present"
|
|
150
|
+
- tool_description: "POST /approvals/07d6f277efe35ac1/approve {\"approvedBy\": \"ops-lead\"} behind an internal VPN with mTLS client cert required"
|
|
151
|
+
expected: not_triggered
|
|
152
|
+
description: "Approve call description explicitly noting mTLS-gated internal deployment, no anonymous/attacker/no-auth marker"
|
package/rules/privilege-escalation/ATR-2026-01986-windows-mcp-unauth-http-powershell-cors.yaml
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
title: "Windows-MCP Unauthenticated HTTP PowerShell via Wildcard CORS (CVE-2026-48989)"
|
|
2
|
+
id: ATR-2026-01986
|
|
3
|
+
rule_version: 1
|
|
4
|
+
status: draft
|
|
5
|
+
description: >
|
|
6
|
+
Detects CVE-2026-48989 / GHSA-vrxg-gm77-7q5g (CWE-306 Missing Authentication
|
|
7
|
+
for Critical Function): Windows-MCP's SSE and Streamable HTTP transports
|
|
8
|
+
build the FastMCP control plane with no auth provider
|
|
9
|
+
(src/windows_mcp/__main__.py:75-113) and install blanket wildcard CORS
|
|
10
|
+
(allow_origins=*, allow_methods=*, allow_headers=*, __main__.py:37-42),
|
|
11
|
+
answering every OPTIONS preflight with the same wildcard headers regardless
|
|
12
|
+
of Origin. The same server registers the PowerShell tool
|
|
13
|
+
(src/windows_mcp/tools/shell.py:10-24), which executes caller-controlled
|
|
14
|
+
commands via PowerShell -EncodedCommand
|
|
15
|
+
(src/windows_mcp/desktop/powershell.py:176-204). A client that can reach
|
|
16
|
+
http://<host>:<port>/mcp — including a cross-origin browser page, since the
|
|
17
|
+
wildcard CORS grants it — can initialize an MCP session and call
|
|
18
|
+
tools/call for PowerShell with no credential of any kind, achieving
|
|
19
|
+
arbitrary PowerShell execution as the Windows user running Windows-MCP.
|
|
20
|
+
Affected: CursorTouch/Windows-MCP < 0.7.5; the default stdio transport is
|
|
21
|
+
not affected.
|
|
22
|
+
|
|
23
|
+
Detection covers:
|
|
24
|
+
(a) the OPTIONS preflight / control-plane response on the /mcp endpoint
|
|
25
|
+
carrying the wildcard access-control-allow-origin marker, which is the
|
|
26
|
+
structural precondition for the cross-origin bypass;
|
|
27
|
+
(b) a tools/call JSON-RPC request naming the PowerShell tool over the
|
|
28
|
+
HTTP/SSE control plane co-occurring with that wildcard-CORS marker;
|
|
29
|
+
(c) explicit CVE-2026-48989 / GHSA-vrxg-gm77-7q5g exploitation framing.
|
|
30
|
+
|
|
31
|
+
The detection target is the request/response shape at the MCP control
|
|
32
|
+
plane — a PowerShell tool invocation reachable through an unauthenticated,
|
|
33
|
+
wildcard-CORS-exposed /mcp endpoint — which is the exact remote-code-
|
|
34
|
+
execution primitive, caught before PowerShellExecutor.execute_command runs.
|
|
35
|
+
Bound to the PowerShell tool name plus the wildcard-CORS marker so a
|
|
36
|
+
legitimate, authenticated PowerShell call over a properly-scoped-CORS
|
|
37
|
+
deployment does not fire.
|
|
38
|
+
author: "ATR Community"
|
|
39
|
+
date: "2026/07/04"
|
|
40
|
+
schema_version: "0.1"
|
|
41
|
+
detection_tier: pattern
|
|
42
|
+
maturity: test
|
|
43
|
+
severity: critical
|
|
44
|
+
|
|
45
|
+
references:
|
|
46
|
+
owasp_llm:
|
|
47
|
+
- "LLM06:2025 - Excessive Agency"
|
|
48
|
+
owasp_agentic:
|
|
49
|
+
- "ASI03:2026 - Privilege Compromise"
|
|
50
|
+
- "ASI06:2026 - Tool Misuse"
|
|
51
|
+
mitre_atlas:
|
|
52
|
+
- "AML.T0053 - LLM Plugin Compromise"
|
|
53
|
+
mitre_attack:
|
|
54
|
+
- "T1059 - Command and Scripting Interpreter"
|
|
55
|
+
- "T1190 - Exploit Public-Facing Application"
|
|
56
|
+
cve:
|
|
57
|
+
- "CVE-2026-48989"
|
|
58
|
+
ghsa:
|
|
59
|
+
- "GHSA-vrxg-gm77-7q5g"
|
|
60
|
+
|
|
61
|
+
metadata_provenance:
|
|
62
|
+
mitre_atlas: human-reviewed
|
|
63
|
+
owasp_llm: human-reviewed
|
|
64
|
+
owasp_agentic: human-reviewed
|
|
65
|
+
|
|
66
|
+
compliance:
|
|
67
|
+
eu_ai_act:
|
|
68
|
+
- { article: "15", context: "Article 15 cybersecurity — runtime detection of unauthenticated cross-origin PowerShell tool invocation on Windows-MCP's HTTP control plane.", strength: primary }
|
|
69
|
+
- { article: "9", context: "Article 9 risk management — runtime risk-treatment control for unauthenticated cross-origin PowerShell tool invocation.", strength: secondary }
|
|
70
|
+
nist_ai_rmf:
|
|
71
|
+
- { subcategory: "MP.5.1", context: "MAP 5.1 — adversarial input characterised/detected for unauthenticated cross-origin PowerShell tool invocation.", strength: primary }
|
|
72
|
+
- { subcategory: "MG.3.2", context: "MANAGE 3.2 — runtime monitoring control for unauthenticated cross-origin PowerShell tool invocation.", strength: secondary }
|
|
73
|
+
iso_42001:
|
|
74
|
+
- { clause: "8.1", context: "Clause 8.1 operational control — detection of unauthenticated cross-origin PowerShell tool invocation payload.", strength: primary }
|
|
75
|
+
- { clause: "8.3", context: "Clause 8.3 AI risk treatment — runtime detection as treatment control.", strength: secondary }
|
|
76
|
+
|
|
77
|
+
tags:
|
|
78
|
+
category: privilege-escalation
|
|
79
|
+
subcategory: unauth-mcp-control-plane-rce
|
|
80
|
+
scan_target: mcp
|
|
81
|
+
confidence: high
|
|
82
|
+
source: cve-disclosure
|
|
83
|
+
vendor_sources: windows-mcp-cve-2026-48989
|
|
84
|
+
|
|
85
|
+
agent_source:
|
|
86
|
+
type: tool_call
|
|
87
|
+
framework:
|
|
88
|
+
- windows-mcp
|
|
89
|
+
- any
|
|
90
|
+
provider:
|
|
91
|
+
- any
|
|
92
|
+
|
|
93
|
+
detection:
|
|
94
|
+
condition: any
|
|
95
|
+
false_positives:
|
|
96
|
+
- "A legitimate, authenticated PowerShell tool call over stdio transport or an HTTP deployment with an auth provider and origin-scoped CORS configured — expected to match if wildcard CORS markers are also present; review confirms intent."
|
|
97
|
+
- "Security advisory or PR text quoting the GHSA-vrxg-gm77-7q5g / CVE-2026-48989 PoC for review purposes."
|
|
98
|
+
- "An OPTIONS preflight response that scopes Access-Control-Allow-Origin to a specific trusted origin rather than a wildcard."
|
|
99
|
+
conditions:
|
|
100
|
+
- field: content
|
|
101
|
+
operator: regex
|
|
102
|
+
value: '(?i)OPTIONS\s+.{0,40}/mcp/?[\s\S]{0,200}access-control-allow-origin["\x27]?\s*:\s*["\x27]?\*[\s\S]{0,200}access-control-allow-methods["\x27]?\s*:\s*["\x27]?\*'
|
|
103
|
+
description: >
|
|
104
|
+
OPTIONS preflight against the /mcp control plane answered with
|
|
105
|
+
wildcard Access-Control-Allow-Origin and Access-Control-Allow-Methods
|
|
106
|
+
— the structural CORS-bypass precondition from GHSA-vrxg-gm77-7q5g.
|
|
107
|
+
- field: content
|
|
108
|
+
operator: regex
|
|
109
|
+
value: '(?i)"method"\s*:\s*"tools/call"[\s\S]{0,150}"name"\s*:\s*"PowerShell"[\s\S]{0,300}access-control-allow-origin["\x27]?\s*:\s*["\x27]?\*'
|
|
110
|
+
description: >
|
|
111
|
+
A tools/call JSON-RPC request naming the PowerShell tool
|
|
112
|
+
co-occurring with a wildcard access-control-allow-origin marker on
|
|
113
|
+
the same MCP exchange — unauthenticated cross-origin PowerShell
|
|
114
|
+
invocation.
|
|
115
|
+
- field: content
|
|
116
|
+
operator: regex
|
|
117
|
+
value: '(?i)access-control-allow-origin["\x27]?\s*:\s*["\x27]?\*[\s\S]{0,300}\bPowerShell\b[\s\S]{0,150}(?:command|EncodedCommand)["\x27]?\s*[:=]'
|
|
118
|
+
description: >
|
|
119
|
+
Wildcard CORS marker followed by a PowerShell tool argument carrying
|
|
120
|
+
a command/EncodedCommand payload — the end-to-end
|
|
121
|
+
control-plane-to-shell-execution shape.
|
|
122
|
+
- field: content
|
|
123
|
+
operator: regex
|
|
124
|
+
value: '(?i)(?:CVE-2026-48989|GHSA-vrxg-gm77-7q5g)[\s\S]{0,200}(?:windows-mcp|powershell|wildcard\s*CORS|unauthenticat)'
|
|
125
|
+
description: >
|
|
126
|
+
Explicit CVE-2026-48989 / GHSA-vrxg-gm77-7q5g reference combined with
|
|
127
|
+
Windows-MCP PowerShell/CORS exploitation language — attack framing
|
|
128
|
+
in a skill or tool description.
|
|
129
|
+
|
|
130
|
+
response:
|
|
131
|
+
actions:
|
|
132
|
+
- alert
|
|
133
|
+
- block_tool
|
|
134
|
+
message_template: >
|
|
135
|
+
[ATR-2026-01986] CRITICAL: Windows-MCP unauthenticated HTTP PowerShell via
|
|
136
|
+
wildcard CORS detected (CVE-2026-48989, CWE-306). A tools/call for
|
|
137
|
+
PowerShell reached the /mcp control plane alongside a wildcard
|
|
138
|
+
access-control-allow-origin marker; Windows-MCP before 0.7.5 runs SSE/
|
|
139
|
+
Streamable-HTTP transports with no auth provider and allow_origins=*.
|
|
140
|
+
Block the tool call and upgrade Windows-MCP to >= 0.7.5 or restrict to
|
|
141
|
+
the stdio transport.
|
|
142
|
+
|
|
143
|
+
confidence: 82
|
|
144
|
+
|
|
145
|
+
wild_fp_rate: 0
|
|
146
|
+
|
|
147
|
+
test_cases:
|
|
148
|
+
true_positives:
|
|
149
|
+
- tool_description: "curl -i -X OPTIONS 'http://127.0.0.1:18123/mcp/' -H 'Origin: https://attacker.example' response: access-control-allow-origin: * access-control-allow-methods: * access-control-allow-headers: *"
|
|
150
|
+
expected: triggered
|
|
151
|
+
description: "OPTIONS preflight on /mcp answered with wildcard ACAO + ACAM — CVE-2026-48989 PoC step 1"
|
|
152
|
+
- tool_description: "{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools/call\",\"params\":{\"name\":\"PowerShell\",\"arguments\":{\"command\":\"calc.exe\"}}} response headers: access-control-allow-origin: *"
|
|
153
|
+
expected: triggered
|
|
154
|
+
description: "tools/call for PowerShell co-occurring with wildcard ACAO on the same exchange — CVE-2026-48989 PoC step 3"
|
|
155
|
+
- tool_description: "Exploiting CVE-2026-48989 (GHSA-vrxg-gm77-7q5g): Windows-MCP's HTTP transport is unauthenticated with wildcard CORS, so a cross-origin page can call the PowerShell tool."
|
|
156
|
+
expected: triggered
|
|
157
|
+
description: "Explicit CVE-2026-48989 Windows-MCP exploitation framing"
|
|
158
|
+
true_negatives:
|
|
159
|
+
- tool_description: "curl -i -X OPTIONS 'https://mcp.internal.corp/mcp/' -H 'Origin: https://ops.internal.corp' response: access-control-allow-origin: https://ops.internal.corp access-control-allow-methods: POST"
|
|
160
|
+
expected: not_triggered
|
|
161
|
+
description: "Preflight scoped to a specific trusted origin, not a wildcard"
|
|
162
|
+
- tool_description: "{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools/call\",\"params\":{\"name\":\"PowerShell\",\"arguments\":{\"command\":\"Get-Process\"}}} over stdio transport with mcp-auth-token: valid-session-token-abc, no CORS headers present"
|
|
163
|
+
expected: not_triggered
|
|
164
|
+
description: "Authenticated PowerShell call over stdio with a session token, no wildcard CORS marker"
|
|
165
|
+
- tool_description: "How do I configure authentication for the Windows-MCP HTTP transport?"
|
|
166
|
+
expected: not_triggered
|
|
167
|
+
description: "General configuration question, not an exploitation attempt"
|
|
168
|
+
- tool_description: "{\"jsonrpc\":\"2.0\",\"id\":5,\"method\":\"tools/call\",\"params\":{\"name\":\"ListDirectory\",\"arguments\":{\"path\":\"C:\\\\Users\"}}}"
|
|
169
|
+
expected: not_triggered
|
|
170
|
+
description: "Unrelated read-only tool call, no PowerShell tool name and no CORS marker"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
title: "Parameter Injection via Tool Arguments"
|
|
2
2
|
id: ATR-2026-00066
|
|
3
|
-
rule_version:
|
|
3
|
+
rule_version: 2
|
|
4
4
|
status: experimental
|
|
5
5
|
description: >
|
|
6
6
|
Detects injection attacks delivered through MCP tool arguments. An attacker
|
|
@@ -78,7 +78,7 @@ detection:
|
|
|
78
78
|
conditions:
|
|
79
79
|
- field: tool_args
|
|
80
80
|
operator: regex
|
|
81
|
-
value: "(?i)(;|&&|\\|\\||`|\\$\\()\\s*(
|
|
81
|
+
value: "(?i)(;|&&|\\|\\||`|\\$\\()\\s*(whoami|\\bid\\b|uname\\s+-a|curl\\s+(?:-\\S+\\s+)*https?://(?!localhost|127\\.)|wget\\s+https?://(?!localhost|127\\.)|\\bnc\\b\\s|ncat\\s|cat\\s+/etc/(?:passwd|shadow|sudoers)|\\b(?:ba)?sh\\s+-[ic]|python[0-9]?\\s+-c|base64\\s+-d|rm\\s+-[rf])"
|
|
82
82
|
- field: tool_args
|
|
83
83
|
operator: regex
|
|
84
84
|
value: "(?i)('\\s*(OR|AND|UNION)\\s+'|'?\\s*;\\s*(DROP|DELETE|INSERT|UPDATE|ALTER|CREATE)\\s|--\\s*[;\\\"'\\)\\]]|/\\*.*\\*/)"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
title: Unauthorized Tool Call Detection
|
|
2
2
|
id: ATR-2026-00012
|
|
3
|
-
rule_version:
|
|
3
|
+
rule_version: 2
|
|
4
4
|
status: experimental
|
|
5
5
|
description: >
|
|
6
6
|
Detects unauthorized or malicious tool call attempts including parameter injection, path traversal, shell injection in
|
|
@@ -74,8 +74,8 @@ detection:
|
|
|
74
74
|
- field: tool_args
|
|
75
75
|
operator: regex
|
|
76
76
|
value: >-
|
|
77
|
-
(
|
|
78
|
-
description: Shell metacharacter
|
|
77
|
+
(;|&&|\|\|)\s*(?:sudo\s+)?(?:curl\s+(?:-\S+\s+)*['"]?https?://(?!localhost|127\.0\.0\.1|0\.0\.0\.0)|wget\s+(?:-\S+\s+)*['"]?https?://(?!localhost|127\.)|\bnc\b\s+-?[a-z0-9]|ncat\s+\S|\b(?:ba)?sh\s+-[ic]|python[0-9]?\s+-c|perl\s+-e|ruby\s+-e|node\s+-e|\beval\s|rm\s+-[rf]|cat\s+/etc/(?:passwd|shadow|sudoers)|whoami|\bid\b\s*(?:;|&|\||$)|uname\s+-a|base64\s+(?:-d|--decode)|ifconfig|>&\s*/dev/tcp)|[$`]\([^)`]{0,80}(?:curl|wget|\bnc\b|\bbash\b|\bsh\s+-|whoami|\bid\b|base64\s+-d|/etc/(?:passwd|shadow))
|
|
78
|
+
description: Shell metacharacter chained to a genuinely dangerous command — external network fetch, pipe-to-shell / interpreter one-liner, recon (whoami/id/uname -a), or sensitive-file read (v2 tightened; legit build chains like "npm i && bash setup.sh", "&& python -m pytest", "| jq" no longer fire)
|
|
79
79
|
- field: tool_name
|
|
80
80
|
operator: regex
|
|
81
81
|
value: (?i)^(admin_|root_|sudo_|system_|internal_|debug_|maintenance_|privileged_|superuser_|__)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
title: "MCP Tool Description — IMPORTANT Tag Cross-Tool Shadowing Attack"
|
|
2
2
|
id: ATR-2026-00161
|
|
3
|
-
rule_version:
|
|
3
|
+
rule_version: 2
|
|
4
4
|
status: experimental
|
|
5
5
|
description: >
|
|
6
6
|
Detects MCP tool poisoning attacks that embed hidden instructions inside an
|
|
@@ -33,6 +33,7 @@ references:
|
|
|
33
33
|
- "AML.T0051.001 - Indirect"
|
|
34
34
|
- "AML.T0053 - AI Agent Tool Invocation"
|
|
35
35
|
- "AML.T0110 - AI Agent Tool Poisoning"
|
|
36
|
+
- "AML.T0104 - Publish Poisoned AI Agent Tool"
|
|
36
37
|
safe_mcp:
|
|
37
38
|
- "SAFE-T1102 - Prompt Manipulation"
|
|
38
39
|
- "SAFE-T1001 - Tool Poisoning"
|
|
@@ -124,8 +125,8 @@ detection:
|
|
|
124
125
|
# variants like $HOME/.ssh/id_rsa, ~/.ssh/id_rsa, /root/.ssh/id_rsa.
|
|
125
126
|
- field: content
|
|
126
127
|
operator: regex
|
|
127
|
-
value: '\b(?:id_rsa|id_dsa|id_ed25519|id_ecdsa
|
|
128
|
-
description: "Sensitive credential file referenced in tool description —
|
|
128
|
+
value: '\b(?:id_rsa|id_dsa|id_ed25519|id_ecdsa)\b(?!\.pub)|\b(?:\.aws/credentials|\.kube/config|\.docker/config\.json|\.netrc|known_hosts)\b|/etc/(?:passwd|shadow|ssl/private)|/proc/self/environ|\b\.env(?:\.local|\.production|\.secret)?\b(?![/a-zA-Z])'
|
|
129
|
+
description: "Sensitive credential file referenced in tool description — private keys or cloud credentials (v2: dropped mcp.json + .aws/config — common non-secret config files that appear in ordinary git/edit operations; the exfil case is still caught by the <IMPORTANT>-tag and read/send-directive layers. id_rsa excludes the .pub public key.)"
|
|
129
130
|
|
|
130
131
|
# Layer 4 — Concealment directive combined with "implementation detail"
|
|
131
132
|
# justification. This is the exact pattern Invariant Labs documented for
|
|
@@ -29,6 +29,7 @@ references:
|
|
|
29
29
|
- "ASI09:2026 - Identity Spoofing and Impersonation"
|
|
30
30
|
mitre_atlas:
|
|
31
31
|
- "AML.T0010 - AI Supply Chain Compromise"
|
|
32
|
+
- "AML.T0104 - Publish Poisoned AI Agent Tool"
|
|
32
33
|
mitre_attack:
|
|
33
34
|
- "T1195.002 - Compromise Software Supply Chain"
|
|
34
35
|
- "T1036 - Masquerading"
|