FlawOpen

flawopen.com/AI Security/semantic-kernel-inmemory-vector-filter-cve-2026-26030

● CVE-2026-26030 · CVSS 9.9[1] · अति गंभीर
सुरक्षा अनुसंधान · FlawOpen

Semantic Kernel CVE-2026-26030: फ़िल्टर कोड इंजेक्शन

प्रॉम्प्ट से प्रभावित वेक्टर फ़िल्टर ने AST जाँच पार करके Python eval तक पहुँच बनाई। SDK को 1.39.4 या नए संस्करण में अपडेट करें।[1], [4]

CVSS वेक्टरCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H[1]
💡 आसान भाषा में (ELI5)

कल्पना करें कि पुस्तकालयाध्यक्ष को खोज नियम वाली पर्ची मिलती है, वह कुछ परिचित शब्द देखता है और फिर कंप्यूटर से पूरी पर्ची को छोटे प्रोग्राम की तरह चलाने को कहता है। पर्ची को प्रभावित करने वाला व्यक्ति जाँच की कमी का लाभ उठा सकता है। 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

हमले का चरण-दर-चरण प्रवाह

चरण 1

असुरक्षित फ़िल्टर पथ तैनात है

एप्लिकेशन Semantic Kernel Python 1.39.4 से पुराना और InMemoryVectorStore फ़िल्टर उपयोग करता है। Microsoft इसे Critical (CVSS 3.1 9.9, CWE-94) कहता है और 1.39.4 या नया संस्करण सुझाता है।[1], [4]

चरण 2

अविश्वसनीय सामग्री मॉडल-चुने फ़िल्टर को प्रभावित करती है

हमले को एजेंट इनपुट प्रभावित करने वाला prompt injection और डिफ़ॉल्ट फ़िल्टर वाला Search Plugin चाहिए। मॉडल से आया फ़िल्टर केवल typed tool call होने से भरोसेमंद नहीं होता।[4]

चरण 3

फ़िल्टर 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]

चरण 4

कोड एप्लिकेशन प्रक्रिया में चलता है

जाँच पार होने पर हमलावर-प्रभावित लॉजिक एजेंट के Python process में चल सकता है। पहुँच OS अनुमति, वातावरण, credentials और नेटवर्क पर निर्भर है।[4]

चरण 5

पार्सर सीमा सुधारें और जोखिम जाँचें

semantic-kernel को 1.39.4 या नए संस्करण में अपडेट करें। पैच खतरनाक attributes जाँचता और bare names को lambda parameter तक सीमित करता है। प्रभावित समय में प्रक्रिया, नेटवर्क और credentials की विसंगतियाँ जाँचें।[1], [2], [3], [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

इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट

स्रोत

← AI Security Directory →