FlawOpen

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

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

CVE-2026-25592: Escritura en agentes Semantic Kernel

CVE-2026-25592 expuso una descarga de Semantic Kernel como herramienta de IA y permitió escribir en el host. Retire el acceso del modelo y actualice.[2]

💡 Explicación en Lenguaje Sencillo (ELI5)

Un mensajero puede llevar un paquete desde una sala de pruebas cerrada hasta la oficina de la empresa. Debería aceptar encargos solo del personal, pero una credencial también hacía que obedeciera al asistente de IA. Una nota maliciosa podía convencer al asistente de elegir un cajón de la oficina. La solución quita la credencial que permite al modelo invocar este auxiliar; las llamadas del propio programa aún necesitan una regla que limite el destino.[1], [2]

Conceptos Clave y Términos

KernelFunction
Atributo de Semantic Kernel que anuncia un método al modelo como herramienta invocable.[1], [2]
SessionsPythonPlugin
Plugin de Semantic Kernel que permite al agente interactuar con código en una sesión Python remota aislada.[1], [2]
localFilePath
Ruta opcional en el host que DownloadFileAsync usa como destino.[1], [2]
Lista de rutas permitidas
Política que autoriza escrituras solo dentro de directorios configurados explícitamente y canonicalizados.[1], [2], [5]

Mapeos de marcos

  • Referencia CWE para la debilidad descrita en esta guía: CWE-22

Análisis de Causa Raíz

SessionsPythonPlugin de Semantic Kernel para .NET conecta una sesión Python remota con el host de la aplicación. DownloadFileAsync obtiene un archivo de la sesión y puede guardar los bytes devueltos en localFilePath en el host. El método llevaba el atributo KernelFunction, que exponía sus argumentos a la selección de herramientas del modelo. Si un atacante podía influir en el prompt del agente, podía intentar que invocara el auxiliar con un destino no previsto. Es un fallo de autorización de herramientas y del límite de rutas, no un defecto del modelo de lenguaje ni una fuga del sandbox de la sesión Python remota. El arreglo de Microsoft elimina KernelFunction de DownloadFileAsync para impedir que el modelo lo invoque. Si el código de la aplicación aún usa el auxiliar, configure y aplique una política explícita de directorios permitidos; la implementación upstream permite cualquier destino cuando esa lista está vacía. GHSA-2ww3-72rp-wpp4 enumera versiones NuGet de Microsoft.SemanticKernel.Plugins.Core anteriores a 1.71.0 y también versiones PyPI de semantic-kernel anteriores a 1.39.3; este análisis se centra en la cadena .NET documentada por Microsoft.[1], [2], [3]

Alcance de los paquetes y versiones corregidas

Paquete / alcanceVersiones afectadas y corregidasQué cubre este artículo
.NET Microsoft.SemanticKernel.Plugins.CoreAfectadas: < 1.71.0; corregida: 1.71.0 o posterior.La cadena documentada de SessionsPythonPlugin: DownloadFileAsync, accesible para el modelo, podía escribir datos de sesión en una ruta del host.
Python semantic-kernelAfectadas: < 1.39.3; corregida: 1.39.3 o posterior.El aviso también incluye este paquete. Esta página no analiza una ruta de explotación específica de Python; actualiza el paquete Python por separado.
Aplicaciones que guardan intencionadamente archivos de sesión en el hostRestringe el destino incluso después de quitar el acceso del modelo.Usa una lista explícita de rutas canónicas permitidas en un Function Invocation Filter o una capa equivalente. Una lista AllowedDownloadDirectories vacía es permisiva en la implementación upstream.

Flujo de Ataque Paso a Paso

Paso 1

Contenido no confiable influye en el agente

El atacante necesita una forma de influir en la entrada del agente, por ejemplo mediante contenido que debe procesar. En la cadena documentada por Microsoft, la primera llamada a una herramienta coloca un archivo en la sesión remota aislada de Python; en esta fase el archivo sigue contenido.[1], [2]

Paso 2

El modelo ve un auxiliar del host

En despliegues .NET afectados, KernelFunction incorporaba DownloadFileAsync a las herramientas invocables por el modelo.[1], [2]

Paso 3

Los argumentos cruzan el límite de confianza

El modelo podía elegir localFilePath al solicitar un archivo de la sesión remota. El auxiliar procesaba esa ruta en el proceso del host.[1], [2]

Paso 4

La escritura en el host se vuelve posible

La escritura en el host requiere que el modelo invoque este helper con un localFilePath influido por entrada no confiable y fuera de cualquier directorio permitido que se aplique de verdad. Microsoft describe una cadena de investigación controlada, no una explotación generalizada.[1], [2]

Código Fuente: Vulnerable vs. Seguro

El parche upstream quita el atributo KernelFunction de DownloadFileAsync y corta el acceso del modelo en el límite de registro de herramientas. La firma permanece para el uso intencional de la aplicación. El advisory también recomienda validar los argumentos de DownloadFileAsync y UploadFileAsync con un Function Invocation Filter y una lista explícita de rutas permitidas. Path.GetFullPath por sí solo no es una política de autorización; además, una lista AllowedDownloadDirectories vacía permite cualquier ruta en la implementación upstream.[2], [3]

Fragmento de origen: Método de origen: `DownloadFileAsync` en `SessionsPythonPlugin`

IMPLEMENTACIÓN VULNERABLE
[KernelFunction, Description("Downloads a file from the current session.")]
public abstract Task<byte[]> DownloadFileAsync(
    string remoteFileName,
    string? localFilePath = null,
    CancellationToken cancellationToken = default);
PARCHE SEGURO Y ROBUSTO
[Description("Downloads a file from the current session.")]
public abstract Task<byte[]> DownloadFileAsync(
    string remoteFileName,
    string? localFilePath = null,
    CancellationToken cancellationToken = default);

Lista de Verificación de Seguridad para Ingeniería

Fuentes