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 :
- Isolation des processus â processus enfants avec isolation de lâenvironnement et application dâun dĂ©lai dâexpiration
- 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
| Backend | Niveau dâisolation | Langages | Indicateur de fonctionnalitĂ© |
|---|---|---|---|
ProcessBackend | Environnement + dĂ©lai dâattente | Rust, Python, JS, TS, Commande | process (par dĂ©faut) |
ProcessBackend + bac Ă sable | Niveau noyau | Identique Ă ci-dessus | process + sandbox-native |
WasmBackend | Complet (mémoire, fs, réseau) | WASM uniquement | wasm |
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ésultat | Signification |
|---|---|
IsolationClass::SubprocessOnly | Un 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::OsEnforced | Un 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,nodeourustcnu est recherchĂ© dans lePATHde lâappelant et transmis au processus enfant sous forme de chemin absolu. Cela signifie que lâenfant nâa pas besoin de son proprePATHpour dĂ©marrer â auparavant, lâappelant devait placerPATHdansExecRequest::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 liensrust-lldde la chaĂźne de compilation Rust afin quâunlink.exesans rapport, situĂ© plus tĂŽt dansPATH, 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
| Plateforme | MĂ©canisme dâapplication | Fonctionnement |
|---|---|---|
| macOS | Seatbelt (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 |
| Linux | bubblewrap (bwrap) | Isolation de lâespace de noms du systĂšme de fichiers (montages sur liste blanche) |
| Windows | AppContainer | Non 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 :
| Champ | Valeur par défaut | Description |
|---|---|---|
allowed_paths | [] (tout refuser) | Chemins du systÚme de fichiers avec accÚs en lecture seule ou en lecture-écriture |
allow_network | false | Indique si lâaccĂšs rĂ©seau est autorisĂ© |
allow_process_spawn | false | Indique 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.