FlawOpen

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

● CVE-2026-25592 · CVSS 9.9[2], [4] · Crítica
Pesquisa · FlawOpen

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]

💡 Explicação em Linguagem Simples (ELI5)

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]
SessionsPythonPlugin
Plugin do Semantic Kernel que permite ao agente interagir com código executado em uma sessão Python remota isolada.[1], [2]
localFilePath
Caminho opcional no host usado como destino por DownloadFileAsync.[1], [2]
Lista de caminhos permitidos
Política que autoriza gravações somente abaixo de diretórios explicitamente configurados e canonicalizados.[1], [2], [5]

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 / escopoVersões afetadas e corrigidasO que este artigo aborda
.NET Microsoft.SemanticKernel.Plugins.CoreAfetadas: < 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-kernelAfetadas: < 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 hostRestrinja 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

Passo 1

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]

Passo 2

O modelo recebe acesso a um auxiliar do host

Em implantações .NET afetadas, KernelFunction incluía DownloadFileAsync entre as ferramentas chamáveis pelo modelo.[1], [2]

Passo 3

Os argumentos atravessam a fronteira de confiança

O modelo podia escolher localFilePath ao solicitar um arquivo da sessão remota. O auxiliar tratava esse caminho no processo do host.[1], [2]

Passo 4

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`

IMPLEMENTAÇÃO VULNERÁVEL
[KernelFunction, Description("Downloads a file from the current session.")]
public abstract Task<byte[]> DownloadFileAsync(
    string remoteFileName,
    string? localFilePath = null,
    CancellationToken cancellationToken = default);
PATCH SEGURO E ROBUSTO
[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

Fontes