flawopen.com/Teardowns/cve-2026-25592-semantic-kernel-agent-file-write
CVE-2026-25592: Gravação de arquivo no Semantic Kernel
CVE-2026-25592 expôs o download do Semantic Kernel como ferramenta de IA e permitiu gravar no host. Remova o acesso do modelo e atualize.[2]
Um mensageiro pode levar um pacote de uma sala de testes trancada até o escritório da empresa. Ele deveria aceitar pedidos apenas dos funcionários, mas um crachá também o fazia obedecer ao assistente de IA. Um bilhete malicioso podia convencer o assistente a escolher uma gaveta do escritório. A correção remove o crachá que torna esse auxiliar chamável pelo modelo; chamadas feitas pelo próprio aplicativo ainda precisam de uma regra de destino restrito.[1], [2]
Conceitos Centrais e Termos
KernelFunction- Atributo do Semantic Kernel que anuncia um método ao modelo como ferramenta chamável.[1], [2]
Mapeamentos de frameworks
- Referência CWE para a fraqueza descrita neste guia: CWE-22
Análise de Causa Raiz
O SessionsPythonPlugin do Semantic Kernel para .NET conecta uma sessão Python remota ao host do aplicativo. DownloadFileAsync busca um arquivo da sessão e pode salvar os bytes retornados em localFilePath no host. O método tinha o atributo KernelFunction, que expunha seus argumentos para a seleção de ferramentas pelo modelo. Se um atacante pudesse influenciar o prompt do agente, poderia tentar fazê-lo chamar o auxiliar com um destino indevido. Trata-se de uma falha de autorização de ferramenta e de limite de caminho, não de uma falha do modelo de linguagem nem de uma fuga do sandbox da sessão Python remota. A correção da Microsoft remove KernelFunction de DownloadFileAsync para impedir que o modelo o chame. Se o código do aplicativo ainda chamar o auxiliar, configure e aplique uma política explícita de diretórios permitidos; o auxiliar upstream é permissivo quando essa lista está vazia. O GHSA-2ww3-72rp-wpp4 lista versões NuGet de Microsoft.SemanticKernel.Plugins.Core anteriores a 1.71.0 e também versões PyPI de semantic-kernel anteriores a 1.39.3; esta análise se concentra na cadeia .NET documentada pela Microsoft.[1], [2], [3]
Escopo dos pacotes e versões corrigidas
| Pacote / escopo | Versões afetadas e corrigidas | O que este artigo aborda |
|---|---|---|
.NET Microsoft.SemanticKernel.Plugins.Core | Afetadas: < 1.71.0; corrigida: 1.71.0 ou posterior. | A cadeia documentada de SessionsPythonPlugin: DownloadFileAsync, acessível ao modelo, podia gravar dados da sessão em um caminho do host. |
Python semantic-kernel | Afetadas: < 1.39.3; corrigida: 1.39.3 ou posterior. | O aviso também lista este pacote. Esta página não analisa um caminho de exploração específico do Python; atualize o pacote Python separadamente. |
| Aplicações que salvam intencionalmente arquivos da sessão no host | Restrinja o destino mesmo após remover o acesso do modelo. | Use uma lista explícita de caminhos canônicos permitidos em um Function Invocation Filter ou camada equivalente. Uma lista AllowedDownloadDirectories vazia é permissiva na implementação upstream. |
Fluxo de Ataque Passo a Paso
Conteúdo não confiável influencia o agente
O atacante precisa de um meio de influenciar a entrada do agente, como conteúdo que ele deve processar. Na cadeia documentada pela Microsoft, a primeira chamada de ferramenta coloca um arquivo na sessão Python remota isolada; nesse estágio, o arquivo continua contido.[1], [2]
Uma gravação no host se torna possível
A gravação no host exige que o modelo chame este helper com um localFilePath influenciado por entrada não confiável e fora de qualquer diretório permitido efetivamente imposto. A Microsoft descreve uma cadeia de pesquisa controlada, não uma exploração disseminada.[1], [2]
Código-Fonte: Vulnerável vs. Seguro
A correção upstream remove o atributo KernelFunction de DownloadFileAsync e interrompe o acesso do modelo no limite de registro de ferramentas. A assinatura permanece para uso intencional pelo aplicativo. O advisory também recomenda validar argumentos de DownloadFileAsync e UploadFileAsync com um Function Invocation Filter e uma lista explícita de caminhos. Path.GetFullPath, sozinho, não é uma política de autorização; além disso, uma lista AllowedDownloadDirectories vazia é permissiva na implementação upstream.[2], [3]
Trecho de origem: Método de origem: `DownloadFileAsync` em `SessionsPythonPlugin`
[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);
Lista de Verificação de Segurança para Engenharia
- ✓Atualize Microsoft.SemanticKernel.Plugins.Core para 1.71.0 ou posterior; confira o arquivo de dependências e o assembly em execução, não apenas o arquivo do projeto.[2]
- ✓Inventarie os agentes que registram SessionsPythonPlugin e confirme que o esquema de ferramentas do modelo não inclui DownloadFileAsync.[1], [2]
- ✓Se o aplicativo chamar DownloadFileAsync ou UploadFileAsync, aplique uma lista canonicalizada de caminhos permitidos em um Function Invocation Filter ou camada equivalente.[2]
- ✓Não deixe AllowedDownloadDirectories vazio quando houver necessidade de restringir o destino; a implementação upstream trata uma lista vazia como permissão para qualquer caminho absoluto.[3]
- ✓Revise a telemetria de gravação de arquivos no host durante a janela vulnerável e investigue gravações do processo do agente fora dos diretórios aprovados; só troque credenciais se houver evidência de exposição.
- ✓Inspecione o esquema de ferramentas registrado para o modelo e as permissões do host; confirme que nenhuma ferramenta do agente pode gravar fora dos diretórios explicitamente aprovados.[1]