Agentic AI
2026-06-08
10 min
Équipe Blent

Sandboxing : exécution de code par les agents

Les agents IA ont considérablement évolué ces derniers mois, passant de simples assistants conversationnels à de véritables systèmes autonomes capables d'exécuter des actions concrètes. Grâce au tool calling, un agent peut désormais interagir avec des bases de données, manipuler des fichiers, exécuter des scripts ou appeler des APIs externes. Cette puissance d'action représente une avancée majeure, mais elle soulève un défi critique : comment tester et évaluer ces agents sans risquer de provoquer des dégâts irréversibles ?

Sandboxing : exécution de code par les agents

Les agents IA ont considérablement évolué ces derniers mois, passant de simples assistants conversationnels à de véritables systèmes autonomes capables d'exécuter des actions concrètes. Grâce au tool calling, un agent peut désormais interagir avec des bases de données, manipuler des fichiers, exécuter des scripts ou appeler des APIs externes. Cette puissance d'action représente une avancée majeure, mais elle soulève un défi critique : comment tester et évaluer ces agents sans risquer de provoquer des dégâts irréversibles ?

Un agent mal configuré ou confronté à une requête ambiguë peut déclencher des actions destructrices : suppression de fichiers critiques, corruption de données, appels API non autorisés, ou même propagation de commandes malveillantes. En phase de développement comme en production, laisser un agent interagir directement avec des systèmes réels expose à des risques considérables. Un simple bug dans la logique de raisonnement peut transformer un assistant utile en vecteur de catastrophe.

C'est dans ce contexte que le sandboxing s'impose comme une pratique essentielle. Le principe consiste à isoler l'exécution de l'agent dans un environnement contrôlé où toutes les actions sont permises sans conséquence sur les systèmes réels. L'agent peut "tout casser" dans sa sandbox sans impact sur la production, permettant aux équipes de tester les comportements limites, d'évaluer la robustesse des garde-fous et de valider les scénarios d'erreur en toute sécurité. Dans cet article, nous allons explorer pourquoi le sandboxing est devenu incontournable pour les architectures d'agents IA, les différentes approches d'implémentation, et les bonnes pratiques pour construire des environnements de test efficaces.

Pourquoi le sandboxing est essentiel pour les agents IA

La nécessité du sandboxing découle directement de la nature même des agents IA modernes. Contrairement à un chatbot classique qui se contente de générer du texte, un agent équipé d'outils peut modifier l'état du monde réel. Cette capacité d'action, qui fait toute la valeur des systèmes agentiques, constitue également leur principal vecteur de risque.

Les scénarios problématiques sont nombreux et variés. Un agent de gestion de fichiers pourrait interpréter une instruction ambiguë comme une demande de suppression massive. Un agent DevOps pourrait exécuter une commande destructrice sur un serveur de production suite à une hallucination du LLM. Un agent commercial pourrait envoyer des emails inappropriés à des clients réels lors d'un test mal isolé. Ces risques ne sont pas hypothétiques : ils surviennent dès que l'on connecte un système de raisonnement probabiliste (le LLM) à des outils ayant des effets de bord irréversibles.

Type de risqueExemple concretImpact potentiel
Destruction de donnéesrm -rf / exécuté par un agent shellPerte totale des données
Fuite d'informationsRequête SQL exposant des données sensiblesViolation de confidentialité
Actions non autoriséesAppel API avec des paramètres extrêmesCoûts financiers, blocage de compte
Propagation d'erreursAgent multi-agents propageant une instruction malforméeCascade de dysfonctionnements

Le sandboxing répond à ces défis en créant une zone de sécurité où l'expérimentation devient sans risque. Cette approche permet plusieurs activités critiques pour le développement d'agents robustes :

  • Tests de comportements limites : explorer comment l'agent réagit face à des instructions ambiguës, contradictoires ou potentiellement dangereuses
  • Évaluation des garde-fous : vérifier que les mécanismes de sécurité (validation d'entrées, limitations d'actions) fonctionnent correctement
  • Simulation de scénarios d'erreur : observer le comportement de l'agent lorsque des outils échouent, renvoient des données corrompues ou sont indisponibles
  • Benchmarking de performance : mesurer les temps d'exécution et la consommation de ressources sans impacter les systèmes de production
  • Red teaming : tenter délibérément de faire dérailler l'agent pour identifier les vulnérabilités

