Aller au contenu

Bac à sable et limites

Restreignez l'accès d'un programme Elide au système de fichiers, au réseau, aux sous-processus, aux threads et au code natif avec --sandbox et les options --allow-*, et limitez les ressources et la durée d'exécution.

Sur cette page

Les programmes s’exécutent sans restriction tant que vous ne passez pas d’option de bac à sable. --sandbox refuse l’accès au système de fichiers ; le réseau et les sous-processus restent autorisés tant que vous ne listez pas d’hôtes ou de commandes :

elide --sandbox --allow-read=. --allow-net=example.com run app.js
0:11 / 0:11

Autoriser l’accès aux fichiers

elide --allow-read=. --fs-audit run app.js
[elide.fs] allow read open hello.txt
[elide.fs] DENY  write open out.txt

Un accès refusé échoue comme sur un fichier protégé : EACCES: permission denied, open 'hello.txt'. Les chemins relatifs sont résolus à partir du répertoire de travail.

Les programmes WASI n’ont accès à aucun répertoire de l’hôte tant que vous n’en associez pas un avec WasiMapDirs ; voir WebAssembly. Ces autorisations s’appliquent aux répertoires associés, et une ouverture WASI nécessite à la fois l’accès en lecture et en écriture.

Autoriser le réseau et les sous-processus

elide --allow-net=localhost --allow-run=ls run app.js

Un appel refusé nomme l’autorisation dont il a besoin :

TypeError: fetch to 'example.com:443' is not permitted; grant it with --allow-net=example.com
Error: spawn of 'echo' is not permitted; grant it with --allow-run=echo

Une correspondance avec --deny-* signale denied by --deny-net ou denied by --deny-run. La politique vérifie la commande réellement exécutée : un appel via le shell est vérifié comme sh. Lancez les sous-processus avec execFileSync de node:child_process.

Threads et accès natif

ProgrammeThreads par défautAccès natif par défaut
JavaScript, TypeScriptSans objet : les workers de node:worker_threads s’exécutent avec toutes les optionsAutorisé
Entrée PythonAutorisésAutorisé
Entrée Python avec --sandbox ou une autorisation --allow-read/--allow-writeRefusés ; ajoutez --allow-threadsAutorisé
Python sous --interopRefusés, même avec --allow-threadsAutorisé
# threads.py
import threading
out = []
t = threading.Thread(target=lambda: out.append("worker ran"))
t.start(); t.join()
print(out[0])
elide python threads.py                                         # worker ran
elide --sandbox --allow-read=. python threads.py                # Creating threads is not allowed.
elide --sandbox --allow-read=. --allow-threads python threads.py  # worker ran

--no-native refuse l’accès natif. Python perd alors certaines fonctionnalités, comme les sockets AF_UNIX (AttributeError: module 'socket' has no attribute 'AF_UNIX') et les signaux arbitraires, et démarre plus lentement. --allow-native explicite la valeur par défaut ; le combiner avec --no-native est une erreur d’utilisation (code de sortie 2).

Définir des limites

--limit s’applique aux programmes JavaScript et TypeScript. Une valeur est un nombre, 0 pour interdire, ou unlimited, la valeur par défaut. Les autres noms, langages ou commandes sont des erreurs d’utilisation.

elide --limit=workers=4 --limit=fds=128 --max-mem=512m --timeout=30s run app.js

Les workers héritent des autorisations de leur parent. Ces options n’isolent pas le processus d’un plantage natif.

Choisir un profil

--sandbox=trusted est le profil par défaut. --sandbox=sandboxed et --sandbox=isolated ne sont pas disponibles et se terminent avec le code 2.

Options

OptionEffet
--sandboxRefuse l’accès au système de fichiers. Le réseau et les sous-processus restent autorisés.
--allow-read[=PATHS]Autorise la lecture partout, ou aux chemins listés. Implique --sandbox.
--allow-write[=PATHS]Autorise l’écriture partout, ou aux chemins listés. Implique --sandbox.
--fs-auditJournalise chaque décision sur le système de fichiers dans stderr.
--allow-net[=HOSTS]Autorise tout accès réseau, ou seulement les hôtes listés (HOST ou HOST:PORT).
--allow-run[=CMDS]Autorise tous les sous-processus, ou seulement les commandes listées.
--deny-net=HOSTSRefuse des hôtes même s’ils sont autorisés.
--deny-run=CMDSRefuse des commandes même si elles sont autorisées.
--allow-env[=NAMES]Permet à elide.pkl de lire davantage de variables d’environnement, ou toutes. process.env ne change pas.
--allow-threadsAutorise les threads Python dans un bac à sable.
--allow-nativeAutorise l’accès natif (par défaut).
--no-nativeRefuse l’accès natif.
--limit=workers=NLimite les workers actifs ; un dépassement lève ERR_WORKER_LIMIT.
--limit=fds=NLimite les descripteurs node:fs ouverts ; un dépassement lève EMFILE.
--max-mem=SIZELimite la taille du tas ; un dépassement est une erreur de mémoire insuffisante avec un code de sortie non nul.
--timeout=DURATIONArrête le programme après DURATION avec le code de sortie 124.

Les listes sont séparées par des virgules. --deny-net et --deny-run exigent la forme avec =.

Exemples

Cette page vous a-t-elle aidé ?