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.
- 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 +4 -3
- package/rules/agent-manipulation/ATR-2026-00032-goal-hijacking.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-00201-credential-pipe-exfiltration.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-00524-claude-code-anthropic-base-url-credential-exfil.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-00566-librechat-is-a-chatgpt-clone-with-additi.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-00569-agent-mcp-path-traversal-arbitrary-file-access.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-00571-xss-in-agent-mcp-rendered-output.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-00574-semantic-paraphrased-context-extraction.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-01984-mcp-server-kubernetes-kubectl-generic-token-exfil.yaml +170 -0
- package/rules/data-poisoning/ATR-2026-00570-sql-injection-in-agent-tool-query.yaml +1 -1
- package/rules/excessive-autonomy/ATR-2026-00051-resource-exhaustion.yaml +1 -1
- package/rules/privilege-escalation/ATR-2026-00040-privilege-escalation.yaml +0 -33
- package/rules/privilege-escalation/ATR-2026-00111-shell-escape.yaml +19 -11
- package/rules/privilege-escalation/ATR-2026-00204-stealth-execution-persistence.yaml +1 -1
- package/rules/privilege-escalation/ATR-2026-00539-crewai-codeinterpreter-sandbox-escape-rce.yaml +1 -1
- package/rules/privilege-escalation/ATR-2026-00546-crewai-json-loader-local-file-read.yaml +1 -1
- package/rules/privilege-escalation/ATR-2026-00547-crewai-rag-url-ssrf-bypass.yaml +1 -1
- 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-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/prompt-injection/ATR-2026-00003-jailbreak-attempt.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00005-multi-turn-injection.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00203-context-pollution-skill-description.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00535-windsurf-ide-zero-click-prompt-injection.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00554-langchain-vulnerable-to-template-injecti.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00565-the-llm-cli-tool-thru-0-27-1-contains-a-.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00573-semantic-paraphrased-injection.yaml +1 -1
- package/rules/skill-compromise/ATR-2026-00060-skill-impersonation.yaml +0 -4
- package/rules/skill-compromise/ATR-2026-00066-parameter-injection.yaml +2 -2
- package/rules/skill-compromise/ATR-2026-00523-claude-code-hooks-session-start-pre-trust-rce.yaml +1 -1
- 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-00531-praisonai-unauthenticated-agent-api.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-00532-apache-doris-mcp-sql-injection.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-00533-apache-pinot-mcp-unauthenticated-takeover.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-00534-alibaba-rds-mcp-unauthenticated-metadata-exfil.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-00536-nginx-ui-mcp-unauthenticated-command-execution.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-00561-fastmcp-vulnerable-to-windows-command-in.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-00567-mcp-stdio-config-command-injection.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-00568-agent-ssrf-cloud-metadata-file-inclusion.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-00572-symjack-symlink-config-redirection.yaml +1 -1
- 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-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,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"
|
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"
|