当提示变成 shell:智能体框架中从提示注入到 RCE 的攻击链
2026 年初披露的两个 Microsoft Semantic Kernel CVE 和四个 CrewAI CVE,将一次提示注入转化为宿主机上的远程代码执行。该模式是结构性的,而非偶发。
这是什么
2026 年上半年,多个智能体框架先后披露了一类漏洞:仅通过一条精心构造的提示——直接输入或经由间接注入——即可在运行智能体的宿主机上获得可用的远程代码执行(RCE)。2026 年 5 月 7 日,Microsoft Defender 安全研究团队发布了对 Microsoft Semantic Kernel 中两个相关漏洞(CVE-2026-25592 与 CVE-2026-26030)的深度分析。六周之前,2026 年 3 月 30 日,CERT/CC 发布了 VU#221883,描述了 CrewAI 中的四个 CVE(CVE-2026-2275、2285、2286、2287),它们将提示注入串联为任意文件读取、SSRF 与远程代码执行。
框架各异,但底层漏洞类别完全一致。本文讨论的就是这一类别。
工作原理
不同披露呈现出相同的模式。LLM 完全按照训练目标行事:把自然语言指令解析为结构化工具调用。漏洞位于其下一层,即模型输出与执行工具的运行时之间的胶水代码。
在 Semantic Kernel 的 In-Memory Vector Store(CVE-2026-26030)中,搜索过滤器是通过字符串拼接构造的 Python lambda,然后传入 eval()。一个黑名单试图拦截明显的危险调用(eval、exec、open、__import__),却没有覆盖通过 Python 类型层级进行的属性访问。模型可控的参数能够闭合字符串、遍历 ().__class__.__bases__[0].__subclasses__()、定位 BuiltinImporter 并执行 os.system("calc.exe")。
# 简化后的脆弱模式
new_filter = f"lambda x: x.city == '{kwargs[param.name]}'"
# kwargs[param.name] 由模型控制,只被一个不覆盖属性遍历的
# Python AST 黑名单过滤。
eval(new_filter, {"__builtins__": {}}) # 仍可通过 tuple().__class__... 抵达
Semantic Kernel 的第二个漏洞(CVE-2026-25592)更为简单:.NET 沙箱插件中的 DownloadFileAsync 被错误地标注了 [KernelFunction],导致 File.WriteAllBytes 这一无边界原语被直接暴露给模型。攻击者可诱导模型把载荷写入 Windows 启动文件夹,从设计上绕过了沙箱。
在 CrewAI 中,Code Interpreter Tool 本应在 Docker 容器内运行不可信 Python。当 Docker 不可达时,该工具会静默回退到进程内 Python 沙箱,而该沙箱的黑名单未包含 ctypes 模块——因此任意 C 调用重新打开宿主机上的 RCE 通道(CVE-2026-2275、CVE-2026-2287)。同次披露还包含 RAG 搜索工具中的 SSRF(CVE-2026-2286)与 JSON 加载器中的任意本地文件读取(CVE-2026-2285),共同为攻击者提供足以串联到凭据窃取的原语。
按照 MITRE ATLAS 的术语,该技术是 AML.T0051(LLM 提示注入)级联到 AML.T0016(获取能力)。
为何重要
模型不再只是生成文本——它在选择工具、提供参数,并在宿主机上触发副作用。任何模型可影响的参数都必须视为攻击者可控,正如经典 Web 安全中处理查询字符串参数一样。
这并非奇异的 0-day。Semantic Kernel 在 GitHub 拥有逾 27,000 颗星,被嵌入 Microsoft 365 Copilot 的多项集成中。CrewAI 在多智能体演示与生产试点中被广泛使用。受影响的代码路径是默认配置,而间接注入(被投毒的 RAG 文档、智能体访问的恶意网页、被污染的工具响应)即可触发攻击——攻击者无需对用户聊天具有特权访问。
防御
Microsoft 团队总结了核心教训:你的 LLM 不是安全边界。你暴露的工具决定了攻击者的影响范围。具体而言:
- 优先打补丁。 将
semantic-kernel升级到 Python ≥ 1.39.4、.NET ≥ 1.71.0。对于 CrewAI,关闭allow_code_execution=True,在可能的情况下移除 Code Interpreter Tool,并确保 Docker 真实运行——禁止静默回退至进程内沙箱。 - 将工具参数视为不可信输入。 切勿将模型提供的字符串交给
eval、exec、动态 SQL、shell、File.WriteAllBytes或任何等价的危险接收点。使用参数化 API 或严格的白名单;动态语言中的黑名单从结构上即注定失败。 - 审计工具注册表。 暴露给模型的每个函数都构成攻击面。从不应被模型调用的对象上移除装饰器(
[KernelFunction]、@tool)。 - 宿主侧纵深防御。 对智能体进程实施端点检测:对 shell 启动、写入启动目录、运行时发起的对外连接发出告警。Microsoft 博客发布了可用于 Defender XDR 的 KQL 狩猎查询。
- 调查脆弱窗口期。 若曾运行受影响版本,补丁关闭了漏洞,却无法回答你是否已被利用。请界定从部署到升级的窗口期,并在该窗口内排查宿主侧的后利用遥测。
状态
| 框架 | CVE | 披露日期 | 修复版本 |
|---|---|---|---|
| Semantic Kernel(Python) | CVE-2026-26030 | 2026-05-07 | 1.39.4 |
| Semantic Kernel(.NET) | CVE-2026-25592 | 2026-05-07 | 1.71.0 |
| CrewAI Code Interpreter | CVE-2026-2275 | 2026-03-30 | 部分修复——下一版本将把 ctypes 加入黑名单 |
| CrewAI Docker 回退 | CVE-2026-2287 | 2026-03-30 | 部分修复——fail-closed 选项评估中 |
| CrewAI JSON 加载器 | CVE-2026-2285 | 2026-03-30 | 截至本文撰写时尚无完整补丁 |
| CrewAI RAG 搜索 SSRF | CVE-2026-2286 | 2026-03-30 | 截至本文撰写时尚无完整补丁 |
Microsoft 团队已宣布将持续推出该系列研究;未来数周内可预期在其他框架中出现类似发现。CrewAI 漏洞由 Cyata 的 Yarden Porat 报告;Semantic Kernel 漏洞由 Microsoft Defender 安全研究团队的 Uri Oren、Amit Eliahu 与 Dor Edry 报告。