agent-threat-rules 3.5.4 → 3.5.6

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 (59) 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 +4 -3
  11. package/rules/agent-manipulation/ATR-2026-00032-goal-hijacking.yaml +1 -1
  12. package/rules/context-exfiltration/ATR-2026-00201-credential-pipe-exfiltration.yaml +1 -1
  13. package/rules/context-exfiltration/ATR-2026-00524-claude-code-anthropic-base-url-credential-exfil.yaml +1 -1
  14. package/rules/context-exfiltration/ATR-2026-00566-librechat-is-a-chatgpt-clone-with-additi.yaml +1 -1
  15. package/rules/context-exfiltration/ATR-2026-00569-agent-mcp-path-traversal-arbitrary-file-access.yaml +1 -1
  16. package/rules/context-exfiltration/ATR-2026-00571-xss-in-agent-mcp-rendered-output.yaml +1 -1
  17. package/rules/context-exfiltration/ATR-2026-00574-semantic-paraphrased-context-extraction.yaml +1 -1
  18. package/rules/context-exfiltration/ATR-2026-01984-mcp-server-kubernetes-kubectl-generic-token-exfil.yaml +170 -0
  19. package/rules/data-poisoning/ATR-2026-00570-sql-injection-in-agent-tool-query.yaml +1 -1
  20. package/rules/excessive-autonomy/ATR-2026-00051-resource-exhaustion.yaml +1 -1
  21. package/rules/privilege-escalation/ATR-2026-00040-privilege-escalation.yaml +0 -33
  22. package/rules/privilege-escalation/ATR-2026-00111-shell-escape.yaml +19 -11
  23. package/rules/privilege-escalation/ATR-2026-00204-stealth-execution-persistence.yaml +1 -1
  24. package/rules/privilege-escalation/ATR-2026-00539-crewai-codeinterpreter-sandbox-escape-rce.yaml +1 -1
  25. package/rules/privilege-escalation/ATR-2026-00546-crewai-json-loader-local-file-read.yaml +1 -1
  26. package/rules/privilege-escalation/ATR-2026-00547-crewai-rag-url-ssrf-bypass.yaml +1 -1
  27. package/rules/privilege-escalation/ATR-2026-01933-litellm-user-role-privilege-escalation-cve-2026-47102.yaml +160 -0
  28. package/rules/privilege-escalation/ATR-2026-01934-litellm-allowed-routes-authz-bypass-cve-2026-47101.yaml +161 -0
  29. package/rules/privilege-escalation/ATR-2026-01981-network-ai-approval-inbox-unauth-cors-bypass.yaml +152 -0
  30. package/rules/privilege-escalation/ATR-2026-01986-windows-mcp-unauth-http-powershell-cors.yaml +170 -0
  31. package/rules/prompt-injection/ATR-2026-00003-jailbreak-attempt.yaml +1 -1
  32. package/rules/prompt-injection/ATR-2026-00005-multi-turn-injection.yaml +1 -1
  33. package/rules/prompt-injection/ATR-2026-00203-context-pollution-skill-description.yaml +1 -1
  34. package/rules/prompt-injection/ATR-2026-00535-windsurf-ide-zero-click-prompt-injection.yaml +1 -1
  35. package/rules/prompt-injection/ATR-2026-00554-langchain-vulnerable-to-template-injecti.yaml +1 -1
  36. package/rules/prompt-injection/ATR-2026-00565-the-llm-cli-tool-thru-0-27-1-contains-a-.yaml +1 -1
  37. package/rules/prompt-injection/ATR-2026-00573-semantic-paraphrased-injection.yaml +1 -1
  38. package/rules/skill-compromise/ATR-2026-00060-skill-impersonation.yaml +0 -4
  39. package/rules/skill-compromise/ATR-2026-00066-parameter-injection.yaml +2 -2
  40. package/rules/skill-compromise/ATR-2026-00523-claude-code-hooks-session-start-pre-trust-rce.yaml +1 -1
  41. package/rules/tool-poisoning/ATR-2026-00012-unauthorized-tool-call.yaml +3 -3
  42. package/rules/tool-poisoning/ATR-2026-00161-important-tag-cross-tool-shadowing.yaml +4 -3
  43. package/rules/tool-poisoning/ATR-2026-00531-praisonai-unauthenticated-agent-api.yaml +1 -1
  44. package/rules/tool-poisoning/ATR-2026-00532-apache-doris-mcp-sql-injection.yaml +1 -1
  45. package/rules/tool-poisoning/ATR-2026-00533-apache-pinot-mcp-unauthenticated-takeover.yaml +1 -1
  46. package/rules/tool-poisoning/ATR-2026-00534-alibaba-rds-mcp-unauthenticated-metadata-exfil.yaml +1 -1
  47. package/rules/tool-poisoning/ATR-2026-00536-nginx-ui-mcp-unauthenticated-command-execution.yaml +1 -1
  48. package/rules/tool-poisoning/ATR-2026-00561-fastmcp-vulnerable-to-windows-command-in.yaml +1 -1
  49. package/rules/tool-poisoning/ATR-2026-00567-mcp-stdio-config-command-injection.yaml +1 -1
  50. package/rules/tool-poisoning/ATR-2026-00568-agent-ssrf-cloud-metadata-file-inclusion.yaml +1 -1
  51. package/rules/tool-poisoning/ATR-2026-00572-symjack-symlink-config-redirection.yaml +1 -1
  52. package/rules/tool-poisoning/ATR-2026-00581-mcp-tool-rug-pull-post-approval-redefinition.yaml +1 -0
  53. package/rules/tool-poisoning/ATR-2026-01932-shadow-undeclared-mcp-server-registration.yaml +1 -0
  54. package/rules/tool-poisoning/ATR-2026-01935-litellm-custom-code-sandbox-escape-cve-2026-40217.yaml +161 -0
  55. package/rules/tool-poisoning/ATR-2026-01980-agentic-flow-mcp-tool-param-command-injection.yaml +153 -0
  56. package/rules/tool-poisoning/ATR-2026-01982-dbt-mcp-node-selection-argument-injection.yaml +160 -0
  57. package/rules/tool-poisoning/ATR-2026-01983-mcp-for-stata-log-file-name-command-injection.yaml +170 -0
  58. package/rules/tool-poisoning/ATR-2026-01985-mcp-connect-bridge-unauth-process-spawn-rce.yaml +180 -0
  59. package/rules/tool-poisoning/ATR-2026-01987-langroid-sqlchatagent-prompt-to-sql-rce.yaml +165 -0
