Lightweight process sandboxing for Linux
[dependencies]
sandbox-rs = "0.1"
use sandbox_rs::{SandboxBuilder, SeccompProfile, PrivilegeMode};
use std::time::Duration;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut sandbox = SandboxBuilder::new("my-sandbox")
.privilege_mode(PrivilegeMode::Unprivileged)
.memory_limit_str("256M")?
.cpu_limit_percent(50)
.timeout(Duration::from_secs(30))
.seccomp_profile(SeccompProfile::IoHeavy)
.build()?;
let result = sandbox.run("/bin/echo", &["hello world"])?;
println!("exit={} mem={}B cpu={}μs", result.exit_code, result.memory_peak, result.cpu_time_us);
Ok(())
}
Note:
memory_peakandcpu_time_usrequire privileged mode (cgroups v2). In unprivileged mode these values are0.
# Run a program in a sandbox (auto-detects privilege mode)
sandbox-ctl /bin/echo "hello world"
# Use a security profile with resource limits
sandbox-ctl --profile moderate --memory 512M --cpu 50 python script.py
# Check system capabilities
sandbox-ctl check
# List seccomp profiles
sandbox-ctl seccomp
Each profile includes all syscalls from profiles below it (cumulative).
| Profile | Syscalls |
|---|---|
Essential |
Process bootstrap only (~40): execve, mmap, brk, read, write, exit, ... |
Minimal |
Essential + signals, pipes, timers, process control (~110 total) |
IoHeavy |
Minimal + file manipulation: mkdir, chmod, unlink, rename, fsync, ... |
Compute |
IoHeavy + scheduling/NUMA: sched_setscheduler, mbind, membarrier, ... |
Network |
Compute + sockets: socket, bind, listen, connect, sendto, ... |
Unrestricted |
Network + privileged: ptrace, mount, bpf, setuid, ... |
MIT — see LICENSE for details.
$ claude mcp add sandbox-rs \
-- python -m otcore.mcp_server <graph>