Au-delà de la sécurité, le sandboxing accélère considérablement les cycles de développement. Les développeurs peuvent itérer rapidement sur la configuration des outils, les prompts système et la logique de l'agent sans craindre les conséquences d'une erreur. Cette liberté d'expérimentation favorise l'innovation et permet de découvrir des edge cases qui resteraient invisibles dans un environnement de production contraint.

Approches techniques du sandboxing

L'implémentation du sandboxing pour les agents IA peut prendre plusieurs formes selon le niveau d'isolation requis, les ressources disponibles et les types d'outils à tester. Trois approches principales se distinguent, chacune avec ses avantages et ses compromis.

Conteneurisation avec Docker

Docker représente l'approche la plus répandue pour isoler l'exécution d'agents IA. Chaque session de test s'exécute dans un conteneur éphémère qui dispose de son propre système de fichiers, de ses propres processus et de son propre réseau. L'agent peut manipuler librement cet environnement sans affecter l'hôte ou d'autres conteneurs.

Docker logo
import docker

def create_agent_sandbox(image="python:3.11-slim", memory_limit="512m", timeout=300):
    """Crée un conteneur isolé pour l'exécution d'un agent."""
    client = docker.from_env()
    
    container = client.containers.run(
        image,
        detach=True,
        mem_limit=memory_limit,
        network_mode="none",  # Isolation réseau complète
        read_only=False,  # L'agent peut écrire dans son filesystem
        security_opt=["no-new-privileges"],
        cap_drop=["ALL"],  # Suppression des capabilities Linux
    )
    
    return container

def execute_in_sandbox(container, command):
    """Exécute une commande dans la sandbox et capture le résultat."""
    exit_code, output = container.exec_run(command, timeout=60)
    return {"exit_code": exit_code, "output": output.decode()}

python

Cette approche offre un excellent équilibre entre isolation et facilité d'utilisation. Les conteneurs démarrent en quelques secondes, peuvent être préconfigurés avec les dépendances nécessaires, et sont automatiquement détruits après usage. La limitation des ressources (CPU, mémoire, temps d'exécution) protège contre les agents qui entreraient dans des boucles infinies ou consommeraient des ressources excessives.

Machines virtuelles pour l'isolation maximale

Lorsque les outils de l'agent nécessitent un accès système profond (manipulation du noyau, tests de drivers, interactions avec du matériel), les conteneurs peuvent s'avérer insuffisants. Les machines virtuelles offrent alors une isolation au niveau matériel, garantissant qu'aucune action de l'agent ne peut affecter l'hôte, même en cas d'exploitation de vulnérabilités du noyau.

Des solutions comme Firecracker (utilisé par AWS Lambda) ou QEMU permettent de lancer des micro-VMs légères spécifiquement conçues pour ce type d'usage. Le compromis se situe au niveau de la latence de démarrage (quelques secondes supplémentaires) et de la consommation de ressources (chaque VM embarque son propre noyau).

Mocking et simulation d'outils

Une approche complémentaire consiste à remplacer les outils réels par des mocks qui simulent leur comportement sans exécuter d'actions effectives. Cette technique est particulièrement adaptée pour tester la logique de raisonnement de l'agent indépendamment des effets de bord.

class MockDatabaseTool:
    """Simule un outil de base de données sans connexion réelle."""
    
    def __init__(self):
        self.call_history = []
        self.simulated_data = {
            "users": [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]
        }
    
    def execute_query(self, query: str) -> dict:
        self.call_history.append(query)
        
        # Simulation de réponses basées sur le pattern de requête
        if "SELECT" in query.upper():
            return {"status": "success", "data": self.simulated_data.get("users", [])}
        elif "DELETE" in query.upper():
            return {"status": "success", "rows_affected": 1}
        elif "DROP" in query.upper():
            return {"status": "error", "message": "Permission denied"}
        
        return {"status": "success"}
    
    def get_audit_log(self):
        return self.call_history

