Exécution de code en bac à sable

La crate adk-sandbox fournit une exĂ©cution isolĂ©e du code pour les agents ADK, avec deux niveaux d’isolation :

  1. Isolation des processus — processus enfants avec isolation de l’environnement et application d’un dĂ©lai d’expiration
  2. Profils de bac Ă  sable au niveau du systĂšme d’exploitation — restrictions au niveau du noyau concernant le systĂšme de fichiers, le rĂ©seau et la crĂ©ation de processus

Moteurs d’exĂ©cution

BackendNiveau d’isolationLangagesIndicateur de fonctionnalitĂ©
ProcessBackendEnvironnement + dĂ©lai d’attenteRust, Python, JS, TS, Commandeprocess (par dĂ©faut)
ProcessBackend + bac Ă  sableNiveau noyauIdentique Ă  ci-dessusprocess + sandbox-native
WasmBackendComplet (mémoire, fs, réseau)WASM uniquementwasm

Quelle isolation obtenez-vous ?

ProcessBackend::isolation() le signale, ce n’est donc pas quelque chose qu’il faut dĂ©duire du nom de la crate :

RésultatSignification
IsolationClass::SubprocessOnlyUn processus enfant avec un environnement effacĂ©, un dĂ©lai d’expiration et son propre groupe de processus. Le systĂšme d’exploitation n’applique aucune restriction supplĂ©mentaire : le code peut lire le systĂšme de fichiers de l’hĂŽte et accĂ©der au rĂ©seau. C’est ce que ProcessBackend::default() vous fournit.
IsolationClass::OsEnforcedUn enforceur et une politique sont attachĂ©s, de sorte que le systĂšme d’exploitation restreint l’enfant.

Deux Ă©lĂ©ments du backend de processus mĂ©ritent d’ĂȘtre connus :

  • Les programmes sont rĂ©solus avant l’effacement de l’environnement. Un python3, node ou rustc nu est recherchĂ© dans le PATH de l’appelant et transmis au processus enfant sous forme de chemin absolu. Cela signifie que l’enfant n’a pas besoin de son propre PATH pour dĂ©marrer — auparavant, l’appelant devait placer PATH dans ExecRequest::env, ce qui permettait Ă©galement au code exĂ©cutĂ© de lancer n’importe quel autre programme prĂ©sent sur celui-ci.
  • La compilation passe par la mĂȘme frontiĂšre que l’exĂ©cution. Le code source Rust Ă©tait auparavant compilĂ© par une commande construite en dehors du chemin partagĂ© ; la compilation ne bĂ©nĂ©ficiait donc d’aucun wrapper d’application de contraintes, d’aucun dĂ©lai d’expiration ni d’aucun groupe de processus. Cela est important, car la compilation n’est pas inoffensive : include_str! lit des fichiers et les macros procĂ©durales exĂ©cutent du code arbitraire avant que le binaire produit n’existe. La phase de compilation reçoit une liste d’autorisation des outils de la chaĂźne de compilation spĂ©cifique Ă  la plateforme ; sous Windows, celle-ci inclut les chemins de MSVC et de Windows SDK, dĂ©tectĂ©s Ă  partir de la chaĂźne de compilation installĂ©e lorsque l’appelant ne se trouve pas dĂ©jĂ  dans un shell de dĂ©veloppeur. La compilation utilise l’éditeur de liens rust-lld de la chaĂźne de compilation Rust afin qu’un link.exe sans rapport, situĂ© plus tĂŽt dans PATH, ne puisse pas ĂȘtre sĂ©lectionnĂ©. C’est l’application de contraintes au niveau du systĂšme d’exploitation qui restreint cette phase.

PrioritĂ© de l’environnement

SandboxPolicy::env fournit des valeurs par défaut pour chaque exécution et ExecRequest::env les remplace pour chaque appel. Les variables de la politique étaient auparavant entiÚrement ignorées.

Profils de bac à sable du systùme d’exploitation

L’application de contraintes au niveau du systĂšme d’exploitation restreint les processus enfants au niveau du noyau. Cela va au-delĂ  de l’isolation de l’environnement : le systĂšme d’exploitation lui-mĂȘme bloque les accĂšs non autorisĂ©s au systĂšme de fichiers, les connexions rĂ©seau et la crĂ©ation de processus.

