FlawOpen

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

● CVE-2026-26030 · CVSS 9.9[1] · Kritisch
Sicherheitsforschung · FlawOpen

Semantic Kernel CVE-2026-26030: Filter-Code-Injektion

Prompt-beeinflusste Vektorfilter umgingen AST-Prüfungen bis zu Python-eval. Aktualisieren Sie auf SDK 1.39.4 oder neuer.[1], [4]

CVSS-VektorCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H[1]
💡 Einfache Erklärung (ELI5)

Stellen Sie sich eine Bibliothekarin vor, die eine Suchregel auf einer Karte prüft und den Computer die ganze Karte als kleines Programm ausführen lässt. Wer die Karte beeinflussen kann, kann Lücken der Prüfung ausnutzen. CVE-2026-26030 ließ einen modellbeeinflussten Filter aus der Datensuche in die Codeausführung im Anwendungsprozess wechseln.[4]

Kernkonzepte & Begriffe

InMemoryVectorStore
Vektorspeicher im Semantic-Kernel-Prozess; die Suche kann Datensätze vor der Rückgabe filtern.[4]
Filterausdruck
Prädikat, das bestimmt, ob ein Datensatz in einem Vektorsuchergebnis erscheint. Im betroffenen Python-Pfad wurden Textfilter als Python-Ausdrücke geparst und ausgewertet.[4]
Abstrakter Syntaxbaum (AST)
Strukturierte Darstellung geparsten Codes. Eine unvollständige Prüfung kann Wege zur Python-Objektintrospektion offenlassen.[2], [4]
Prompt Injection
Nicht vertrauenswürdiger Text beeinflusst ein KI-Modell zu einer unbeabsichtigten Aktion. Das Risiko hängt davon ab, ob die Anwendung den anfälligen Filter für modellgesteuerte Eingaben öffnet.[4]

Framework-Zuordnungen

  • CWE-Referenz für die in diesem Leitfaden beschriebene Schwachstelle: CWE-94

Schritt-für-Schritt Angriffsablauf

Schritt 1

Der anfällige Filterpfad ist bereitgestellt

Die Anwendung verwendet Semantic Kernel Python vor 1.39.4 und InMemoryVectorStore-Filter. Microsoft stuft das Problem als kritisch ein (CVSS 3.1 9,9; CWE-94) und empfiehlt Version 1.39.4 oder neuer.[1], [4]

Schritt 2

Nicht vertrauenswürdige Inhalte beeinflussen einen modellgewählten Filter

Der Angriff benötigt einen Prompt-Injection-Pfad, der Agenteneingaben beeinflusst, sowie ein Search Plugin mit dem Standardfilter von InMemoryVectorStore. Ein Modellfilter wird nicht allein durch einen typisierten Tool-Aufruf zu vertrauenswürdigem Code.[4]

Schritt 3

Der Filter wird zu Python-Code

Vor der Korrektur wurde der Filter als AST geparst und ohne Builtins ausgewertet, doch die Prüfungen begrenzten den Zugriff auf das Objektmodell nicht ausreichend. Version 1.39.4 behält ast.Subscript für den Zugriff auf Datensatzfelder bei und kombiniert die Knoten-Allowlist mit einer Sperrliste gefährlicher Attribute, auf Lambda-Parameter beschränkten freien Namen und einer Allowlist für Aufrufe. Der Upstream-Code lehnt Subskripte nicht allein ab; eval ohne Builtins ist keine Sandbox.[2], [4]

Schritt 4

Die Ausführung erreicht den Anwendungsprozess

Umgeht der Ausdruck bei der Suche die Prüfung, kann angreifergesteuerte Logik im Python-Prozess des Agenten laufen. Der Zugriff richtet sich nach Rechten, Umgebung, Zugangsdaten und Netzwerkreichweite dieses Prozesses.[4]

Schritt 5

Parsergrenze absichern und Exposition untersuchen

Aktualisieren Sie semantic-kernel auf 1.39.4 oder neuer. Der Patch prüft gefährliche Attribute und beschränkt freie Namen auf den Lambda-Parameter; Microsoft beschreibt zusätzlich AST- und Funktions-Allowlists. Untersuchen Sie Prozess-, Netzwerk- und Zugangsdaten-Anomalien im betroffenen Zeitraum.[1], [2], [3], [4]

Quellcode: Verwundbar vs. Sicher

Der anfällige Bereich zeigt ein repräsentatives Muster, nicht den wörtlichen Produktquelltext: Ein modellgesteuerter Wert wird vor eval in Python-Syntax interpoliert. Der korrigierte Bereich hebt die Upstream-Prüfungen aus Version 1.39.4 hervor. Die konfigurierte AST-Allowlist enthält ast.Subscript für den Zugriff auf Datensatzfelder; der Patch kombiniert sie mit der Sperre gefährlicher Attribute, auf Lambda begrenzten freien Namen und erlaubten Aufrufen. Das Entfernen der Builtins macht eval nicht zur Sandbox. Aktualisieren Sie das Paket und übernehmen Sie diesen Ausschnitt nicht als eigenständigen Validator.[2], [6], [4]

VERWUNDBARE IMPLEMENTIERUNG
# Repräsentatives Muster vor der Korrektur: Modelltext verändert den Ausdruck.
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
GEHÄRTETER SICHERHEITS-PATCH
def validate_filter(self, tree):
    # Gezielte Upstream-Prüfungen aus 1.39.4; Fehlermeldungen gekürzt.
    # Filter auf oberster Ebene müssen Lambda-Ausdrücke sein.
    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

Checkliste für Engineering & Systemsicherheit

Quellen

← AI Security Directory →