Security & limits

Vulnerability reporting, supported versions, and a concise threat-model summary for operators: SECURITY.md in the repository root.

Implemented primarily in parallax-security and enforced by adapters / the runtime manager.

Threat model (0.1)

Parallax assumes developer-trusted guest code on a local or CI machine. It is not a hardened multi-tenant sandbox.

What exists today:

  • Subprocess isolation for Python / JS
  • Wall-clock timeouts
  • Output / message size limits in ExecutionLimits
  • WASM fuel budgets via wasmtime
  • Bounded concurrent workers
  • Explicit capability tokens recorded in state metadata

What does not exist yet:

  • seccomp / Seatbelt / Windows job objects
  • Network namespace isolation
  • Filesystem jails
  • Cryptographic attestation of snapshots

SandboxPolicy

FieldDefaultNotes
limits.timeout30sWall clock
limits.max_output_bytes1 MiBStdio capture budget
limits.max_message_bytes16 MiBProtocol message ceiling
limits.max_memory_bytes256 MiBSoft hint where supported
limits.max_fuel10_000_000WASM
allow_networkfalsePolicy flag (not fully enforced in MVP workers)
allow_fs_readtrueGuests can read files the OS user can read
allow_fs_writefalsePolicy flag
max_concurrent_workers4Manager hard limit

SandboxPolicy::strict() tightens timeouts and memory for experimentation.

Error codes worth knowing

CodeMeaning
CapabilityViolationRequested feature not available
ResourceLimitExceededConcurrency / size / fuel
ExecutionTimeoutDeadline exceeded
AdapterCrashedWorker died unexpectedly
InvalidSnapshotTamper / schema failure

Handling untrusted input

If you must evaluate untrusted code:

  1. Use strict() limits and short timeouts
  2. Run inside an external container / VM
  3. Do not pass secrets into guest globals
  4. Treat .plx files as untrusted data — validate, but do not assume secrecy

Supply chain

CI runs cargo deny / advisory checks when configured (see repository workflows). Pin toolchain via rust-toolchain / Actions dtolnay/rust-toolchain.