flawopen.com/AI Security/semantic-kernel-inmemory-vector-filter-cve-2026-26030
Semantic Kernel CVE-2026-26030: फ़िल्टर कोड इंजेक्शन
प्रॉम्प्ट से प्रभावित वेक्टर फ़िल्टर ने AST जाँच पार करके Python eval तक पहुँच बनाई। SDK को 1.39.4 या नए संस्करण में अपडेट करें।[1], [4]
कल्पना करें कि पुस्तकालयाध्यक्ष को खोज नियम वाली पर्ची मिलती है, वह कुछ परिचित शब्द देखता है और फिर कंप्यूटर से पूरी पर्ची को छोटे प्रोग्राम की तरह चलाने को कहता है। पर्ची को प्रभावित करने वाला व्यक्ति जाँच की कमी का लाभ उठा सकता है। CVE-2026-26030 में मॉडल से प्रभावित फ़िल्टर डेटा खोज से आगे बढ़कर एप्लिकेशन प्रक्रिया में कोड चला सकता था।[4]
इस पेज के मुख्य शब्द
InMemoryVectorStore- प्रक्रिया के भीतर Semantic Kernel का वेक्टर स्टोर; खोज परिणाम से पहले रिकॉर्ड फ़िल्टर कर सकता है।[4]
Filter expression- यह तय करने वाला प्रेडिकेट कि रिकॉर्ड वेक्टर खोज में आएगा या नहीं। प्रभावित Python पथ स्ट्रिंग फ़िल्टर को Python अभिव्यक्ति की तरह पार्स और मूल्यांकित करता था।[4]
Abstract Syntax Tree (AST)- पार्स किए गए कोड का संरचित रूप। अधूरी AST जाँच Python ऑब्जेक्ट introspection का रास्ता छोड़ सकती है।[2], [4]
Prompt injection- अविश्वसनीय पाठ AI मॉडल को प्रभावित कर अनचाही कार्रवाई करवाता है। जोखिम तब है जब एप्लिकेशन मॉडल इनपुट को असुरक्षित फ़िल्टर तक पहुँचाता है।[4]
फ्रेमवर्क मैपिंग
- इस गाइड में बताई गई कमजोरी के लिए CWE संदर्भ: CWE-94
हमले का चरण-दर-चरण प्रवाह
अविश्वसनीय सामग्री मॉडल-चुने फ़िल्टर को प्रभावित करती है
हमले को एजेंट इनपुट प्रभावित करने वाला prompt injection और डिफ़ॉल्ट फ़िल्टर वाला Search Plugin चाहिए। मॉडल से आया फ़िल्टर केवल typed tool call होने से भरोसेमंद नहीं होता।[4]
फ़िल्टर Python कोड बन जाता है
सुधार से पहले फ़िल्टर को AST में पार्स करके builtins हटाने के बाद evaluate किया जाता था, लेकिन जाँच object model traversal को पर्याप्त रूप से सीमित नहीं करती थी। 1.39.4 रिकॉर्ड फ़ील्ड तक पहुँच के लिए ast.Subscript को रहने देता है; साथ में AST node allowlist, खतरनाक attributes की blocklist, bare names को lambda parameters तक सीमित करना और calls की allowlist लागू करता है। Upstream कोड subscript को अकेले अस्वीकार नहीं करता; builtins हटाकर eval करना sandbox नहीं है।[2], [4]
कोड एप्लिकेशन प्रक्रिया में चलता है
जाँच पार होने पर हमलावर-प्रभावित लॉजिक एजेंट के Python process में चल सकता है। पहुँच OS अनुमति, वातावरण, credentials और नेटवर्क पर निर्भर है।[4]
सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन
असुरक्षित pane प्रतिनिधि पैटर्न दिखाता है, उत्पाद का हूबहू स्रोत नहीं: मॉडल-नियंत्रित मान को eval से पहले Python syntax में जोड़ा जाता है। सुरक्षित pane upstream 1.39.4 की जाँचों पर केंद्रित है। कॉन्फ़िगर की गई AST allowlist में record fields के लिए ast.Subscript जानबूझकर शामिल है; patch इसके साथ खतरनाक attributes की रोक, bare names को lambda parameters तक सीमित करना और अनुमत function calls की जाँच जोड़ता है। builtins हटाने से eval sandbox नहीं बनता। पैकेज अपडेट करें; इस अंश को स्वतंत्र validator के रूप में कॉपी न करें।[2], [6], [4]
# सुधार से पहले का प्रतिनिधि पैटर्न: मॉडल-नियंत्रित टेक्स्ट expression बदलता है।
filter_text = f"lambda x: x.city == '{model_selected_city}'"
tree = ast.parse(filter_text, mode="eval")
code = compile(tree, filename="<filter>", mode="eval")
filter_fn = eval(code, {"__builtins__": {}}, {}) # nosec
def validate_filter(self, tree):
# upstream 1.39.4 की केंद्रित जाँच; exception messages संक्षिप्त हैं।
# शीर्ष-स्तरीय फ़िल्टर lambda expressions होने चाहिए।
if not (isinstance(tree, ast.Expression) and isinstance(tree.body, ast.Lambda)):
raise VectorStoreOperationException("Filter must be a lambda expression")
lambda_param_names = {arg.arg for arg in tree.body.args.args}
for node in ast.walk(tree):
if type(node) not in self.allowed_filter_ast_nodes:
raise VectorStoreOperationException("AST node type is not allowed")
if isinstance(node, ast.Attribute) and node.attr in self.blocked_filter_attributes:
raise VectorStoreOperationException("Dangerous attribute is not allowed")
if isinstance(node, ast.Name) and node.id not in lambda_param_names:
raise VectorStoreOperationException("Only lambda parameter names are allowed")
if isinstance(node, ast.Call):
if isinstance(node.func, ast.Name):
func_name = node.func.id
elif isinstance(node.func, ast.Attribute):
func_name = node.func.attr
else:
func_name = None
if func_name and func_name not in self.allowed_filter_functions:
raise VectorStoreOperationException("Function is not allowed")
code = compile(tree, filename="<filter>", mode="eval")
func = eval(code, {"__builtins__": {}}, {}) # nosec
इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट
- ✓semantic-kernel वाले सभी Python वातावरण खोजें और container, notebook, worker, CI image सहित संस्करण दर्ज करें।[4]
- ✓1.39.4 या नए संस्करण में अपडेट कर lockfile और image फिर बनाएँ।[1], [3]
- ✓अपडेट तक production में InMemoryVectorStore फ़िल्टर पथ बंद रखें।[1]
- ✓वेक्टर-सर्च फ़िल्टर जोड़ने या बदलने वाले हर PR में ऐसे परीक्षण जोड़ें जो साबित करें कि उपयोगकर्ता टेक्स्ट, प्राप्त दस्तावेज़ और मॉडल द्वारा दिए गए तर्क फ़िल्टर की पार्स की गई संरचना नहीं बदल सकते; असमर्थित रूपों को अस्वीकार करें।[4]
- ✓चलने योग्य payload के बिना blocked AST attributes और lambda से बाहर के नाम अस्वीकार करने वाला regression test जोड़ें।[2]
- ✓मॉडल द्वारा चुने गए फ़िल्टर को स्पष्ट अनुमत फ़ील्ड और ऑपरेटर वाली टाइप्ड डेटा संरचना के रूप में रखें; expression strings तथा अज्ञात फ़ील्ड या ऑपरेटर को अस्वीकार करने वाले परीक्षण जोड़ें।
- ✓एजेंट को न्यूनतम file, network और credential access दें।[4]
- ✓एजेंट होस्ट के लिए detection regression test जोड़ें: child-process और outbound-connection के प्रतिनिधि events बनाएँ और जाँचें कि तैनात telemetry rule दोनों पर alert करता है।[4]