Zum Inhalt springen

Sandbox und Limits

Beschränken Sie den Zugriff eines Elide-Programms auf Dateisystem, Netzwerk, Unterprozesse, Threads und nativen Code mit --sandbox und --allow-*-Flags, und begrenzen Sie Ressourcen und Ausführungsdauer.

Auf dieser Seite

Programme laufen uneingeschränkt, bis Sie ein Sandbox-Flag übergeben. --sandbox verweigert den Dateisystemzugriff; Netzwerk und Unterprozesse bleiben erlaubt, bis Sie Hosts oder Befehle angeben:

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

Dateizugriff erlauben

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

Ein verweigerter Zugriff schlägt wie bei einer geschützten Datei fehl: EACCES: permission denied, open 'hello.txt'. Relative Pfade werden vom Arbeitsverzeichnis aus aufgelöst.

WASI-Programme können erst auf Host-Verzeichnisse zugreifen, wenn Sie eines mit WasiMapDirs zuordnen; siehe WebAssembly. Diese Freigaben gelten für zugeordnete Verzeichnisse, und ein Öffnen unter WASI braucht sowohl Lese- als auch Schreibzugriff.

Netzwerk und Unterprozesse erlauben

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

Ein verweigerter Aufruf nennt die Freigabe, die er braucht:

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

Ein Treffer bei --deny-* meldet denied by --deny-net oder denied by --deny-run. Die Richtlinie prüft den Befehl, der tatsächlich läuft, ein Shell-Aufruf wird also als sh geprüft. Starten Sie Unterprozesse mit execFileSync aus node:child_process.

Threads und nativer Zugriff

ProgrammThreads standardmäßigNativer Zugriff standardmäßig
JavaScript, TypeScriptNicht zutreffend: Worker aus node:worker_threads laufen unter jedem FlagErlaubt
Python als EinstiegspunktErlaubtErlaubt
Python als Einstiegspunkt mit --sandbox oder einer Freigabe --allow-read/--allow-writeVerweigert; fügen Sie --allow-threads hinzuErlaubt
Python unter --interopVerweigert, auch mit --allow-threadsErlaubt
# 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 verweigert den nativen Zugriff. Python fehlen dann einige Funktionen, etwa AF_UNIX-Sockets (AttributeError: module 'socket' has no attribute 'AF_UNIX') und beliebige Signale, und es startet langsamer. --allow-native legt den Standard ausdrücklich fest; die Kombination mit --no-native ist ein Bedienungsfehler (Exit-Code 2).

Limits setzen

--limit gilt für JavaScript- und TypeScript-Programme. Ein Wert ist eine Zahl, 0 zum Verbieten oder unlimited, der Standard. Andere Namen, Sprachen oder Befehle sind Bedienungsfehler.

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

Worker erben die Freigaben des Programms, das sie startet. Diese Flags schützen den Prozess nicht vor einem nativen Absturz.

Profil wählen

--sandbox=trusted ist das Standardprofil. --sandbox=sandboxed und --sandbox=isolated sind nicht verfügbar und enden mit Exit-Code 2.

Flags

FlagWirkung
--sandboxVerweigert den Dateisystemzugriff. Netzwerk und Unterprozesse bleiben erlaubt.
--allow-read[=PATHS]Erlaubt Lesen überall oder unter den angegebenen Pfaden. Impliziert --sandbox.
--allow-write[=PATHS]Erlaubt Schreiben überall oder unter den angegebenen Pfaden. Impliziert --sandbox.
--fs-auditProtokolliert jede Dateisystem-Entscheidung auf stderr.
--allow-net[=HOSTS]Erlaubt jeden Netzwerkzugriff oder nur die angegebenen Hosts (HOST oder HOST:PORT).
--allow-run[=CMDS]Erlaubt alle Unterprozesse oder nur die angegebenen Befehle.
--deny-net=HOSTSVerweigert Hosts, auch wenn sie erlaubt sind.
--deny-run=CMDSVerweigert Befehle, auch wenn sie erlaubt sind.
--allow-env[=NAMES]Lässt elide.pkl weitere oder alle Umgebungsvariablen lesen. process.env bleibt unverändert.
--allow-threadsErlaubt Python-Threads in einer Sandbox.
--allow-nativeErlaubt nativen Zugriff (der Standard).
--no-nativeVerweigert nativen Zugriff.
--limit=workers=NBegrenzt aktive Worker; eine Überschreitung wirft ERR_WORKER_LIMIT.
--limit=fds=NBegrenzt offene node:fs-Handles; eine Überschreitung wirft EMFILE.
--max-mem=SIZEBegrenzt die Heap-Größe; eine Überschreitung ist ein Out-of-Memory-Fehler mit Exit-Code ungleich null.
--timeout=DURATIONBeendet das Programm nach DURATION mit Exit-Code 124.

Listen sind kommagetrennt. --deny-net und --deny-run brauchen die Form mit =.

Beispiele

War diese Seite hilfreich?