Перейти к содержимому

Песочница и ограничения

Ограничьте доступ программы Elide к файловой системе, сети, подпроцессам, потокам и нативному коду флагами --sandbox и --allow-*, а также ограничьте ресурсы и время работы.

На этой странице

Программы работают без ограничений, пока вы не передадите флаг песочницы. --sandbox запрещает доступ к файловой системе; сеть и подпроцессы остаются разрешены, пока вы не перечислите хосты или команды:

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

Разрешение доступа к файлам

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

Запрещённый доступ завершается ошибкой, как для защищённого файла: EACCES: permission denied, open 'hello.txt'. Относительные пути разрешаются от рабочего каталога.

Программы WASI не имеют доступа к каталогам хоста, пока вы не сопоставите каталог через WasiMapDirs; см. WebAssembly. Эти разрешения действуют для сопоставленных каталогов, а открытию файла в WASI нужен доступ и на чтение, и на запись.

Разрешение сети и подпроцессов

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

Запрещённый вызов называет разрешение, которое ему нужно:

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

Совпадение с --deny-* сообщает denied by --deny-net или denied by --deny-run. Политика проверяет команду, которая фактически запускается, поэтому вызов через оболочку проверяется как sh. Запускайте подпроцессы через execFileSync из node:child_process.

Потоки и нативный доступ

ПрограммаПотоки по умолчаниюНативный доступ по умолчанию
JavaScript, TypeScriptНеприменимо: воркеры node:worker_threads работают при любом флагеРазрешён
Точка входа на PythonРазрешеныРазрешён
Точка входа на Python с --sandbox или разрешением --allow-read/--allow-writeЗапрещены; добавьте --allow-threadsРазрешён
Python под --interopЗапрещены, даже с --allow-threadsРазрешён
# 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 запрещает нативный доступ. Тогда в Python недоступны некоторые возможности, например сокеты AF_UNIX (AttributeError: module 'socket' has no attribute 'AF_UNIX') и произвольные сигналы, а запуск становится медленнее. --allow-native явно задаёт значение по умолчанию; сочетание с --no-native — ошибка использования (код выхода 2).

Ограничения ресурсов

--limit действует для программ на JavaScript и TypeScript. Значение — число, 0 для запрета или unlimited (по умолчанию). Другие имена, языки или команды — ошибки использования.

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

Воркеры наследуют разрешения родителя. Эти флаги не защищают процесс от нативного сбоя.

Выбор профиля

--sandbox=trusted — профиль по умолчанию. --sandbox=sandboxed и --sandbox=isolated недоступны и завершаются с кодом 2.

Флаги

ФлагДействие
--sandboxЗапрещает доступ к файловой системе. Сеть и подпроцессы остаются разрешены.
--allow-read[=PATHS]Разрешает чтение везде или по указанным путям. Подразумевает --sandbox.
--allow-write[=PATHS]Разрешает запись везде или по указанным путям. Подразумевает --sandbox.
--fs-auditЗаписывает каждое решение по файловой системе в stderr.
--allow-net[=HOSTS]Разрешает любой сетевой доступ или только к указанным хостам (HOST или HOST:PORT).
--allow-run[=CMDS]Разрешает все подпроцессы или только указанные команды.
--deny-net=HOSTSЗапрещает хосты, даже если они разрешены.
--deny-run=CMDSЗапрещает команды, даже если они разрешены.
--allow-env[=NAMES]Позволяет elide.pkl читать больше переменных окружения или все. process.env не меняется.
--allow-threadsРазрешает потоки Python в песочнице.
--allow-nativeРазрешает нативный доступ (по умолчанию).
--no-nativeЗапрещает нативный доступ.
--limit=workers=NОграничивает число активных воркеров; при превышении выбрасывается ERR_WORKER_LIMIT.
--limit=fds=NОграничивает число открытых дескрипторов node:fs; при превышении выбрасывается EMFILE.
--max-mem=SIZEОграничивает размер кучи; превышение приводит к ошибке нехватки памяти с ненулевым кодом выхода.
--timeout=DURATIONОстанавливает программу через DURATION с кодом выхода 124.

Списки разделяются запятыми. --deny-net и --deny-run требуют формы с =.

Примеры

Была ли эта страница полезной?