@@ -0,0 +1,160 @@
1
+ title: "LiteLLM User-Role Privilege Escalation (CVE-2026-47102)"
2
+ id: ATR-2026-01933
3
+ rule_version: 1
4
+ status: draft
5
+ description: >
6
+ Detects CVE-2026-47102 (CVSS 9.9 chain, CWE-269): LiteLLM's user-management
7
+ endpoints /user/update and /user/bulk_update modify security-sensitive
8
+ fields without field-level authorization. A low-privilege authenticated
9
+ caller (e.g. internal_user) can write the user_role field directly and
10
+ self-promote to proxy_admin, gaining full administrative control of the
11
+ LiteLLM proxy. Affected: LiteLLM before 1.83.10.
12
+
13
+ Detection covers:
14
+ (a) /user/update or /user/bulk_update payload that sets user_role to an
15
+ administrative role (proxy_admin / admin);
16
+ (b) the bulk_update array form where a user object escalates user_role;
17
+ (c) explicit CVE-2026-47102 exploitation framing.
18
+
19
+ The detection target is the request shape — an admin-role write at the
20
+ user-update endpoint — which is the exact privilege-escalation primitive,
21
+ caught before the proxy applies the role change.
22
+ author: "ATR Community"
23
+ date: "2026/06/26"
24
+ schema_version: "0.1"
25
+ detection_tier: pattern
26
+ maturity: test
27
+ severity: critical
28
+
29
+ references:
30
+ owasp_llm:
31
+ - "LLM06:2025 - Excessive Agency"
32
+ owasp_agentic:
33
+ - "ASI06:2026 - Tool Misuse"
34
+ - "ASI03:2026 - Privilege Compromise"
35
+ mitre_atlas:
36
+ - "AML.T0049 - Exploit Public-Facing Application"
37
+ mitre_attack:
38
+ - "T1068 - Exploitation for Privilege Escalation"
39
+ - "T1078 - Valid Accounts"
40
+ cve:
41
+ - "CVE-2026-47102"
42
+
43
+ metadata_provenance:
44
+ mitre_atlas: human-reviewed
45
+ owasp_llm: human-reviewed
46
+ owasp_agentic: human-reviewed
47
+
48
+ compliance:
49
+ eu_ai_act:
50
+ - article: "15"
51
+ context: >
52
+ CVE-2026-47102 lets a low-privilege caller write user_role directly
53
+ at the LiteLLM user-update endpoint and self-promote to proxy_admin;
54
+ Article 15 cybersecurity requirements mandate field-level
55
+ authorization on AI proxy account-management APIs.
56
+ strength: primary
57
+ - article: "9"
58
+ context: "Article 9 (risk management system) requires identified risks to be addressed by appropriate measures; this rule is a runtime risk-treatment control that detects the privilege-escalation technique (LiteLLM User-Role Privilege Escalation (CVE-2026-47102))."
59
+ strength: secondary
60
+ nist_ai_rmf:
61
+ - subcategory: "MP.5.1"
62
+ context: >
63
+ An attacker-controlled user_role write reaching the proxy is an
64
+ adversarial input; MP.5.1 requires scanning user-management payloads
65
+ for unauthorized administrative role escalation.
66
+ strength: primary
67
+ - subcategory: "MG.3.2"
68
+ context: "NIST AI RMF MANAGE 3.2 is supported where this rule detects the privilege-escalation technique (LiteLLM User-Role Privilege Escalation (CVE-2026-47102))."
69
+ strength: secondary
70
+ iso_42001:
71
+ - clause: "8.1"
72
+ context: >
73
+ Operational controls must detect user-management payloads that set an
74
+ administrative user_role at the LiteLLM update endpoint before the
75
+ proxy applies the role change.
76
+ strength: primary
77
+ - clause: "8.3"
78
+ context: "ISO/IEC 42001 Clause 8.3 (AI risk treatment) is supported by this rule, which implements runtime detection of the privilege-escalation technique (LiteLLM User-Role Privilege Escalation (CVE-2026-47102)) as a treatment control."
79
+ strength: secondary
80
+
81
+ tags:
82
+ category: privilege-escalation
83
+ subcategory: role-write-bypass
84
+ scan_target: llm_io
85
+ confidence: high
86
+ source: cve-disclosure
87
+ vendor_sources: litellm-cve-2026-47102
88
+
89
+ agent_source:
90
+ type: llm_io
91
+ framework:
92
+ - litellm
93
+ - any
94
+ provider:
95
+ - any
96
+
97
+ detection:
98
+ condition: any
99
+ false_positives:
100
+ - "Legitimate proxy_admin provisioning a new administrator through /user/update — expected to match; review confirms intent."
101
+ - "Security advisory or PR text quoting the CVE-2026-47102 payload."
102
+ - "User updates that set a non-administrative role (internal_user, internal_user_viewer)."
103
+ conditions:
104
+ - field: content
105
+ operator: regex
106
+ value: '(?i)/user/(?:update|bulk_update)[\s\S]{0,400}["\x27]?user_role["\x27]?\s*[:=]\s*["\x27]?(?:proxy_admin|proxy[_-]admin)\b'
107
+ description: >
108
+ /user/update or /user/bulk_update payload writing user_role to an
109
+ administrative proxy_admin value — direct CVE-2026-47102 escalation.
110
+ - field: content
111
+ operator: regex
112
+ value: '(?i)["\x27]user_role["\x27]\s*:\s*["\x27]proxy_admin["\x27][\s\S]{0,300}["\x27]user_id["\x27]\s*:|["\x27]user_id["\x27]\s*:[\s\S]{0,300}["\x27]user_role["\x27]\s*:\s*["\x27]proxy_admin["\x27]'
113
+ description: >
114
+ A user object pairing a user_id with a user_role of proxy_admin in an
115
+ update body — the bulk_update self-promotion shape.
116
+ - field: content
117
+ operator: regex
118
+ value: '(?i)CVE-2026-47102[\s\S]{0,200}(?:litellm|user_role|proxy_admin|privileg|escalat)'
119
+ description: >
120
+ Explicit CVE-2026-47102 reference combined with LiteLLM role-escalation
121
+ language — attack framing in a skill or tool description.
122
+
123
+ response:
124
+ actions:
125
+ - alert
126
+ - block_input
127
+ message_template: >
128
+ [ATR-2026-01933] CRITICAL: LiteLLM user_role privilege escalation detected
129
+ (CVE-2026-47102, CWE-269). A user-update payload writes an administrative
130
+ proxy_admin role; LiteLLM before 1.83.10 applies this without field-level
131
+ authorization. Block the request and upgrade LiteLLM to >= 1.83.10.
132
+
133
+ confidence: 80
134
+
135
+ wild_fp_rate: 0
136
+
137
+ test_cases:
138
+ true_positives:
139
+ - input: "POST /user/update {\"user_id\": \"u_self\", \"user_role\": \"proxy_admin\"}"
140
+ expected: triggered
141
+ description: "Low-priv user self-promotes to proxy_admin via /user/update"
142
+ - input: "POST /user/bulk_update {\"users\": [{\"user_id\": \"u_self\", \"user_role\": \"proxy_admin\"}]}"
143
+ expected: triggered
144
+ description: "bulk_update array escalates a user to proxy_admin"
145
+ - input: "Exploiting CVE-2026-47102 on LiteLLM: set user_role to proxy_admin via /user/update to escalate privilege."
146
+ expected: triggered
147
+ description: "Explicit CVE-2026-47102 LiteLLM escalation framing"
148
+ true_negatives:
149
+ - input: "POST /user/update {\"user_id\": \"u_123\", \"max_budget\": 100}"
150
+ expected: not_triggered
151
+ description: "Legitimate budget update, no user_role field"
152
+ - input: "POST /user/update {\"user_id\": \"u_123\", \"user_role\": \"internal_user\"}"
153
+ expected: not_triggered
154
+ description: "Setting a non-administrative role"
155
+ - input: "How do I update a user's role in the LiteLLM proxy?"
156
+ expected: not_triggered
157
+ description: "General question, not an update payload writing proxy_admin"
158
+ - input: "GET /user/info?user_id=u_123"
159
+ expected: not_triggered
160
+ description: "Read-only user lookup"
@@ -0,0 +1,161 @@
1
+ title: "LiteLLM allowed_routes Authorization Bypass (CVE-2026-47101)"
2
+ id: ATR-2026-01934
3
+ rule_version: 1
4
+ status: draft
5
+ description: >
6
+ Detects CVE-2026-47101 (CVSS 9.9 chain, CWE-285): LiteLLM's virtual-key
7
+ endpoints /key/generate, /key/update, /key/regenerate and
8
+ /key/service-account/generate accept an allowed_routes parameter without
9
+ validating it against the caller's own role. A low-privilege internal_user
10
+ can mint or update a key whose allowed_routes reach administrative routes
11
+ (user/key/team/global management), bypassing route authorization and
12
+ pivoting toward proxy_admin functionality. Affected: LiteLLM before 1.83.14.
13
+
14
+ Detection covers:
15
+ (a) a /key/* generation or update payload whose allowed_routes include
16
+ administrative/management routes or a wildcard;
17
+ (b) explicit CVE-2026-47101 exploitation framing.
18
+
19
+ The detection target is the request shape — a key-mint that grants itself
20
+ admin routes via allowed_routes — i.e. the authorization-bypass primitive.
21
+ author: "ATR Community"
22
+ date: "2026/06/26"
23
+ schema_version: "0.1"
24
+ detection_tier: pattern
25
+ maturity: test
26
+ severity: critical
27
+
28
+ references:
29
+ owasp_llm:
30
+ - "LLM06:2025 - Excessive Agency"
31
+ owasp_agentic:
32
+ - "ASI06:2026 - Tool Misuse"
33
+ - "ASI03:2026 - Privilege Compromise"
34
+ mitre_atlas:
35
+ - "AML.T0049 - Exploit Public-Facing Application"
36
+ mitre_attack:
37
+ - "T1068 - Exploitation for Privilege Escalation"
38
+ - "T1078 - Valid Accounts"
39
+ cve:
40
+ - "CVE-2026-47101"
41
+
42
+ metadata_provenance:
43
+ mitre_atlas: human-reviewed
44
+ owasp_llm: human-reviewed
45
+ owasp_agentic: human-reviewed
46
+
47
+ compliance:
48
+ eu_ai_act:
49
+ - article: "15"
50
+ context: >
51
+ CVE-2026-47101 lets a low-privilege caller mint a LiteLLM key whose
52
+ allowed_routes reach administrative routes; Article 15 cybersecurity
53
+ requirements mandate that route grants on AI proxy key-management APIs
54
+ be validated against the caller's own role.
55
+ strength: primary
56
+ - article: "9"
57
+ context: "Article 9 (risk management system) requires identified risks to be addressed by appropriate measures; this rule is a runtime risk-treatment control that detects the privilege-escalation technique (LiteLLM allowed_routes Authorization Bypass (CVE-2026-47101))."
58
+ strength: secondary
59
+ nist_ai_rmf:
60
+ - subcategory: "MP.5.1"
61
+ context: >
62
+ An attacker-controlled allowed_routes grant reaching the proxy is an
63
+ adversarial input; MP.5.1 requires scanning key-management payloads for
64
+ unauthorized administrative route grants.
65
+ strength: primary
66
+ - subcategory: "MG.3.2"
67
+ context: "NIST AI RMF MANAGE 3.2 is supported where this rule detects the privilege-escalation technique (LiteLLM allowed_routes Authorization Bypass (CVE-2026-47101))."
68
+ strength: secondary
69
+ iso_42001:
70
+ - clause: "8.1"
71
+ context: >
72
+ Operational controls must detect key-management payloads that grant
73
+ administrative allowed_routes at the LiteLLM key endpoints before the
74
+ proxy issues the over-privileged key.
75
+ strength: primary
76
+ - clause: "8.3"
77
+ context: "ISO/IEC 42001 Clause 8.3 (AI risk treatment) is supported by this rule, which implements runtime detection of the privilege-escalation technique (LiteLLM allowed_routes Authorization Bypass (CVE-2026-47101)) as a treatment control."
78
+ strength: secondary
79
+
80
+ tags:
81
+ category: privilege-escalation
82
+ subcategory: route-grant-bypass
83
+ scan_target: llm_io
84
+ confidence: high
85
+ source: cve-disclosure
86
+ vendor_sources: litellm-cve-2026-47101
87
+
88
+ agent_source:
89
+ type: llm_io
90
+ framework:
91
+ - litellm
92
+ - any
93
+ provider:
94
+ - any
95
+
96
+ detection:
97
+ condition: any
98
+ false_positives:
99
+ - "A proxy_admin generating a key with broad allowed_routes intentionally — expected to match; review confirms intent."
100
+ - "Security advisory or PR text quoting the CVE-2026-47101 payload."
101
+ - "Key generation scoped to inference routes only (/chat/completions, /embeddings, /v1/models)."
102
+ conditions:
103
+ - field: content
104
+ operator: regex
105
+ value: '(?i)/key/(?:generate|update|regenerate|service-account/generate)[\s\S]{0,400}["\x27]?allowed_routes["\x27]?\s*[:=][\s\S]{0,200}(?:["\x27]/(?:user|key|team|global|organization|customer)/|["\x27]/?\*["\x27]|management_routes|admin_only_routes)'
106
+ description: >
107
+ A /key/* generation or update payload whose allowed_routes reach
108
+ administrative/management routes or a wildcard — CVE-2026-47101
109
+ authorization bypass shape.
110
+ - field: content
111
+ operator: regex
112
+ value: '(?i)["\x27]allowed_routes["\x27]\s*:\s*\[[^\]]*(?:["\x27]/(?:user|key|team|global)/(?:new|update|delete|bulk_update)|["\x27]/?\*["\x27]|/key/generate)[^\]]*\][\s\S]{0,300}(?:litellm|/key/(?:generate|service-account))'
113
+ description: >
114
+ An allowed_routes array containing admin management routes or a
115
+ wildcard in a LiteLLM key-mint body.
116
+ - field: content
117
+ operator: regex
118
+ value: '(?i)CVE-2026-47101[\s\S]{0,200}(?:litellm|allowed_routes|authoriz|bypass|route)'
119
+ description: >
120
+ Explicit CVE-2026-47101 reference combined with LiteLLM route-bypass
121
+ language — attack framing in a skill or tool description.
122
+
123
+ response:
124
+ actions:
125
+ - alert
126
+ - block_input
127
+ message_template: >
128
+ [ATR-2026-01934] CRITICAL: LiteLLM allowed_routes authorization bypass
129
+ detected (CVE-2026-47101, CWE-285). A key-mint payload grants itself
130
+ administrative routes; LiteLLM before 1.83.14 does not validate
131
+ allowed_routes against the caller's role. Block the request and upgrade
132
+ LiteLLM to >= 1.83.14.
133
+
134
+ confidence: 78
135
+
136
+ wild_fp_rate: 0
137
+
138
+ test_cases:
139
+ true_positives:
140
+ - input: "POST /key/generate {\"allowed_routes\": [\"/user/new\", \"/user/update\", \"/chat/completions\"]}"
141
+ expected: triggered
142
+ description: "internal_user mints a key granting admin user-management routes"
143
+ - input: "POST /key/service-account/generate {\"allowed_routes\": [\"*\"]}"
144
+ expected: triggered
145
+ description: "Service-account key minted with wildcard allowed_routes"
146
+ - input: "CVE-2026-47101: on LiteLLM call /key/generate with allowed_routes including /key/generate to bypass route authorization."
147
+ expected: triggered
148
+ description: "Explicit CVE-2026-47101 LiteLLM route-bypass framing"
149
+ true_negatives:
150
+ - input: "POST /key/generate {\"models\": [\"gpt-4o\"], \"allowed_routes\": [\"/chat/completions\", \"/embeddings\"]}"
151
+ expected: not_triggered
152
+ description: "Key scoped to inference routes only"
153
+ - input: "POST /key/generate {\"duration\": \"24h\", \"max_budget\": 50}"
154
+ expected: not_triggered
155
+ description: "Key generation with no allowed_routes grant"
156
+ - input: "What does the allowed_routes field do when generating a LiteLLM key?"
157
+ expected: not_triggered
158
+ description: "General question about the field, not an admin-route grant"
159
+ - input: "GET /key/info?key=sk-abc123"
160
+ expected: not_triggered
161
+ description: "Read-only key lookup"
@@ -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"
@@ -16,7 +16,7 @@ author: "ATR Community"
16
16
  date: "2026/03/08"
17
17
  schema_version: "0.1"
18
18
  detection_tier: pattern
19
- maturity: "experimental"
19
+ maturity: test
20
20
  severity: high
21
21
 
22
22
  references:
@@ -15,7 +15,7 @@ author: "ATR Community"
15
15
  date: "2026/03/08"
16
16
  schema_version: "0.1"
17
17
  detection_tier: pattern
18
- maturity: experimental
18
+ maturity: test
19
19
  severity: medium
20
20
 
21
21
  references:
@@ -12,7 +12,7 @@ author: "TYSYS (Wind) — skill-sanitizer project"
12
12
  date: "2026/04/05"
13
13
  schema_version: "0.1"
14
14
  detection_tier: pattern
15
- maturity: test
15
+ maturity: stable
16
16
  severity: high
17
17
 
18
18
  references: