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.
Files changed (44) hide show
  1. package/README.md +1 -1
  2. package/dist/engine.d.ts +17 -0
  3. package/dist/engine.d.ts.map +1 -1
  4. package/dist/engine.js +127 -53
  5. package/dist/engine.js.map +1 -1
  6. package/dist/hook-handler.d.ts +25 -1
  7. package/dist/hook-handler.d.ts.map +1 -1
  8. package/dist/hook-handler.js +64 -2
  9. package/dist/hook-handler.js.map +1 -1
  10. package/package.json +2 -2
  11. package/rules/context-exfiltration/ATR-2026-01948-netlicensing-mcp-product-number-path-traversal-token-leak.yaml +132 -0
  12. package/rules/context-exfiltration/ATR-2026-01957-m365-copilot-searchleak-open-redirect-exfil.yaml +95 -0
  13. package/rules/context-exfiltration/ATR-2026-01961-meta-ads-mcp-unauth-token-leak.yaml +135 -0
  14. package/rules/context-exfiltration/ATR-2026-01964-langchain-gmailtoolkit-indirect-prompt-injection-email-exfil.yaml +99 -0
  15. package/rules/context-exfiltration/ATR-2026-01984-mcp-server-kubernetes-kubectl-generic-token-exfil.yaml +170 -0
  16. package/rules/privilege-escalation/ATR-2026-00111-shell-escape.yaml +19 -11
  17. package/rules/privilege-escalation/ATR-2026-01933-litellm-user-role-privilege-escalation-cve-2026-47102.yaml +160 -0
  18. package/rules/privilege-escalation/ATR-2026-01934-litellm-allowed-routes-authz-bypass-cve-2026-47101.yaml +161 -0
  19. package/rules/privilege-escalation/ATR-2026-01949-praisonai-mcpserver-unauth-tools-call.yaml +138 -0
  20. package/rules/privilege-escalation/ATR-2026-01974-anything-llm-data-import-access-control.yaml +93 -0
  21. package/rules/privilege-escalation/ATR-2026-01981-network-ai-approval-inbox-unauth-cors-bypass.yaml +152 -0
  22. package/rules/privilege-escalation/ATR-2026-01986-windows-mcp-unauth-http-powershell-cors.yaml +170 -0
  23. package/rules/skill-compromise/ATR-2026-00066-parameter-injection.yaml +2 -2
  24. package/rules/tool-poisoning/ATR-2026-00012-unauthorized-tool-call.yaml +3 -3
  25. package/rules/tool-poisoning/ATR-2026-00161-important-tag-cross-tool-shadowing.yaml +4 -3
  26. package/rules/tool-poisoning/ATR-2026-00581-mcp-tool-rug-pull-post-approval-redefinition.yaml +1 -0
  27. package/rules/tool-poisoning/ATR-2026-01932-shadow-undeclared-mcp-server-registration.yaml +1 -0
  28. package/rules/tool-poisoning/ATR-2026-01935-litellm-custom-code-sandbox-escape-cve-2026-40217.yaml +161 -0
  29. package/rules/tool-poisoning/ATR-2026-01952-praisonai-codemode-sandbox-escape-rce.yaml +125 -0
  30. package/rules/tool-poisoning/ATR-2026-01953-praisonai-codemode-function-ctor-sandbox-escape.yaml +111 -0
  31. package/rules/tool-poisoning/ATR-2026-01959-openhuman-shell-allowlist-env-prefix-bypass.yaml +136 -0
  32. package/rules/tool-poisoning/ATR-2026-01963-praisonai-action-orchestrator-step-target-path-traversal-rce.yaml +99 -0
  33. package/rules/tool-poisoning/ATR-2026-01965-flowise-custommcp-os-command-rce.yaml +137 -0
  34. package/rules/tool-poisoning/ATR-2026-01967-deepchat-mermaid-xss-rce-ipc-mcp-register.yaml +97 -0
  35. package/rules/tool-poisoning/ATR-2026-01968-deepchat-markdown-deeplink-openexternal-rce-bypass.yaml +149 -0
  36. package/rules/tool-poisoning/ATR-2026-01970-praisonai-filetools-normpath-path-traversal.yaml +111 -0
  37. package/rules/tool-poisoning/ATR-2026-01973-anythingllm-logo-endpoint-path-traversal.yaml +95 -0
  38. package/rules/tool-poisoning/ATR-2026-01978-anythingllm-collector-process-filename-path-traversal-delete.yaml +95 -0
  39. package/rules/tool-poisoning/ATR-2026-01979-pandasai-prompt-injection-dunder-sandbox-escape-rce.yaml +105 -0
  40. package/rules/tool-poisoning/ATR-2026-01980-agentic-flow-mcp-tool-param-command-injection.yaml +153 -0
  41. package/rules/tool-poisoning/ATR-2026-01982-dbt-mcp-node-selection-argument-injection.yaml +160 -0
  42. package/rules/tool-poisoning/ATR-2026-01983-mcp-for-stata-log-file-name-command-injection.yaml +170 -0
  43. package/rules/tool-poisoning/ATR-2026-01985-mcp-connect-bridge-unauth-process-spawn-rce.yaml +180 -0
  44. 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"
@@ -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"
@@ -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"
@@ -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: 1
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*(cat|ls|id|whoami|uname|pwd|env|curl|wget|nc|bash|sh|python)"
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: 1
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
- (;|&&|\|\||\$\(|`|\|\s*\w)\s*.{0,50}(curl|wget|nc|ncat|bash|sh|zsh|python|ruby|perl|node|php|powershell|cmd|eval|exec|system|rm\s+-|cat\s+/etc|whoami|id\b|uname|hostname|ifconfig|ipconfig|net\s+user|net\s+localgroup)
78
- description: Shell metacharacter injection followed by dangerous commands
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: 1
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|mcp\.json|\.aws/credentials|\.aws/config|\.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])'
128
- description: "Sensitive credential file referenced in tool description — tool signatures should not need to read private keys or cloud credentials"
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
  mitre_atlas:
30
30
  - "AML.T0053 - AI Agent Tool Invocation"
31
31
  - "AML.T0051.001 - Indirect"
32
+ - "AML.T0104 - Publish Poisoned AI Agent Tool"
32
33
  vulnerablemcp_id:
33
34
  - tool-poisoning-rce-rug-pull
34
35
  external:
@@ -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"