Quand le prompt devient un shell : de l'injection au RCE dans les frameworks d'agents
Deux CVE dans Microsoft Semantic Kernel et quatre dans CrewAI — toutes divulguées début 2026 — transforment un simple prompt injecté en exécution de code à distance sur l'hôte. Le motif est structurel, pas accidentel.
De quoi parle-t-on ?
Depuis le début de l’année 2026, plusieurs frameworks d’agents ont publié des vulnérabilités où un seul prompt — délivré directement ou via une injection indirecte — devient un RCE fonctionnel sur la machine hôte de l’agent. Le 7 mai 2026, l’équipe Microsoft Defender Security Research a publié une analyse détaillée de deux de ces failles dans Microsoft Semantic Kernel (CVE-2026-25592 et CVE-2026-26030). Six semaines plus tôt, le 30 mars 2026, le CERT/CC publiait VU#221883 décrivant quatre CVE dans CrewAI (CVE-2026-2275, 2285, 2286, 2287) qui chaînent une injection de prompt en lecture arbitraire de fichiers, SSRF et exécution de code à distance.
Les frameworks diffèrent, mais la classe de bug sous-jacente est la même. Cet article porte sur cette classe.
Comment ça fonctionne
Le motif est constant d’une divulgation à l’autre. Le LLM fait exactement ce pour quoi il a été entraîné : transformer une instruction en langage naturel en un appel d’outil structuré. La vulnérabilité se situe une couche en dessous, dans le code de glue entre la sortie du modèle et le runtime qui exécute l’outil.
Dans l’In-Memory Vector Store de Semantic Kernel (CVE-2026-26030), le filtre de recherche était une lambda Python assemblée par interpolation de chaînes puis passée à eval(). Une blocklist tentait d’attraper les appels évidents (eval, exec, open, __import__) mais ne couvrait pas l’accès par attributs à travers la hiérarchie de types Python. Un argument contrôlé par le modèle pouvait fermer la chaîne, traverser ().__class__.__bases__[0].__subclasses__(), localiser BuiltinImporter et exécuter os.system("calc.exe").
# Motif vulnérable, simplifié
new_filter = f"lambda x: x.city == '{kwargs[param.name]}'"
# kwargs[param.name] est contrôlé par le modèle et seulement filtré
# par une blocklist AST Python qui ne couvre pas la traversée d'attributs.
eval(new_filter, {"__builtins__": {}}) # reste atteignable via tuple().__class__...
La seconde faille Semantic Kernel (CVE-2026-25592) est plus simple : DownloadFileAsync, dans le plugin sandbox .NET, avait été décoré par erreur d’un attribut [KernelFunction], exposant au modèle une primitive File.WriteAllBytes sans aucune restriction. Le modèle pouvait être amené à écrire un payload dans le dossier Démarrage de Windows, contournant la sandbox par conception.
Dans CrewAI, le Code Interpreter Tool est censé exécuter du Python non fiable à l’intérieur d’un conteneur Docker. Lorsque Docker est inaccessible, l’outil bascule silencieusement vers une sandbox Python in-process, où le module ctypes n’est pas dans la blocklist — d’où des appels C arbitraires qui rouvrent un RCE sur l’hôte (CVE-2026-2275, CVE-2026-2287). Deux autres CVE dans la même divulgation couvrent un SSRF dans l’outil de recherche RAG (CVE-2026-2286) et une lecture arbitraire de fichiers locaux dans le JSON loader (CVE-2026-2285), offrant à un attaquant assez de primitives pour enchaîner vers du vol d’identifiants.
En vocabulaire MITRE ATLAS, la technique est AML.T0051 (LLM Prompt Injection) qui cascade vers AML.T0016 (Obtain Capabilities).
Pourquoi c’est important
Le modèle ne se contente plus de générer du texte : il choisit des outils, fournit leurs arguments et déclenche leurs effets de bord sur l’hôte. Tout paramètre que le modèle peut influencer doit être traité comme contrôlé par l’attaquant, exactement comme un paramètre de query string en sécurité web classique.
Il ne s’agit pas de 0-day exotiques. Semantic Kernel compte plus de 27 000 étoiles GitHub et est embarqué dans les intégrations Microsoft 365 Copilot. CrewAI est largement utilisé pour des démos multi-agents et des pilotes en production. Les chemins de code vulnérables sont les configurations par défaut, et l’injection indirecte (documents RAG empoisonnés, pages web hostiles parcourues par l’agent, réponses d’outils malveillantes) suffit à déclencher l’attaque — aucun accès privilégié au chat de l’utilisateur n’est requis.
Défenses
L’équipe Microsoft pose la leçon centrale clairement : votre LLM n’est pas une frontière de sécurité. Les outils que vous exposez définissent la surface d’attaque. Concrètement :
- Patcher d’abord. Mettre à jour
semantic-kernel≥ 1.39.4 (Python) et ≥ 1.71.0 (.NET). Pour CrewAI, désactiverallow_code_execution=True, retirer le Code Interpreter Tool quand c’est possible et vérifier que Docker tourne réellement — interdire le repli silencieux vers la sandbox in-process. - Traiter les paramètres d’outils comme des entrées non fiables. Ne jamais passer une chaîne fournie par le modèle à
eval,exec, du SQL dynamique, un shell,File.WriteAllBytesou tout sink équivalent. Utiliser des APIs paramétrées ou des allowlists strictes ; les blocklists en langage dynamique échouent par construction. - Auditer le registre d’outils. Chaque fonction exposée au modèle fait partie de la surface d’attaque. Retirer les décorateurs (
[KernelFunction],@tool) de tout ce qui n’a pas vocation à être appelable par le modèle. - Défense en profondeur côté hôte. Détection endpoint sur le processus de l’agent : alertes sur lancement de shell, sur écriture dans les dossiers de démarrage, sur connexions sortantes depuis le runtime. Le billet Microsoft publie des requêtes KQL utiles pour Defender XDR.
- Investiguer la fenêtre vulnérable. Si une version affectée a tourné chez vous, le patch ferme la faille mais ne dit pas si vous avez déjà été exploités. Définir la fenêtre entre déploiement et mise à niveau, puis chasser la télémétrie post-exploitation à l’intérieur de cette fenêtre.
Statut
| Framework | CVE | Divulgation | Patché en |
|---|---|---|---|
| Semantic Kernel (Python) | CVE-2026-26030 | 2026-05-07 | 1.39.4 |
| Semantic Kernel (.NET) | CVE-2026-25592 | 2026-05-07 | 1.71.0 |
| CrewAI Code Interpreter | CVE-2026-2275 | 2026-03-30 | partiel — ctypes ajouté à la blocklist dans une release à venir |
| CrewAI fallback Docker | CVE-2026-2287 | 2026-03-30 | partiel — option fail-closed en évaluation |
| CrewAI JSON loader | CVE-2026-2285 | 2026-03-30 | pas de correctif complet à ce jour |
| CrewAI RAG search SSRF | CVE-2026-2286 | 2026-03-30 | pas de correctif complet à ce jour |
L’équipe Microsoft a annoncé une série de recherche continue ; attendez-vous à des découvertes similaires dans d’autres frameworks dans les semaines à venir. Les vulnérabilités CrewAI ont été rapportées par Yarden Porat (Cyata) ; celles de Semantic Kernel par Uri Oren, Amit Eliahu et Dor Edry (Microsoft Defender Security Research Team).