FlawOpen

flawopen.com/Teardowns/cve-2026-25592-semantic-kernel-agent-file-write

● CVE-2026-25592 · CVSS 9.9[2], [4] · 严重
安全研究 · FlawOpen

CVE-2026-25592:Semantic Kernel 文件写入

CVE-2026-25592 将 Semantic Kernel 下载辅助方法暴露为 AI 工具,可能导致主机文件写入。移除模型访问并升级到 1.71.0。[2]

💡 通俗易懂的原理解析 (ELI5)

快递员可以把包裹从上锁的测试室送到公司办公室。按规定,他只应听从员工的委托,但胸牌也让他服从 AI 助手。恶意便条可能诱使助手选择办公室的抽屉。修复措施是移除让模型能够调用此辅助方法的胸牌;应用代码调用时仍需要限制目标位置。[1], [2]

核心概念与专有名词

KernelFunction
Semantic Kernel 属性,用于向模型公开一个可调用的方法工具。[1], [2]
SessionsPythonPlugin
Semantic Kernel 插件,使智能体可以与隔离的远程 Python 会话中的代码交互。[1], [2]
localFilePath
DownloadFileAsync 接收的可选主机端目标路径。[1], [2]
路径允许列表
只允许在明确配置并规范化的目录内写入的策略。[1], [2], [5]

框架映射

  • 本指南所述弱点的 CWE 参考: CWE-22

根本原因剖析 (Root Cause)

Semantic Kernel for .NET 的 SessionsPythonPlugin 将远程 Python 会话连接到应用主机。DownloadFileAsync 从会话取回文件,并可将返回的字节保存到主机上的 localFilePath。该方法带有 KernelFunction 属性,模型因此能在选择工具时看到其参数。若攻击者能够影响智能体输入,就可能诱使智能体用非预期目标调用此辅助方法。这是工具授权和路径边界失效,并非语言模型本身的缺陷,也不是远程 Python 会话逃逸 sandbox。Microsoft 的修复移除了 DownloadFileAsync 上的 KernelFunction,使模型无法调用它。如果应用代码仍调用该辅助方法,应配置并强制执行明确的允许目录策略;当允许目录列表为空时,上游实现默认允许任意路径。GHSA-2ww3-72rp-wpp4 列出早于 1.71.0 的 NuGet Microsoft.SemanticKernel.Plugins.Core 版本,也列出早于 1.39.3 的 PyPI semantic-kernel 版本;本文聚焦 Microsoft 记录的 .NET 攻击链。[1], [2], [3]

受影响的软件包与修复版本

软件包 / 范围受影响与修复版本本文涵盖的内容
.NET Microsoft.SemanticKernel.Plugins.Core受影响:< 1.71.0;修复:1.71.0 及更高版本。已记录的 SessionsPythonPlugin 链路:模型可调用的 DownloadFileAsync 可能把会话数据写入主机路径。
Python semantic-kernel受影响:< 1.39.3;修复:1.39.3 及更高版本。公告也列出了此软件包。本文不分析 Python 特有的利用链;请单独升级 Python 软件包。
有意将会话文件保存到主机的应用即使移除模型调用能力,也要限制目标路径。在 Function Invocation Filter 或等效授权层中使用明确的规范路径允许列表。上游实现中,空的 AllowedDownloadDirectories 列表不会限制完整路径。

攻击执行流程分解

步骤 1

不可信内容影响智能体

攻击者必须能影响代理的输入,例如代理要处理的内容。Microsoft 记录的链路中,第一次工具调用会先将文件放入隔离的远程 Python 会话;此时文件仍被限制在会话内。[1], [2]

步骤 2

模型看到主机端辅助方法

在受影响的 .NET 部署中,KernelFunction 将 DownloadFileAsync 纳入模型可调用的工具面。[1], [2]

步骤 3

参数跨越信任边界

模型请求远程会话中的文件时可以选择 localFilePath;辅助方法随后在主机进程中处理该路径。[1], [2]

步骤 4

主机写入成为可能

要写入主机,模型必须调用此 helper,并使用受不可信输入影响且不在有效允许目录内的 localFilePath。Microsoft 描述的是受控研究链路,并未声称存在大范围利用。[1], [2]

源代码对比:漏洞与安全实现

上游补丁移除了 DownloadFileAsync 的 KernelFunction 属性,在工具注册边界切断模型访问。该方法签名保留给应用程序有意调用。安全公告还建议用 Function Invocation Filter 和明确的路径允许列表验证 DownloadFileAsync 与 UploadFileAsync 的参数。单独调用 Path.GetFullPath 并不构成授权策略;上游实现中 AllowedDownloadDirectories 为空时也不会限制目标。[2], [3]

源码摘录: 相关方法:`SessionsPythonPlugin` 中的 `DownloadFileAsync`

存在漏洞的实现
[KernelFunction, Description("Downloads a file from the current session.")]
public abstract Task<byte[]> DownloadFileAsync(
    string remoteFileName,
    string? localFilePath = null,
    CancellationToken cancellationToken = default);
加固后的安全修复
[Description("Downloads a file from the current session.")]
public abstract Task<byte[]> DownloadFileAsync(
    string remoteFileName,
    string? localFilePath = null,
    CancellationToken cancellationToken = default);

工程与系统安全加固清单

参考来源