python

Les mocks permettent de vérifier que l'agent génère les bons appels d'outils avec les bons paramètres, sans risque ni dépendance externe. Ils facilitent également les tests de scénarios d'erreur en configurant des réponses spécifiques (timeouts, erreurs de permission, données corrompues).

ApprocheNiveau d'isolationLatenceComplexitéCas d'usage privilégié
Conteneurs DockerProcessus/Filesystem~1sMoyenneTests d'intégration, CI/CD
Machines virtuellesMatériel~5-10sÉlevéeTests système, sécurité maximale
MocksLogique uniquement~0msFaibleTests unitaires, développement rapide

En pratique, une stratégie de test complète combine ces approches. Les mocks servent aux tests unitaires rapides durant le développement, les conteneurs Docker aux tests d'intégration dans la CI/CD, et les VMs aux évaluations de sécurité périodiques.

Implémentation pratique et bonnes pratiques

Construire un système de sandboxing efficace pour les agents IA nécessite de prendre en compte plusieurs dimensions au-delà de la simple isolation technique.

Gestion du cycle de vie des sandboxes

Une sandbox doit être éphémère et reproductible. Chaque test démarre avec un environnement propre, configuré de manière déterministe, et se termine par une destruction complète. Cette approche garantit l'indépendance des tests et évite les effets de bord entre exécutions successives.

from contextlib import contextmanager
import uuid

@contextmanager
def sandbox_session(config: SandboxConfig):
    """Gestionnaire de contexte pour une session de sandbox."""
    sandbox_id = str(uuid.uuid4())[:8]
    sandbox = None
    
    try:
        # Création et configuration de la sandbox
        sandbox = create_sandbox(sandbox_id, config)
        setup_tools(sandbox, config.tools)
        inject_test_data(sandbox, config.fixtures)
        
        yield sandbox
        
    finally:
        # Nettoyage systématique
        if sandbox:
            collect_artifacts(sandbox)  # Logs, métriques, traces
            destroy_sandbox(sandbox)

# Utilisation
with sandbox_session(config) as sandbox:
    result = agent.execute(task, sandbox=sandbox)
    assert_expected_behavior(result)

python

Capture et analyse des actions

Le sandboxing ne se limite pas à prévenir les dégâts : il constitue également une opportunité d'observation détaillée du comportement de l'agent. Chaque action exécutée dans la sandbox doit être capturée pour analyse ultérieure.

Les métriques essentielles à collecter incluent la séquence complète des appels d'outils (avec paramètres et résultats), les tentatives d'actions bloquées par les garde-fous, les temps d'exécution de chaque étape, et les patterns de raisonnement du LLM entre les actions. Ces données alimentent l'amélioration continue de l'agent et permettent d'identifier les comportements problématiques avant qu'ils n'atteignent la production.

Observability

L'intégration avec des outils comme Langfuse permet de corréler les traces de sandbox avec les métriques LLM, offrant une vision complète du comportement de l'agent depuis le prompt initial jusqu'aux actions exécutées.

Configuration des limites et garde-fous

Même dans une sandbox, l'agent doit opérer dans un cadre défini. Les limites de ressources (CPU, mémoire, temps d'exécution, nombre d'appels d'outils) protègent l'infrastructure de test contre les agents qui dérailleraient. Les garde-fous applicatifs (validation des commandes, listes blanches d'actions) permettent de tester leur efficacité dans des conditions contrôlées.

sandbox_config = SandboxConfig(
    # Limites de ressources
    max_execution_time=300,  # 5 minutes maximum
    max_memory_mb=512,
    max_tool_calls=50,
    
    # Garde-fous à tester
    blocked_commands=["rm -rf /", "DROP DATABASE"],
    allowed_directories=["/workspace", "/tmp"],
    network_access=False,
    
    # Configuration des outils
    tools=[
        MockFileTool(root="/workspace"),
        MockDatabaseTool(allow_writes=True),
        MockAPITool(simulate_errors=True),
    ]
)

