flawopen.com/Teardowns/cve-2026-25592-semantic-kernel-agent-file-write
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]
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]
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 / alcance | Versiones afectadas y corregidas | Qué cubre este artículo |
|---|---|---|
.NET Microsoft.SemanticKernel.Plugins.Core | Afectadas: < 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-kernel | Afectadas: < 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 host | Restringe 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
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]
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`
[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 Verificación de Seguridad para Ingeniería
- ✓Actualice Microsoft.SemanticKernel.Plugins.Core a 1.71.0 o posterior; compruebe el archivo de bloqueo y el ensamblado en ejecución, no solo el archivo del proyecto.[2]
- ✓Inventaríe los agentes que registran SessionsPythonPlugin y confirme que el esquema de herramientas del modelo ya no incluye DownloadFileAsync.[1], [2]
- ✓Si la aplicación llama a DownloadFileAsync o UploadFileAsync, aplique una lista canonicalizada de rutas permitidas con un Function Invocation Filter o una capa de autorización equivalente.[2]
- ✓No deje AllowedDownloadDirectories vacío cuando necesite restringir destinos; la implementación upstream interpreta una lista vacía como permiso para cualquier ruta completa.[3]
- ✓Revise la telemetría de escritura del host durante el periodo vulnerable e investigue escrituras del proceso del agente fuera de los directorios aprobados; rote credenciales solo si hay evidencia de exposición.
- ✓Inspecciona el esquema de herramientas registrado para el modelo y los permisos del host; comprueba que ninguna herramienta del agente pueda escribir fuera de los directorios aprobados explícitamente.[1]