FlawOpen

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

● CVE-2026-25592 · CVSS 9.9[2], [4] · Critique
Recherche · FlawOpen

CVE-2026-25592 : écriture dans Semantic Kernel

CVE-2026-25592 exposait le téléchargement Semantic Kernel comme outil IA, avec écriture sur l’hôte. Retirez l’accès du modèle et mettez à jour.[2]

💡 Explication en Langage Simple (ELI5)

Un coursier peut transporter un colis depuis une salle de test verrouillée vers les bureaux de l’entreprise. Il devrait accepter les demandes du personnel seulement, mais son badge l’amenait aussi à obéir à l’assistant IA. Une note malveillante pouvait alors convaincre l’assistant de choisir un tiroir du bureau. Le correctif retire le badge qui rend cet assistant appelable par le modèle ; les appels du programme doivent encore respecter une règle de destination limitée.[1], [2]

Concepts Clés et Termes

KernelFunction
Attribut Semantic Kernel qui présente une méthode au modèle comme un outil qu’il peut appeler.[1], [2]
SessionsPythonPlugin
Plugin Semantic Kernel qui permet à un agent d’interagir avec du code exécuté dans une session Python distante isolée.[1], [2]
localFilePath
Chemin de destination facultatif sur l’hôte fourni à DownloadFileAsync.[1], [2]
Liste de chemins autorisés
Politique qui n’autorise les écritures que sous des répertoires explicitement configurés et canonicalisés.[1], [2], [5]

Correspondances de référentiels

  • Référence CWE pour la faiblesse décrite dans ce guide : CWE-22

Analyse de Cause Racine

SessionsPythonPlugin de Semantic Kernel pour .NET relie une session Python distante à l’hôte de l’application. DownloadFileAsync récupère un fichier de la session et peut enregistrer les octets reçus dans localFilePath sur l’hôte. La méthode portait l’attribut KernelFunction, qui exposait ses arguments à la sélection d’outils du modèle. Si un attaquant pouvait influencer l’invite de l’agent, il pouvait tenter de lui faire appeler l’assistant avec une destination inattendue. Il s’agit d’un défaut d’autorisation d’outil et de frontière de chemin, pas d’un défaut du modèle de langage ni d’une évasion du sandbox Python distant. Le correctif Microsoft retire KernelFunction de DownloadFileAsync afin que le modèle ne puisse plus l’appeler. Si le code de l’application utilise encore l’assistant, configurez et appliquez une politique explicite de répertoires autorisés ; l’implémentation amont est permissive lorsque cette liste est vide. GHSA-2ww3-72rp-wpp4 répertorie les versions NuGet de Microsoft.SemanticKernel.Plugins.Core antérieures à 1.71.0 et aussi les versions PyPI de semantic-kernel antérieures à 1.39.3 ; cette analyse se concentre sur la chaîne .NET documentée par Microsoft.[1], [2], [3]

Périmètre des paquets et versions corrigées

Paquet / périmètreVersions affectées et corrigéesContenu de cet article
.NET Microsoft.SemanticKernel.Plugins.CoreAffectées : < 1.71.0 ; corrigée : 1.71.0 ou ultérieure.La chaîne documentée de SessionsPythonPlugin : DownloadFileAsync, accessible au modèle, pouvait écrire les données de session vers un chemin de l’hôte.
Python semantic-kernelAffectées : < 1.39.3 ; corrigée : 1.39.3 ou ultérieure.L’avis répertorie aussi ce paquet. Cet article n’analyse pas de chaîne d’exploitation propre à Python ; mettez le paquet Python à niveau séparément.
Applications qui enregistrent volontairement des fichiers de session sur l’hôteLimitez la destination même après avoir supprimé l’accès du modèle.Utilisez une liste explicite de chemins canoniques autorisés dans un Function Invocation Filter ou une couche d’autorisation équivalente. Une liste AllowedDownloadDirectories vide est permissive dans l’implémentation upstream.

Déroulement de l'Attaque Étape par Étape

Étape 1

Un contenu non fiable influence l’agent

L’attaquant doit pouvoir influencer l’entrée de l’agent, par exemple avec un contenu qu’il doit traiter. Dans la chaîne documentée par Microsoft, le premier appel d’outil place un fichier dans la session Python distante isolée ; à ce stade, le fichier reste confiné.[1], [2]

Étape 2

Le modèle voit un assistant côté hôte

Dans les déploiements .NET concernés, KernelFunction ajoutait DownloadFileAsync à la surface d’outils appelables par le modèle.[1], [2]

Étape 3

Les arguments franchissent la frontière de confiance

Le modèle pouvait choisir localFilePath lors d’une demande de fichier à la session distante. L’assistant traitait ce chemin dans le processus hôte.[1], [2]

Étape 4

Une écriture sur l’hôte devient possible

Une écriture sur l’hôte nécessite que le modèle appelle cet helper avec un localFilePath influencé par une entrée non fiable et situé hors de tout répertoire autorisé effectivement imposé. Microsoft décrit une chaîne de recherche contrôlée, pas une exploitation généralisée.[1], [2]

Code Source : Vulnérable vs Sécurisé

Le correctif amont retire l’attribut KernelFunction de DownloadFileAsync et coupe l’accès du modèle à la frontière d’enregistrement des outils. La signature reste disponible pour un usage délibéré par l’application. L’advisory recommande aussi de valider les arguments de DownloadFileAsync et UploadFileAsync avec un Function Invocation Filter et une liste explicite de chemins. Path.GetFullPath seul ne constitue pas une politique d’autorisation ; en outre, une liste AllowedDownloadDirectories vide est permissive dans l’implémentation amont.[2], [3]

Extrait source: Méthode concernée : `DownloadFileAsync` dans `SessionsPythonPlugin`

IMPLÉMENTATION VULNÉRABLE
[KernelFunction, Description("Downloads a file from the current session.")]
public abstract Task<byte[]> DownloadFileAsync(
    string remoteFileName,
    string? localFilePath = null,
    CancellationToken cancellationToken = default);
PATCH SÉCURISÉ ET ROBUSTE
[Description("Downloads a file from the current session.")]
public abstract Task<byte[]> DownloadFileAsync(
    string remoteFileName,
    string? localFilePath = null,
    CancellationToken cancellationToken = default);

Liste de Contrôle de Sécurité pour l'Ingénierie

Sources