Prise en charge des plateformes

PlateformeMĂ©canisme d’applicationFonctionnement
macOSSeatbelt (sandbox-exec)RĂšgles au niveau des appels systĂšme : « autoriser par dĂ©faut, refuser les opĂ©rations dangereuses » — refuse les Ă©critures, le rĂ©seau et fork ; les lectures ne sont pas restreintes
Linuxbubblewrap (bwrap)Isolation de l’espace de noms du systùme de fichiers (montages sur liste blanche)
WindowsAppContainerNon implĂ©mentĂ© — le contrĂŽleur se signale comme indisponible

Démarrage rapide

use adk_sandbox::{
    ProcessBackend, ProcessConfig, SandboxBackend,
    SandboxPolicyBuilder, get_enforcer,
};

// 1. Define what the sandboxed process can do
let policy = SandboxPolicyBuilder::new()
    .allow_read("/usr")           // Read system libraries
    .allow_read_write("/tmp/work") // Write to work directory
    .allow_process_spawn()         // Python needs to exec
    // Network is denied by default
    .env("PATH", "/usr/bin:/usr/local/bin")
    .build();

// 2. Get the platform-appropriate enforcer
let enforcer = get_enforcer()?;

// 3. Create a sandboxed backend
let backend = ProcessBackend::with_sandbox(
    ProcessConfig::default(),
    enforcer,
    policy,
);

// 4. Execute code — network is blocked, writes restricted
let result = backend.execute(request).await?;

Indicateurs de fonctionnalité

[dependencies]
# Auto-detect platform enforcer
adk-sandbox = { version = "2.1.0", features = ["process", "sandbox-native"] }

# Or pick a specific platform
adk-sandbox = { version = "2.1.0", features = ["process", "sandbox-macos"] }
adk-sandbox = { version = "2.1.0", features = ["process", "sandbox-linux"] }

SandboxPolicy

La politique dĂ©finit ce qu’un processus exĂ©cutĂ© en bac Ă  sable est autorisĂ© Ă  faire :

ChampValeur par défautDescription
allowed_paths[] (tout refuser)Chemins du systÚme de fichiers avec accÚs en lecture seule ou en lecture-écriture
allow_networkfalseIndique si l’accĂšs rĂ©seau est autorisĂ©
allow_process_spawnfalseIndique si la création de processus enfants est autorisée
env{}Variables d’environnement pour le processus en bac à sable

Différences entre les plateformes

macOS (Seatbelt) : utilise le principe « autoriser par dĂ©faut, refuser ce qui est dangereux » — commence avec un accĂšs complet, puis bloque le rĂ©seau, les Ă©critures de fichiers et la crĂ©ation de processus. Une approche basĂ©e uniquement sur une liste blanche ne fonctionne pas, car Python a besoin de dizaines de catĂ©gories d’appels systĂšme spĂ©cifiques Ă  macOS au dĂ©marrage.

Linux (bubblewrap) : utilise une liste blanche fondĂ©e sur les espaces de noms — rien n’existe par dĂ©faut, vous ne montez que ce qui est nĂ©cessaire. Installez-le avec apt install bubblewrap ou dnf install bubblewrap.

Windows (AppContainer) : non implĂ©mentĂ©. La conception repose sur des ACL fondĂ©es sur des jetons — un SID restreint sans aucun accĂšs par dĂ©faut, puis des ACL accordĂ©es sur des chemins spĂ©cifiques — mais la crĂ©ation de conteneurs, les ACL, les capacitĂ©s et le nettoyage des objets de travail sont absents, donc probe() renvoie EnforcerUnavailable. ExĂ©cutez sans dispositif d’application des rĂšgles sur Windows, ou utilisez macOS ou Linux, oĂč l’application des rĂšgles est effective.

Exemple

Consultez examples/sandbox_agent/ pour obtenir un exemple complet pilotĂ© par un agent LLM qui exĂ©cute du code Python dans un environnement isolĂ©, avec un accĂšs rĂ©seau bloquĂ© par le noyau du systĂšme d’exploitation.

Exécution de code en bac à sable - Documentation ADK-Rust | ADK-Rust