flawopen.com/AI Security/semantic-kernel-inmemory-vector-filter-cve-2026-26030
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]
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
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]
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]
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]
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]
# 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
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
- ✓Ermitteln Sie alle bereitgestellten Python-Umgebungen mit semantic-kernel und dokumentieren Sie die Version, auch für Container, Notebooks, Worker und CI-Images.[4]
- ✓Aktualisieren Sie betroffene Installationen auf 1.39.4 oder neuer, erzeugen Sie Lockfiles neu und bauen Sie Images mit korrigierten Abhängigkeiten erneut.[1], [3]
- ✓Deaktivieren Sie bis zum Update den InMemoryVectorStore-Filter in Produktion; der Anbieter empfiehlt, diesen Speicher vorübergehend nicht produktiv einzusetzen.[1]
- ✓Ergänzen Sie in jedem PR, der einen Vektorsuchfilter ändert oder hinzufügt, Tests dafür, dass Nutzereingaben, abgerufene Inhalte und Modellargumente die geparste Filterstruktur nicht verändern können; nicht unterstützte Formen müssen abgewiesen werden.[4]
- ✓Ergänzen Sie einen Test, der gesperrte AST-Attribute und freie Namen außerhalb des Lambda-Parameters ablehnt, ohne ausführbare Payloads.[2]
- ✓Stellen Sie modellgewählte Filter als typisierte Daten mit expliziten Listen zulässiger Felder und Operatoren dar; ergänzen Sie Tests, die Ausdruckszeichenfolgen sowie unbekannte Felder oder Operatoren ablehnen.
- ✓Beschränken Sie Datei-, Netzwerk- und Zugangsdatenzugriff der Agenten, um künftige Fehlerfolgen zu begrenzen.[4]
- ✓Ergänzen Sie einen Erkennungstest für den Agent-Host, der beispielhafte Ereignisse für Kindprozesse und ausgehende Verbindungen erzeugt und prüft, dass die bereitgestellte Telemetrieregel beide meldet.[4]