Semantic Kernel : quand un prompt injecté ouvre un shell (CVE-2026-25592 & -26030)
- .NET Semantic Kernel < 1.71.0
- Python Semantic Kernel < 1.39.4
Le contexte
Semantic Kernel est le framework d'orchestration d'agents IA de Microsoft, disponible côté .NET et Python. En mai 2026, Microsoft a publié coup sur coup deux vulnérabilités critiques (CVSS 9.9) qui partagent le même scénario d'aboutissement : une injection de prompt qui se transforme en exécution de code sur la machine hôte. Le titre du billet de recherche dit tout : « When prompts become shells ».
C'est le cas d'école du nouveau front d'attaque 2026 : l'attaquant n'écrit pas un exploit binaire, il écrit du langage naturel (ou empoisonne un corpus) que l'agent va traiter et qui finit par déclencher du code.
La mécanique
Les deux CVE empruntent des chemins différents mais aboutissent au même résultat.
CVE-2026-26030 : Python Semantic Kernel (< 1.39.4)
La faille est dans le composant InMemoryVectorStore. Le filtre par défaut est construit comme un lambda Python évalué via eval(). Or l'entrée du filtre peut provenir de contenu contrôlé par l'attaquant présent dans le vector store lui-même : un enregistrement malveillant injecté dans un corpus RAG exécute du code Python arbitraire au moment où une requête de recherche déclenche le filtrage.
CVE-2026-25592 : .NET Semantic Kernel (< 1.71.0)
La méthode DownloadFileAsync a été involontairement exposée avec l'attribut [KernelFunction], ce qui permet au LLM de l'invoquer directement. Pire, le paramètre localFilePath était quasi entièrement contrôlé par le modèle, sans validation de chemin. Un attaquant pouvait créer une charge utile dans le bac à sable, puis se servir de DownloadFileAsync pour écrire un fichier dans le dossier Démarrage (Startup) de la machine : le programme malveillant s'exécutant à la prochaine ouverture de session.
Le bonus pédagogique
Microsoft fournit un CTF interactif (un agent vulnérable de recherche d'hôtel) pour pratiquer l'exploitation en environnement contrôlé. C'est une ressource idéale pour une finalité défensive et pédagogique : comprendre la chaîne « prompt → fonction → code » en la manipulant, sans cible réelle.
Versions impactées
| Produit | Version | Statut | | --- | --- | --- | | Python Semantic Kernel | < 1.39.4 | Vulnérable (CVE-2026-26030) | | Python Semantic Kernel | 1.39.4 et ultérieures | Corrigée | | .NET Semantic Kernel | < 1.71.0 | Vulnérable (CVE-2026-25592) | | .NET Semantic Kernel | 1.71.0 et ultérieures | Corrigée |
Comment patcher
# Python
pip install --upgrade "semantic-kernel>=1.39.4"
# .NET
dotnet add package Microsoft.SemanticKernel --version 1.71.0
Au-delà du patch :
- Traitez tout contenu indexé en RAG comme non fiable : un document ingéré peut porter une charge active. Validez, échappez, et n'évaluez jamais d'entrée via
eval(). - Auditez les fonctions exposées au modèle (
[KernelFunction]/ plugins) : chaque fonction invocable par le LLM est une surface d'attaque. Validez strictement les paramètres sensibles (chemins, URL, commandes). - Cloisonnez l'exécution de l'agent (bac à sable réel, droits minimaux, pas d'écriture dans des emplacements d'auto-démarrage).
PoC
Le CTF officiel de Microsoft (agent hotel-finder vulnérable) sert de preuve de concept maîtrisée et reproductible. Lier vers la ressource Microsoft, l'utiliser en environnement isolé.
Ce qu'il faut retenir
Deux frameworks, deux SDK, un même verdict : dans un agent IA, la frontière entre données et instructions n'existe plus par défaut. Un prompt injecté ou un corpus empoisonné peut devenir un shell.
Pour les RSSI et les équipes qui construisent des agents :
-
Mettez à jour : Python ≥ 1.39.4, .NET ≥ 1.71.0.
-
Le modèle de menace change : l'entrée hostile est du texte, pas un payload binaire. Les défenses applicatives classiques (WAF, signatures) ne couvrent pas ce vecteur.
-
Inventoriez vos fonctions outillées et le contenu que vos agents ingèrent. C'est là que se joue la prochaine vague d'incidents.
-
Kreomnis