python

Une bonne pratique consiste à faire varier ces configurations selon les scénarios de test. Un test de robustesse désactivera certains garde-fous pour vérifier que l'agent ne tente pas d'actions dangereuses. Un test de performance mesurera le comportement avec des limites de temps réduites.

Intégration dans la CI/CD

Le sandboxing prend toute sa valeur lorsqu'il est intégré au pipeline de développement. Chaque modification du code de l'agent ou de la configuration des outils déclenche automatiquement une batterie de tests en environnement sandboxé. Les comportements régressifs sont détectés avant le déploiement.

Cette intégration nécessite une attention particulière à la reproductibilité. Les tests doivent produire les mêmes résultats indépendamment de l'environnement d'exécution. Cela implique de fixer les versions des modèles LLM utilisés (ou de mocker leurs réponses pour les tests déterministes), de contrôler les données de test, et de gérer le caractère probabiliste des réponses du LLM via des seeds ou des stratégies de tolérance.

À découvrir : notre formation Agentic AI

Conclusion

Le sandboxing constitue une pratique fondamentale pour le développement et le déploiement d'agents IA robustes. En isolant l'exécution dans des environnements contrôlés où toutes les actions sont permises sans conséquence, les équipes peuvent explorer les comportements limites, valider les mécanismes de sécurité et itérer rapidement sur la configuration des agents.

Les approches techniques varient selon les besoins : conteneurs Docker pour les tests d'intégration quotidiens, machines virtuelles pour l'isolation maximale lors des audits de sécurité, mocks pour les tests unitaires rapides. La combinaison de ces méthodes offre une couverture complète, depuis le développement local jusqu'aux pipelines de CI/CD.

Au-delà de la prévention des risques, le sandboxing représente une opportunité d'observation et d'amélioration continue. Les traces collectées dans ces environnements isolés alimentent la compréhension du comportement des agents et permettent d'identifier les axes d'amélioration avant que les problèmes n'impactent les utilisateurs réels.

Pour les équipes construisant des solutions d'Agentic AI, maîtriser le sandboxing devient un prérequis de maturité. Les agents les plus puissants sont aussi les plus dangereux lorsqu'ils sont mal contrôlés. Investir dans une infrastructure de test isolée et reproductible permet de libérer la puissance des agents tout en maintenant le niveau de sécurité exigé par les environnements de production.

Articles similaires

Agent Skills : définitions et exemples
Agentic AI
2026-05-01
13 min

Agent Skills : définitions et exemples

Les agents IA ont considérablement évolué ces derniers mois, passant de simples assistants conversationnels à de véritables systèmes autonomes capables d'exécuter des tâches complexes. Des outils comme Claude Code, GitHub Copilot ou Cursor incarnent cette nouvelle génération d'agents qui interagissent directement avec notre environnement de travail. Mais ce qui distingue un agent véritablement utile d'un simple chatbot amélioré, c'est sa capacité à maîtriser des compétences spécifiques et contextualisées : les agent skills.

Lire l'article
AI Engineer : compétences, salaire et débouchés
Agentic AI
2026-03-24
10 min

AI Engineer : compétences, salaire et débouchés

L'essor fulgurant de l'IA générative a fait émerger un nouveau profil technique au croisement du génie logiciel et de l'intelligence artificielle : l'AI Engineer. Là où le Data Scientist se concentre traditionnellement sur l'analyse de données et l'entraînement de modèles, l'AI Engineer se spécialise dans la construction d'applications exploitant les LLM, les systèmes RAG et les architectures d'agents IA.

Lire l'article
Tool Calling des LLM : tout savoir
Agentic AI
2026-03-23
12 min

Tool Calling des LLM : tout savoir

Le tool calling permet à un LLM de reconnaître quand une requête utilisateur nécessite l'exécution d'une fonction externe, de déterminer quelle fonction appeler et avec quels paramètres, puis de formuler sa réponse en intégrant le résultat obtenu. Cette capacité transforme le modèle de langage d'un simple générateur de texte en un orchestrateur capable d'actions concrètes.

Lire l'article