flawopen.com/AI Security/semantic-kernel-inmemory-vector-filter-cve-2026-26030
Semantic Kernel CVE-2026-26030:过滤器代码注入
受提示词影响的向量过滤器绕过 AST 检查并进入 Python eval,使代码可在代理应用进程中执行。请升级到 1.39.4 或更高版本。[1], [4]
💡 通俗易懂的原理解析 (ELI5)
想象一位图书管理员收到搜索规则卡片,检查几个熟悉的词后,让计算机把整张卡片当作小程序执行。能影响卡片的人可以利用检查缺口。CVE-2026-26030 使受模型影响的过滤器从数据查询跨越到应用进程中的代码执行。[4]
核心概念与专有名词
InMemoryVectorStore- Semantic Kernel 进程内的向量存储;搜索可在返回结果前过滤记录。[4]
Filter expression- 决定记录能否出现在向量搜索结果中的谓词。受影响的 Python 路径会将字符串过滤器解析并作为 Python 表达式求值。[4]
Prompt injection- 不可信文本影响 AI 模型并诱发非预期操作。风险取决于应用是否将易受攻击的过滤路径暴露给模型输入。[4]
框架映射
- 本指南所述弱点的 CWE 参考: CWE-94
攻击执行流程分解
源代码对比:漏洞与安全实现
易受攻击的代码块是代表性模式,并非产品原始代码:模型控制的值在 eval 前被插入 Python 语法。修复代码块聚焦于上游 1.39.4 的检查。配置的 AST 白名单有意包含用于访问记录字段的 ast.Subscript;补丁将节点白名单与危险属性阻止列表、仅限 lambda 参数的独立名称以及允许的函数调用检查结合起来。移除 builtins 并不会让 eval 成为沙箱。请升级软件包,不要把此片段复制为独立验证器。[2], [6], [4]
存在漏洞的实现
# 修复前的代表性模式:模型控制的文本会改变表达式。
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):
# 上游 1.39.4 的关键检查;异常消息已缩短。
# 顶层过滤器必须是 lambda 表达式。
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 环境并记录版本,包括容器、notebook、worker 和 CI 镜像。[4]
- ✓升级到 1.39.4 或更高版本,重建锁文件和镜像。[1], [3]
- ✓升级完成前,在生产环境停用 InMemoryVectorStore 过滤器。[1]
- ✓每个新增或修改向量搜索过滤器的 PR 都应包含测试,证明用户文本、检索内容和模型提供的参数无法改变过滤器解析后的结构;对不支持的形式必须拒绝。[4]
- ✓添加回归测试,拒绝危险 AST 属性及 lambda 参数以外名称,不使用可执行载荷。[2]
- ✓将模型选择的过滤条件表示为类型化数据,并明确列出允许的字段和运算符;添加测试以拒绝表达式字符串以及未知字段或运算符。
- ✓限制智能体的文件、网络和凭据权限。[4]
- ✓添加代理主机检测回归测试,生成代表性的子进程和出站连接事件,并断言已部署的遥测规则会对两者发出告警。[4]