提示词即 shell:智能体框架中提示注入升级为 RCE
Microsoft Semantic Kernel 于 2026 年 5 月 7 日披露的两个 CVE(CVE-2026-25592、CVE-2026-26030)展示了一段被注入的提示如何从文本直接升级为智能体宿主上的远程代码执行。
事件概况
2026 年 5 月 7 日,微软安全响应中心(MSRC)披露了 Semantic Kernel 智能体框架中的两个严重漏洞:.NET SDK 中的 CVE-2026-25592(CVSS 10.0)与 Python SDK 中的 CVE-2026-26030(CVSS 9.8)。两者都能将一次文本层面的提示注入——模型通过不可信内容接收到攻击者控制的指令——升级为承载智能体的宿主上的远程代码执行。补丁同日发布:semantic-kernel Python 1.39.4 与 .NET 1.71.0。
配套的研究博文《When prompts become shells》提炼出一个更广泛的模式:智能体框架向模型暴露工具注册表、沙箱与各种辅助函数,只要任何一个辅助函数触及代码执行汇点(eval、exec、反序列化、文件写入、shell),它就会通过一段精心构造的提示而变得可达。
攻击原理
智能体的工作方式,是把可调用工具的注册表交给 LLM。模型决定调用哪些工具,并提供参数。两个独立漏洞,形式一致:
CVE-2026-26030 —— 内存向量存储中的 Python eval()。 默认的 InMemoryVectorStore 通过把受攻击者影响的字符串拼入用 eval() 编译的 Python lambda 来构造过滤表达式。被注入提示诱导的 LLM 可以请求向量存储用一个执行任意 Python 的负载来过滤记录。
# 概念草图 —— 请勿运行。
# 受不可信内容控制的字段进入了 eval()。
filter_expr = f"lambda r: r.score > {model_supplied_value}"
predicate = eval(filter_expr) # [REDACTED]:负载在宿主进程中运行
CVE-2026-25592 —— .NET 沙箱中以 [KernelFunction] 暴露的 DownloadFileAsync。 SessionsPythonPlugin 把模型生成的代码放进 Azure Container Apps 动态会话执行。一个内部辅助函数 DownloadFileAsync 被误标注为 [KernelFunction],在没有路径校验的情况下注册为可调用工具。一段提示可以让智能体把一个远程文件”下载”到任意本地路径,把攻击者控制的内容写到沙箱之外、写到宿主上。
两种情形的入口都是文本。没有内存破坏,没有浏览器漏洞。模型只是理解请求、挑选工具、把参数交给一个执行汇点。
为何重要
这并不是 Semantic Kernel 独有的故事。2026 年里,同一种模式在多个智能体框架(PraisonAI、Flowise、LMDeploy、mcp-remote 等——见 Adversa AI 的月度追踪)中反复出现。结构性成因完全一致:
- 框架向 LLM 暴露工具注册表;
- 至少有一个工具触及不安全的汇点(
eval、exec、pickle 反序列化、路径写入、shell); - 智能体在同一上下文中处理不可信文本——检索文档、网页、工具结果——与自身指令;
- 数据与指令之间没有被强制执行的边界。
这正是 Simon Willison 于 2025 年 6 月提出的致命三件套(lethal trifecta)——访问私有数据、暴露于不可信内容、具备外部行动能力——以及 Meta AI 安全团队于 2025 年 10 月 31 日提出的二选其二原则(Rule of Two):在单次会话中,智能体应至多持有这三种属性中的两个。三者并存时,确定性的安全保证便会崩塌,文本提示就会变成 shell。
防御措施
缓解措施是架构层面的,而非启发式过滤——单纯的提示词过滤并不足够。
- 优先打补丁。 升级 Semantic Kernel 至 Python
>=1.39.4与 .NET>=1.71.0。对照 Adversa 月度追踪审计生产环境中使用的所有智能体框架。 - 不要把模型提供的字符串送入
eval/exec。 改用结构化解析器(AST 白名单、带类型的过滤 DSL)。微软的修复叠加了四层检查:AST 节点类型白名单、函数调用白名单、危险属性黑名单、名称节点限制。 - 审计工具注册表。 每一个
[KernelFunction]、@tool或暴露的 OpenAPI 端点都对模型可达。把注册表视作公共 API:最小化暴露面、严格参数校验、不要意外暴露任何辅助函数。 - 沙箱化执行器,而非提示。 把任何由模型驱动的代码放进无网络、无宿主写入、除当前任务凭据外别无凭据的容器或 microVM 中执行。
- 遵守”二选其二”原则。 对每个智能体会话,显式决定接受 {不可信输入、敏感数据、外部行动} 中的哪两项,并在架构层强制切断第三项。
- 完整记录工具调用及其参数。 让事后检测成为可能;仅依赖模型原始输出是不够的。
现状
| 框架 | CVE | CVSS | 披露 | 修复版本 |
|---|---|---|---|---|
| Semantic Kernel (.NET) | CVE-2026-25592 | 10.0 | 2026-05-07 | 1.71.0 |
| Semantic Kernel (Python) | CVE-2026-26030 | 9.8 | 2026-05-07 | 1.39.4 |
| PraisonAI | CVE-2026-44338 | 9.x | 2026-04 | 最新版 |
| Flowise MCP adapter | CVE-2026-40933 | 9.x | 2026-04 | 最新版 |
如果您在生产环境运行智能体,问题已经不是是否会有提示注入抵达工具层,而是落在哪个汇点上。请把这些汇点切断。