pVisor isolation architecture¶
Status: implementation plus roadmap. Linux
pvisor run --safeimplements the FUSE + synthetic root + rootless user/mount namespace + Landlock path described in section 2. macOS--safeimplements Seatbelt-enforced staged writes and deny-all socket confinement; filesystem reads remain ambient and are reported separately. Docker and libkrun/KVM transports also exist. A Virtualization.framework backend for transparent macOS executable isolation is a researched design, not an implemented backend. Seccomp/resource enforcement, LiteBox VFS, and Firecracker remain roadmap work unless stated otherwise.
pVisor needs more than one isolation backend. A local coding Agent values fast startup and an exact view of the developer's workspace; an untrusted tenant requires a boundary that remains useful after the guest runtime is compromised. The design therefore separates the transactional workspace from the enforcement boundary instead of trying to make one mechanism serve both roles.
The multiple backends are an implementation portfolio, not a configuration surface imposed on the user. The normal product experience remains:
pVisor probes the host, workload, and available placement, selects a backend, constructs the workspace, and applies the policy. Users do not configure Landlock rights, mount propagation, UID maps, 9P transports, seccomp JSON, container capabilities, TAP devices, or microVM images. Expert backend flags may exist for development and diagnosis, but must not be required for the normal path.
Easy to use does not mean an invisible security downgrade. If the requested
guarantee cannot be provided, pVisor either chooses another available backend
or returns one actionable error. It never reports a cwd-only Run as safely
sandboxed.
1. Common model¶
RunSpec / capability policy
|
v
pVisor supervisor (trusted)
|
+-- WorkspaceOverlay
| lower + compose + writable upper
| review / checkpoint / apply / drop
|
+-- IsolationBackend
workspace-landlock | workspace-seatbelt
litebox | container | microvm
|
v
Agent process tree (untrusted)
WorkspaceOverlay is the data plane for file changes. It provides an isolated
Run view, copy-on-write, whiteouts, and an auditable changeset. It does not
by itself prevent a process from opening a path outside that view.
IsolationBackend is the security plane. It determines which kernel, syscall
surface, namespace, host paths, file descriptors, and network paths the Agent
can reach. Every backend consumes the same logical workspace and must return a
changeset with the same review/apply/drop semantics.
The following invariants apply to backends that claim complete capability enforcement. A partial native backend may enforce a smaller dimension only when the Run Bundle identifies that dimension explicitly and records the remaining ambient access:
- Deny by default; every host file, socket, credential, device, and endpoint is an explicit capability.
- The Agent never receives host control-plane credentials or the Docker socket.
- Only
stdin,stdout,stderr, the Run-scoped Agent ABI transport, and explicitly granted resource handles cross the execution boundary. - The writable workspace is separate from the read-only base. A successful process exit never implies permission to apply its changes.
- Requested and effective enforcement are recorded separately. An enforce
request fails closed when its backend is unavailable; it never silently
falls back to the current
cwd-only behavior. - pVisor records enough evidence to audit the boundary: backend/version, workspace digest, effective UID/capabilities, kernel feature probes, network mode, resource limits, image/rootfs digest, and downgrade reasons.
2. Native host paths¶
2.1 Linux: FUSE + Workspace + Landlock¶
This is the preferred lightweight Linux host path. It keeps today's embedded FUSE OverlayFS and adds a kernel-enforced, unprivileged filesystem policy to the Agent process tree.
Landlock is entirely internal: no system policy file, root helper, daemon, or per-project rule configuration is exposed to the user. pVisor derives the rules from the workspace, executable/runtime closure, explicit inputs, and Run-scoped scratch directory.
Current implementation¶
The native Linux safe path is operational for ordinary local executables:
- pVisor self-executes a hidden launcher before Agent code starts;
- the launcher creates one-ID user and private mount namespaces without
/etc/subuid,newuidmap, a setuid binary, or a daemon; - a private tmpfs root bind-projects only the runtime, staged workspace, exact
device nodes, Run-scoped Agent ABI socket, and explicit capabilities before
the launcher enters it with
chroot; arbitrary host pathname Unix sockets are therefore absent rather than left to Landlock; - inherited descriptors above stderr are closed, Landlock ABI v3 handles all
filesystem rights through
TRUNCATE,no_new_privsis set, namespace and ambient capabilities are cleared, and the launcherexecs the Agent; - the writable FUSE merged workspace and explicit read/write capabilities are admitted, while the executable and a broad host runtime are read-only;
NetworkCapability::Denyalso creates a private network namespace. Public and allowlist proxy policies remain cooperative and are not reported as non-bypassable;- any namespace or Landlock setup error terminates before Agent execution with a reserved infrastructure result and a Run Bundle downgrade warning.
The broad immutable runtime currently includes existing /bin, /sbin,
/usr, /lib*, /etc, and the process-local procfs views. This favors
compatibility with shell, Python, Node, and dynamically linked local tools. A
measured runtime-closure builder may narrow it later; the current policy never
makes those hierarchies writable.
The default pVisor dependency graph is independent of the analytical storage
stack: it does not link Lance/DataFusion or protobuf/prost. Durable Lance
Chronicle integration and the Jujutsu OverlayFS upper are separately enabled
by lance-chronicle and jujutsu-overlay.
pVisor process
+-- embedded FUSE server
| base/compose (read-only) + upper (writable)
| |
| v
| merged workspace
|
+-- small sandbox launcher
close unrelated FDs
synthetic bind-projected root + chroot
PR_SET_NO_NEW_PRIVS
Landlock ruleset
|
v
Agent process tree
The pVisor supervisor and FUSE request loop remain outside the chroot and Landlock domain. The child receives read/write access to the merged workspace, read/execute access to a runtime, and read-only access to explicit inputs. An unprojected path is absent from the synthetic root; Landlock independently enforces access rights over projected hierarchies. Absolute paths are resolved inside that root rather than redirected into the workspace.
2.2 Minimum policy¶
| Hierarchy | Effective access |
|---|---|
| merged workspace | read, write, create, remove, rename, link as required |
| Agent executable and loader | read, execute |
| required shared libraries and runtime data | read-only |
| explicit input datasets | read-only |
| Run scratch directory | read/write; preferably a size-limited tmpfs |
| pVisor state, pChronicle, source credentials, home directory | denied |
/proc, /sys, host sockets |
not admitted to Agent access unless explicitly projected or separately virtualized |
| minimal devices | exact null, zero/full, random/urandom, and tty nodes only |
Landlock is additive to normal DAC/ACL/LSM checks; it does not grant an access the process did not already have. The launcher must negotiate the running kernel's Landlock ABI and handle all security-relevant rights supported by that ABI. Older ABIs may lack controls such as cross-directory refer or truncate, so pVisor must publish the effective guarantee rather than a boolean "Landlock enabled" flag.
Files opened before landlock_restrict_self are not retroactively constrained.
FD hygiene is consequently part of the boundary: prepare directory handles,
close everything not granted, install no_new_privs and the ruleset, then
exec. This setup belongs in a small auditable launcher, not in a complex
post-fork closure of the multithreaded supervisor.
2.3 Security and operational properties¶
Strengths
- No host root or persistent privileged daemon is required.
- Startup and steady-state overhead are small; file contents still use the existing FUSE/OverlayFS path.
- Workspace fidelity remains the best of the native host paths, including current review, checkpoint, apply, and drop behavior.
- A child can no longer escape merely by using
..or an absolute host path.
Limits
- The Agent still uses the host kernel and its native syscall ABI.
- Landlock is a filesystem access-control layer, not a root filesystem, network namespace, resource controller, or complete process sandbox.
- Runtime allowlists are difficult for dynamic language stacks unless pVisor builds a minimal runtime bundle.
- FUSE context switches remain on the hot path for workspace I/O.
- Linux only. The macOS sibling path has a different, explicitly narrower Seatbelt boundary.
The implementation already combines Landlock with an empty capability set,
no_new_privs, rootless user/mount namespaces, and a network namespace for
deny-all Runs. Seccomp, PID namespaces, rlimit/cgroup limits, and transparent
enforcement for selective egress remain necessary hardening without changing
the workspace contract.
2.4 macOS: FUSE + Seatbelt¶
The native macOS safe path is operational for ordinary local executables. It keeps the same staged macFUSE workspace while adding a kernel-enforced Seatbelt policy around the complete Agent descendant process tree:
- pVisor invokes only the fixed system
/usr/bin/sandbox-exec, never a PATH lookup or a project-supplied wrapper; - the generated SBPL uses
-Dparameters for every writable path, so a workspace name cannot inject policy text; - path-parameterized
file-write*rules admit only the mounted staged workspace, explicit read-write filesystem capabilities, exact terminal/device handles, a Run-owned temporary directory, and a one-time setup attestation; - the hidden launcher writes and unlinks that attestation before
execof the Agent. A profile compile/apply failure therefore cannot be mistaken for an Agent exit and terminates the Run as an infrastructure failure; NetworkCapability::Denystarts from a deny-by-default profile, blocks IP sockets and outbound ambient host Unix sockets, and retains only the exact Run-scoped Agent ABI plus Unix IPC rooted in Run-owned directories;- public and selective proxy modes remain cooperative because the first implementation does not yet constrain direct sockets to only the in-process proxy endpoint.
The compatibility profile deliberately leaves filesystem reads ambient. This
avoids hard-coding a brittle closure of Homebrew, Xcode, Python, Node, Rustup,
SDK, framework, and user-installed runtime paths. Consequently the Run Bundle
sets filesystem_write_non_bypassable=true but keeps
filesystem_read_non_bypassable=false and the aggregate
filesystem_non_bypassable=false. A future measured runtime-closure mode may
make reads deny-by-default without changing the workspace contract.
Seatbelt improves the local macOS boundary materially, but it is not a VM or a
complete process sandbox: the host kernel, PID namespace, syscall surface, and
resource accounting remain shared. The sandbox-exec interface is deprecated
by Apple even though it remains shipped, so pVisor probes the fixed binary and
fails closed instead of promising indefinite platform availability. macFUSE is
still required for transactional staging until an FSKit backend is available.
2.5 macOS: Virtualization.framework + host-root overlay¶
This is the proposed macOS kernel-isolation path for native Mach-O workloads. It is the macOS analogue of the implemented Linux libkrun full-root executor, but it cannot use libkrun: a macOS guest must be booted by Apple's Virtualization.framework on Apple Silicon. The objective is that an executable sees the invoking host's root filesystem, with all writes captured by the pVisor upper layer, while executing behind a separate macOS kernel boundary.
The guest's boot disk is not the Agent's logical root. It contains only a
compatible macOS installation and a privileged pVisor guest supervisor. The
host constructs host / + Run upper through OverlayFS/macFUSE, exports the
merged view with VirtioFS, and asks the guest supervisor to enter that view
before executing the target:
host pVisor (Rust)
+-- host / (lower, access still limited by the invoking host identity)
+-- per-Run upper
+-- merged pVisor root (macFUSE / future FSKit)
+-- MacVmExecutor
|
| private Unix socket / framed control protocol
v
pvisor-vz-helper (Swift, one helper process per active VM)
Virtualization.framework
+-- compatible macOS boot disk
+-- stable VirtioFS share tag -> merged pVisor root
+-- VZVirtioSocket control and Agent ABI transports
|
v
pvisor-guestd (root LaunchDaemon)
mount VirtioFS at a private path
chroot into the pVisor root
setgroups / setgid / setuid
set cwd, environment, limits, and stdio
execve host Mach-O
The Swift helper is deliberately outside the Rust supervisor. It owns only the
Objective-C/Swift Virtualization.framework lifecycle and converts it into a
small versioned protocol. The existing RunExecutor contract remains the
product boundary, so selection, cancellation, evidence, review, checkpoint,
apply, and drop keep the same semantics as other pVisor executors.
GhostVM research¶
GhostVM is the closest examined
reference implementation. At commit
fe88d586
it demonstrates the required control-plane primitives:
VZMacOSBootLoader, Mac platform identity, a macOS disk, headless display configuration, VirtioFS, and a virtio socket are assembled in one configuration builder;- one helper process owns an active VM and exposes a host Unix-socket API;
- host requests cross
VZVirtioSocketto a guest agent, which can execute native macOS programs; - a running VirtioFS device can receive a rebuilt directory share through FolderShareService;
- VM suspend/resume uses
saveMachineStateToandrestoreMachineStateFrom; APFSclonefile()creates copy-on-write VM clones in VMController.
These are architectural references, not a filesystem-execution solution.
GhostVM boots and executes against its private disk.img; VirtioFS directories
remain shares mounted under the normal guest root. Its guest exec endpoint is
a user LaunchAgent calling Swift Process.run() with buffered stdout and
stderr. It does not chroot, reproduce credentials, stream stdio, forward
signals, control a process group, or expose a pVisor changeset. The pVisor guest
supervisor must therefore be an independently implemented root LaunchDaemon.
The following split is intentional:
| GhostVM mechanism | pVisor decision |
|---|---|
| VM configuration builder | reproduce the minimal headless subset in pvisor-vz-helper |
| one helper process per VM | retain for VMM crash and lifecycle isolation |
| host Unix socket plus vsock | retain the topology; use a bounded, versioned, streaming protocol |
| runtime VirtioFS replacement | adapt to one stable pVisor-root tag |
| VM suspend/resume | use to amortize boot, with strict template compatibility |
| APFS VM clone | optionally use for creation of a clean boot template |
| GhostTools command execution | replace with privileged pvisor-guestd |
| NAT, bridge, clipboard, audio, GUI automation | omit from the default process-isolation VM |
| private guest root as workload root | reject; the exported pVisor merged root is the workload root |
GhostVM's README currently says its source-code license has not been determined. pVisor may study the public behavior and architecture but must not copy its implementation unless a compatible license is published. The helper and guest supervisor are clean independent implementations against Apple's public API.
Filesystem and identity semantics¶
"Use the host UID and permissions" means preservation of ordinary POSIX file
semantics, not inheritance of every macOS security identity. The host pVisor
opens and serves lower files under the invoking host identity; the guest
supervisor then installs matching numeric UID, GID, and supplementary groups
before execve. The implementation must prove how VirtioFS represents owner,
mode, ACL, symlink, hard-link, xattr, device, and rename semantics rather than
assuming numeric identity is sufficient.
The following host facilities do not become transparent merely because the numeric UID matches:
- TCC decisions, Keychain access groups, code-signing identity and entitlements;
- the host login/GUI bootstrap session, launchd services, Mach ports, Apple Events, and host Unix sockets;
- host kernel state, devices, mounted volumes not visible through the exported root, and credentials held only by host processes.
Modern macOS also presents / through a sealed system volume, a writable data
volume, and firmlinks. pVisor must verify that exporting the host root presents
one coherent namespace and that whiteout/copy-up behavior remains correct
across /System/Volumes/Data. Access to privacy-protected host files may
require Full Disk Access for the trusted host component; pVisor must report
that requirement rather than silently returning a partial root.
Host and guest should initially require the same architecture and exact macOS build. A host executable can depend on the matching dyld shared cache, framework ABI, code-signing policy, and kernel behavior. Cross-build execution is unsupported until a compatibility matrix proves otherwise.
Lifecycle and security profile¶
Cold-installing macOS per Run is infeasible. The intended lifecycle is:
- provision and attest one minimal, matching macOS boot template;
- boot it once, install
pvisor-guestd, and save a clean suspended state; - restore a warm VM or acquire one from a small version-matched pool;
- attach only the Run's VirtioFS root and per-Run vsock endpoints;
- rotate Run identity, authentication material, entropy, IPC, and network state before guest execution;
- execute exactly one untrusted process tree, export the upper through the normal pVisor review path, then destroy or return a scrubbed VM to the pool.
The default VM has no NAT or bridged network device. Network access crosses an explicit vsock relay owned by OverlayNet. Clipboard, host audio, GUI devices, arbitrary shared folders, port forwarding, and ambient host sockets are absent. The host VMM helper receives access only to the prepared merged root, VM template, its private control socket, and required Virtualization.framework resources; it must not inherit pChronicle, source credentials, or unrelated descriptors.
VirtioFS is the largest feasibility risk. GhostVM has an open report of empty mounts and unreadable files under macOS guests. pVisor's design puts dyld, frameworks, SDKs, package managers, and metadata-heavy toolchains on that path, which is more demanding than sharing a project directory. VM startup success is therefore not evidence that the backend is usable or safe.
Feasibility gate¶
This backend remains experimental until one focused prototype passes all of the following on a supported host/guest build pair:
- export a pVisor merged root with a stable VirtioFS tag and mount it without Finder or login-session automation;
- run
/usr/bin/true,/bin/zsh, and representativexcrun/compiler tools afterchroot, with correct cwd, environment, UID, GID, groups, exit status, streaming stdio, signals, cancellation, and descendant cleanup; - prove lower files do not change and all creates, modifications, renames, deletions, whiteouts, xattrs, ACLs, symlinks, and hard links enter the Run upper and survive review/checkpoint/apply/drop;
- exercise dyld/framework loading, code signatures, the sealed-system/data firmlink layout, large output, large files, many small files, concurrent mutation, crash recovery, and warm-restore attachment changes;
- demonstrate that no network, clipboard, arbitrary share, stale vsock token, prior-Run upper, or unrelated host descriptor is reachable;
- publish cold/warm latency and RSS and compare them with Seatbelt and Linux libkrun Runs.
Passing this gate establishes transparent CLI and development-tool execution. GUI applications and host-session services require separate evidence and are not implied by success of the process-level backend.
3. Path B: LiteBox + OverlayFS semantics in the VFS¶
3.1 Positioning¶
This is the high-density libOS path. LiteBox handles the guest Linux ABI and
path resolution in userspace. pVisor should implement its overlay semantics as
a LiteBox filesystem backend or composer, rather than FUSE-mounting a host path
and forwarding guest path strings to host openat.
pVisor supervisor
+-- build content-addressed root/workspace bundle
+-- pass sealed bundle FD + policy + Agent ABI FD
|
`-- LiteBox runner process
LiteBox Linux shim
|
v
LiteBox VFS resolver
+-- read-only root/runtime
+-- read-only workspace layers
`-- writable in-memory/delta upper
|
v
exported changeset
|
v
pVisor review / apply / drop
The adapter preserves pVisor's logical operations:
- ordered read-only base and compose layers;
- copy-up on first write;
- whiteout and opaque-directory semantics;
- deterministic directory merge;
- metadata policy for modes, timestamps, symlinks, hard links, and xattrs;
- a bounded writable upper that can be exported without traversing unrelated host paths.
The initial implementation can reuse LiteBox's read-only tar and in-memory filesystems, but production adoption requires a filesystem semantic matrix. Unsupported metadata must fail explicitly or be normalized by a documented policy; silent loss would break pVisor's changeset contract.
3.2 Security and operational properties¶
Strengths
- Guest paths terminate in the LiteBox VFS; the normal path contains no host pathname lookup.
- A smaller host interface than a native Linux process or general OCI container makes syscall-level policy and deterministic I/O practical.
- Read-only content-addressed bundles can be cached and shared across Runs; writable state remains per-Run.
- No kernel FUSE round trip is needed for VFS operations handled entirely in the runner, which may benefit metadata-heavy workloads.
Limits
- Linux syscall and filesystem compatibility is narrower than Docker or a VM.
- LiteBox and its pVisor adapter are evolving code and expand pVisor's trusted computing base.
- A userspace libOS is not automatically a hardware or kernel security boundary. Bugs in the runner, loader, syscall interception, or shared address space must be assumed possible.
- Packaging native libraries, dynamic runtimes, JITs, and unusual filesystem behavior requires explicit compatibility testing.
The LiteBox runner must therefore execute in a separate unprivileged process
with Landlock, seccomp, no_new_privs, empty capabilities, closed FDs, and
resource limits. The outer kernel policy is the containment boundary if the
guest escapes the LiteBox abstraction. Embedding an untrusted LiteBox guest in
the pVisor supervisor process is forbidden.
3.3 Workspace transfer¶
Avoid a long-lived, arbitrary pathname broker. Prefer immutable and bounded objects:
- pVisor snapshots the logical lower layers and computes a digest.
- It supplies a sealed
memfdor read-only file descriptor to the runner. - LiteBox reads the root and workspace through its VFS.
- Writes enter a per-Run upper with byte/inode quotas.
- The runner exports a canonical, bounded changeset.
- pVisor validates paths, entry types, metadata, sizes, and digest before exposing the changeset to review/apply.
4. Path C: Docker / OCI container¶
4.1 Positioning¶
This is the compatibility and ecosystem path. It supports existing Agent images and conventional Linux runtimes with stronger placement isolation than the host executor, while sharing the host kernel.
The current pVisor Docker/Podman executor already injects a matching static
pVisor into the image and delegates the same RunSpec. It mounts the final
workspace and returns a typed RunResult. It does not yet translate every
pVisor capability into an OCI restriction, and the injected pVisor currently
bootstraps as container root; those are implementation gaps, not properties of
the target design.
host pVisor
+-- WorkspaceOverlay / merged view
+-- Docker or Podman transport
|
v
OCI container
read-only image rootfs
/workspace -> pVisor Run view
tmpfs /tmp
injected pVisor -> Agent
Docker's image-layer OverlayFS and pVisor's WorkspaceOverlay have distinct roles. The former assembles an OCI root filesystem; the latter owns Agent changes and review/apply/drop. Container teardown must not commit the OCI writable layer as the Run result.
4.2 Production profile¶
The target profile is:
- rootless Docker/Podman when supported, or user namespace remapping;
- non-root Agent UID after the injected pVisor bootstrap issue is removed;
- all capabilities dropped,
no-new-privileges, default or tighter seccomp; - read-only container rootfs and a private, bounded
/tmp; - PID, memory, CPU, file-size, and process-count limits;
- no network by default, otherwise a dedicated namespace connected to a pVisor-owned broker;
- no host PID/IPC namespace, privileged mode, device passthrough, arbitrary writable mounts, or Docker socket;
- image digest pinning and an auditable mount/capability manifest.
4.3 Security and operational properties¶
Strengths
- Highest workload compatibility short of a VM.
- Mature image construction, distribution, caching, observability, and operational tooling.
- Namespaces, cgroups, capabilities, seccomp, and host LSMs compose into a practical production boundary.
- Natural deployment path for Kubernetes and existing CI infrastructure.
Limits
- Containers share the host kernel; a kernel or container-runtime escape is outside pVisor's own enforcement.
- Cold-start cost, image storage, daemon/runtime dependencies, and mount plumbing are higher than the local and LiteBox paths.
- Rootful daemon deployments create a larger privileged control plane.
- Host networking, broad bind mounts,
--privileged, or the Docker socket can erase most of the isolation value. - The current Gateway loopback integration requires host networking in some configurations; production enforcement needs a guest-visible broker before that restriction can be removed.
Docker is the recommended compatibility fallback, not the definition of pVisor's capability model.
5. Path D: Firecracker microVM¶
5.1 Positioning¶
This is the strongest multi-tenant path. Each Run or warm Run slot receives a separate guest kernel under KVM. Firecracker intentionally exposes a small device model and provides a jailer that adds host-side namespace/cgroup isolation and drops VMM privileges.
The existing pVisor vm executor statically links libkrun and can either use
an explicit Linux rootfs or pull a public OCI image without a container daemon.
Verified image layers form an immutable cached lower rootfs, guest system writes
stay in a reviewable upper layer. Host paths are not implicitly exposed. An
explicit --overlayfs-base plus --overlayfs-target mounts a staged view at
the selected guest path. A vendored libkrun serves both root and workspace
copy-on-write unions directly over virtio-fs on Linux and macOS, without a
host FUSE mount, materialization, or reconciliation. It uses KVM on Linux
and HVF on Apple Silicon macOS. Linux
additionally confines the VMM with user/mount/network namespaces and Landlock.
The macOS VMM is not yet wrapped in an equivalent host filesystem sandbox, so
libkrun's virtio-fs proxy remains in the invoking user's security context.
OverlayNet and Agent ABI guest relays are not implemented in this phase. This
is not the hostile multi-tenant Firecracker design below:
host pVisor / microVM manager
+-- immutable kernel + rootfs image
+-- read-only workspace/base block image
+-- per-Run writable delta block image
+-- vsock control and Agent ABI transport
+-- TAP/network broker under policy
|
v
Firecracker + jailer
|
v
guest kernel + injected pVisor + Agent
The rootfs and workspace are attached as file-backed block devices. At Run completion, the guest quiesces the filesystem and returns a manifest over vsock; the host validates and converts the delta into the normal pVisor changeset. Firecracker snapshots can amortize boot cost, but VM state, guest memory, block devices, network devices, and vsock endpoints have separate lifecycle and compatibility requirements. Snapshot reuse must rotate Run identity, entropy, credentials, and network state.
5.2 Security and operational properties¶
Strengths
- A separate guest kernel provides the clearest boundary for mutually untrusted tenants and hostile native code.
- Minimal device emulation reduces VMM attack surface relative to a general machine emulator.
- Resource accounting and network topology are explicit at the VM boundary.
- Warm pools and snapshots can make repeated Run startup practical.
Limits
- Requires Linux, KVM, kernel/rootfs image production, a jailer, TAP/network setup, and a microVM lifecycle service.
- Baseline memory and operational complexity are higher than process/container paths even when the VMM is lightweight.
- Workspace block-image creation and delta extraction are less interactive than a directly mounted FUSE workspace.
- Kernel, rootfs, snapshot, and VMM versions form a larger compatibility and patch-management surface.
- Direct host directory sharing would weaken the clean boundary and should not become the production workspace design.
Production Firecracker execution must use the jailer or an equivalent stronger host policy, a dedicated unprivileged VMM identity, cgroups, seccomp, isolated networking, trusted immutable inputs, and no ambient access to host paths.
6. Comparison and selection¶
The table describes the intended production shape, not just the code currently present in the repository. Performance is deliberately relative until a common benchmark has measured cold/warm startup, RSS, syscall-heavy and data-heavy workloads, and teardown.
| Dimension | FUSE + Landlock | FUSE + Seatbelt | macOS VM + VirtioFS | LiteBox VFS | Docker/OCI | Firecracker |
|---|---|---|---|---|---|---|
| Primary goal | fastest Linux least privilege | zero-config macOS write confinement | transparent Mach-O execution with a guest-kernel boundary | dense libOS isolation | compatibility and deployment | hostile multi-tenant isolation |
| Security boundary | synthetic root + host LSM/namespace policy | Seatbelt write/socket policy on host process | macOS guest kernel + Virtualization.framework VMM | libOS plus outer host policy | namespaces/cgroups/LSM, shared kernel | guest kernel + KVM + jailed VMM |
| Host root required | no | no | exported as a pVisor merged root | no | no in rootless mode | host provisioning normally required |
| Guest compatibility | native Linux ABI | native macOS ABI; ambient reads | native Mach-O, initially exact host/guest build only | constrained Linux ABI | broad Linux userspace | full guest Linux |
| Workspace fidelity | highest | highest with macFUSE | target is full-root fidelity; unproven over VirtioFS | requires semantic adapter | high through mount/volume | explicit block/delta conversion |
| Startup cost | lowest | lowest | high cold; warm restore/pool target | low target | medium, image dependent | highest cold; warm snapshot target |
| Per-Run memory | lowest | lowest | high | low target | medium | highest |
| Kernel escape blast radius | host | host | guest first, then VMM boundary | host, after outer escape | host | guest first, then VMM/KVM boundary |
| Portability | Linux | macOS; deprecated launcher dependency | Apple Silicon Mac with supported macOS virtualization | platform/ABI dependent | broad OCI hosts | Linux + KVM |
| Current pVisor status | implemented; seccomp/limits pending | write confinement and deny-all socket policy implemented | researched design; feasibility prototype required | planned | implemented with hardening gaps | libkrun full-root mode exists; Firecracker planned |
Recommended portfolio¶
The selection belongs to pVisor and the placement control plane:
- A normal Linux
pvisor run --safeuses FUSE + Workspace + synthetic root + rootless namespaces + Landlock today. Required controls are installed fail-closed; an unavailable user namespace, mount, chroot, or Landlock ABI never falls back silently. - pVisor may choose LiteBox automatically for a compatible packaged workload when it provides a smaller, measured host interface; the user still invokes the same command.
- Supplying an OCI image naturally selects Docker/Podman. Otherwise pVisor may use an already available rootless runtime as a compatibility fallback; it does not ask users to construct capability or mount flags.
- A fleet configured for hostile multi-tenant execution places the Run on a Firecracker worker. Kernel images, snapshots, networking, and jailer setup are operator-owned fleet infrastructure, not per-user configuration.
- macOS keeps the same command and uses Seatbelt write confinement for the implemented low-latency local path. After the feasibility gate passes, policy requiring a guest-kernel boundary may select the Virtualization.framework backend automatically. Until then, the Bundle reports ambient reads and cooperative selective networking separately and a stricter request routes to another capable placement or fails with one remediation.
These paths are a portfolio, not a mandatory migration ladder. A customer states workload intent and, where necessary, a minimum security requirement; placement chooses only a backend whose measured capabilities satisfy it. The customer does not select kernel mechanisms.
7. One backend contract¶
All implementations should compile one request into one evidence-bearing result:
IsolationRequest {
minimum_boundary,
filesystem_capabilities,
network_capabilities,
compute_limits,
credential_refs,
require_enforcement,
}
IsolationEvidence {
requested_class,
effective_backend,
backend_version,
effective_controls,
unsupported_controls,
workspace_digest,
runtime_or_image_digest,
identity_and_capabilities,
kernel_features,
}
RuntimeCapabilities.filesystem = true is valid only when tests demonstrate
that the complete Agent process tree cannot reach a non-granted hierarchy. A
mounted workspace or successful setup call alone is not evidence.
This contract is internal between admission, placement, and runtime drivers. It is not a requirement for users to understand or configure backend-specific mechanisms.
8. Zero-configuration acceptance criteria¶
The default local path is complete only when all of the following hold:
- one pVisor installation and one
pvisor run --safecommand are sufficient; - no root shell, setuid pVisor daemon, manual group membership, hand-written policy, mount command, or container security flags are required;
- pVisor discovers the executable and its minimal runtime dependencies;
- workspace setup, isolation, cleanup, and changeset recovery are automatic;
- unsupported hosts produce one stable error with a concrete remediation or an automatically available placement, rather than a cascade of kernel details;
pvisor statusand the Run Bundle explain the effective boundary for audit without making that explanation a prerequisite for use;- upgrades preserve the high-level command and Run contract while allowing the selected backend to change.
This criterion rules out 9P as a user-facing Docker setup step. pVisor may use a filesystem protocol internally when a remote backend requires it, but users must never provision a 9P server, mount it, or grant a container mount capability for a normal Run.
9. Validation and benchmarks¶
Every backend must run the same adversarial suite:
- absolute paths,
.., symlink chains, hard links, rename races, magic links,/proc/self/fd, inherited directory FDs, UNIX sockets, device nodes, and descriptor passing; - fork/clone/exec descendants, raw syscalls, static binaries, JIT-generated code, signals, ptrace attempts, and namespace operations where applicable;
- direct sockets, DNS rebinding, literal IPs, UDP/QUIC, loopback, link-local, and metadata-service addresses;
- byte/inode/process/CPU/memory/network exhaustion and cancellation cleanup;
- power loss or supervisor crash during workspace export, review, and apply;
- semantic comparison of the same changeset across all four backends.
The shared benchmark reports distributions rather than a single demo number:
- cold and warm start P50/P95/P99;
- idle and peak RSS;
- sequential and random workspace throughput;
- small-file metadata operations per second;
- syscall-heavy and Python/Node/native Agent workloads;
- checkpoint/export/apply latency and produced bytes;
- host CPU cost, context switches, page faults, and FUSE/VMM/broker overhead.
The implemented Linux suite currently proves staged writes plus denial of
absolute-path reads/writes, symlink escapes, /proc/self/root escapes,
ungranted pathname Unix sockets, preservation of the exact Agent ABI socket,
and host-loopback access in deny-all mode. It also proves setup failures are
reported before Agent execution. This is a useful regression floor, not yet
the complete adversarial/kernel matrix listed above. No backend becomes a
production default from architectural expectations alone; it must publish
repeatable measurements and pass that matrix on every supported host/kernel.