vetto
Lightweight, zero-leak security sandbox and isolation boundary for AI agents and developer workflows.
What is vetto?
vetto provides unprivileged, kernel-enforced isolation for autonomous AI coding agents and developer automation tools. It protects host systems from rogue LLM commands, supply-chain attacks, unauthorized network egress, and secret exfiltration during autonomous agent execution across Claude Code, Windsurf, OpenDevin, Cursor, OpenCode, Aider, and custom CLI agents.
When autonomous agents run with full execution privileges (e.g. --dangerously-skip-permissions or unattended loops), a single hallucination, compromised dependency hook, or prompt injection can wipe host files or leak sensitive developer keys (~/.ssh, ~/.aws, .env). vetto neutralizes these risks at the OS kernel boundary before untrusted processes execute:
- Zero Secret Leakage: Credential stores (
~/.ssh,~/.aws,~/.gnupg) and intra-project secrets (.env*,*.pem,*.key) are physically stripped from environment variables and masked at the filesystem layer. - Strict Write Containment: Filesystem writes are locked strictly to the target workspace root and
/tmp. Destructive host modifications are blocked fail-closed. - Governed Network Egress: Network access is blocked by default (
--net off) or routed exclusively through a loopback relay broker enforcing domain allowlists and anti-DNS rebinding defenses. - Deterministic Process Teardown: Fail-closed process supervision sweeps all descendant fork trees, preventing runaway zombie daemons and orphaned background processes.
- Ultra-Low Latency: Near-zero startup overhead (~4ms), 0 MB idle RAM, and zero background daemons.
Core Architecture & Backends
vetto enforces isolation using native operating system kernel primitives without requiring root privileges or container daemons:
┌────────────────────────────────────────────────────────────────────────┐
│ vetto Supervisor Engine │
│ (Fail-Closed Lifecycle · Env Sanitizer · Secret Masker · Audit Log) │
└──────────────────────────────────┬─────────────────────────────────────┘
│
┌─────────────────────────┴─────────────────────────┐
▼ ▼
┌─────────────────────────────────┐ ┌─────────────────────────────────┐
│ Linux Backend │ │ macOS Backend │
│ ─────────────────────────────── │ │ ─────────────────────────────── │
│ • Rootless Namespaces (bwrap) │ │ • Apple Seatbelt Sandbox C API │
│ • Landlock LSM Inode Scoping │ │ • Dynamic Scheme SBPL Engine │
│ • Seccomp-BPF Syscall Filter │ │ • Strict Workspace Write Bounds │
│ • PID Namespace / Deathsig │ │ • Watchdog Supervision & kqueue │
│ • cgroups v2 / rlimit Ceilings │ │ • Process-Group Death Sweep │
└─────────────────────────────────┘ └─────────────────────────────────┘
Linux Backend
- Rootless Namespaces & Bubblewrap (
bwrap): Isolates Mount (CLONE_NEWNS), Network (CLONE_NEWNET), PID (CLONE_NEWPID), and IPC (CLONE_NEWIPC) namespaces entirely in unprivileged user space. - Landlock LSM: Kernel-level VFS inode access control (ABI v1–v6) restricting filesystem reads and writes.
- Seccomp-BPF: Enforces fine-grained system call interception before
execve(UnixOnlyandAgentMin), terminating debugger attachment (ptrace), eBPF injections (bpf), userfaultfd exploits, and raw socket allocations. - cgroups v2 & rlimits: Immutable resource ceilings on CPU time (
RLIMIT_CPU), virtual memory address space (RLIMIT_AS), process limits (RLIMIT_NPROC), and file size (RLIMIT_FSIZE).
macOS Backend
- Native Seatbelt: Dynamic Scheme SBPL (Sandbox Profile Language) compilation loaded via Apple's private C API (
libsandbox.1.dylib), bypassing brittle CLI wrappers. - Filesystem Confinement: Strict write isolation locked to the workspace root and
/tmp. Known secret paths (~/.ssh,~/.aws,.env) are masked via tail denials (deny_resolved). - Process Lifecycle Supervision: Watchdog supervisor thread monitoring parent death via
kqueueand executing clean process-group (pgroup) SIGKILL sweeps on termination.
Zero-Leak Design
- Sanitized Environment Variables: Strips all sensitive credentials (
HARD_DENY_PREFIXES: 35 secret patterns includingAWS_*,GITHUB_*,OPENAI_*,ANTHROPIC_*, SSH keys, and auth tokens) and normalizes$PATHto prevent directory traversal and binary hijacking. - Secret Masking Overlays: High-risk paths (
~/.ssh,~/.aws,.env*,*.pem,*.key) are masked with mode-000 tmpfs overlays or/dev/nullbinds. - Gated Network Egress: Network namespaces maintain loopback-only visibility under
--net off. When domain egress is granted, traffic routes through an in-process TCP broker with DNS pinning. - Fail-Closed Guarantees: If any requested boundary or kernel security primitive is unavailable, vetto exits immediately with code
125(EXIT_FAIL_CLOSED) rather than running unconfined.
Installation
Quick Install Script (Linux, macOS, WSL2)
Install the official pre-compiled standalone binary to ~/.local/bin:
|
System-wide installation:
|
Cargo (crates.io)
Compile and install directly from crates.io:
NPM Global Package
Install as a global Node.js binary wrapper with bundled native executables:
Homebrew (macOS & Linux)
Docker / Containerized Workflows
To run vetto inside CI containers or Docker devcontainers, ensure unprivileged user namespaces are enabled:
Every release binary is attested with SLSA Level 3 Provenance and signed with Minisign (Key ID 75ECEC9B5080C590). Pre-built archives and CycloneDX 1.5 SBOMs are published on GitHub Releases.
Quickstart & Common Commands
1. Diagnose Environment & Permissions
Verify platform capabilities, kernel LSM status, and isolation readiness:
Add --fix to display OS-specific remediation commands for missing primitives:
2. Run Commands Under the Sandbox
Execute any arbitrary command or agent under the default strict sandbox:
# Execute command under default strict sandbox
# Direct shortcut syntax
3. Wrap Commands with Developer Profiles
Use developer profiles for full toolchain compatibility:
# Run with the 'dev' profile (permits compiler & package caches)
# Shortcut using direct execution flag
4. Verify & Audit Policies
Check policies, test path rules, and inspect security violations:
# Check configuration and verify policies without spawning
# Or lint the policy for dangerous broad paths
# Run throwaway leak-detection battery on current policy
# Inspect blocked filesystem attempts, syscalls, and network egress from past runs
# Print post-session security recap
5. Transparent Agent Shims (vetto enable)
Activate zero-overhead transparent shims for your AI coding assistant:
# Enable transparent sandbox wrapping for your agent
# Now run your agent normally — it runs sandboxed under the hood!
# Inspect or disable shims
6. Dynamic Policy Grants (No Manual TOML Editing)
When an agent requires additional access during execution, grant permissions instantly:
Security & Profile Model
Policies in vetto are hierarchical, additive, and strictly typed. Unknown configuration keys fail closed.
Built-in Security Profiles
| Profile | Target Use Case | Filesystem Bounds | Network Egress | Resource Ceilings |
|---|---|---|---|---|
strict (default) |
Untrusted scripts, unattended autonomous agent runs | $PROJECT and /dev/null only; /tmp writes denied; secrets masked |
Denied (--net off) |
Strict: 1h CPU, 8GB RAM, 256 procs, 1024 FDs |
dev |
Active interactive development with compilers and tools | $PROJECT, /tmp, and standard build tool caches (~/.cargo, ~/.npm) |
Denied or provider allowlist | Balanced developer ceilings |
network-isolated |
Hermetic builds, compliance auditing, zero-leak validation | $PROJECT and /tmp; read-only system tools |
Completely disabled (CLONE_NEWNET / SBPL deny) |
Default limits |
ci |
GitHub Actions, GitLab CI, headless evaluation pipelines | Workspace root; automated report output directory | Allowlisted or off | Headless, --tui none, JSON summary on stdout |
For complete threat surface documentation and policy syntax:
- Threat Model & Boundary Guarantees
- Profile Inheritance & Agent Presets
- Platform Backends & Parity Matrix
- Exit Codes Specification
AI Agent Ecosystem Roster
vetto includes 20 native agent presets with automatic credential isolation, configuration path allowlisting, and zero-config network profiles:
| Agent | Preset | Guide | Agent | Preset | Guide |
|---|---|---|---|---|---|
| Claude Code | claude |
Guide | OpenCode | opencode |
Guide |
| OpenAI Codex | codex |
Tutorial | Google Gemini | gemini |
Built-in preset |
| Cursor Agent | cursor |
Guide | Antigravity | antigravity |
Built-in preset |
| Aider | aider |
Guide | Cline | cline |
Guide |
| Codeium Windsurf | windsurf |
Built-in preset | GitHub Copilot CLI | copilot |
Built-in preset |
| Continue CLI | continue |
Built-in preset | Block Goose | goose |
Built-in preset |
| OpenHands | openhands |
Built-in preset | SWE-agent | swe-agent |
Built-in preset |
| Plandex | plandex |
Built-in preset | Mentat | mentat |
Built-in preset |
| GPT Engineer | gpt-engineer |
Built-in preset | Cognition Devin | devin |
Built-in preset |
| Crust AI | crust |
Built-in preset | Amp AI | amp |
Built-in preset |
Model Context Protocol (MCP) Support
Isolate third-party MCP servers connected to Claude Desktop or Codex Desktop:
Comparison: vetto vs. Alternatives
| Dimension | vetto |
Built-in LLM Sandbox | Docker Containers | MicroVMs (Firecracker) |
|---|---|---|---|---|
| Startup Overhead | ~4ms (instant) | 0ms (app-level prompt) | 3.5s – 8s (daemon boot) | 100ms – 500ms |
| Daemon Required | None (zero daemons) | None | dockerd service required |
KVM / containerd |
| RAM Footprint | 0 MB idle | 0 MB | 1.5 GB+ (engine/VM) | 500 MB+ |
| Privilege Level | Unprivileged (no root) | User-level | Root-equivalent (docker group) |
Root / KVM group |
| Filesystem Sync | Instant native I/O | Native | Slow bind mounts / UID issues | 9p / virtio-fs sync |
| Secret Masking | Automatic VFS overlays | None (reads .env, ~/.ssh) |
Manual .dockerignore |
Guest VM disk image |
| Network Egress | Per-domain loopback broker | Unfiltered or app-level | Bridge network or none | Virtualized netstack |
| Fail-Closed Contract | 100% Fail-Closed | Varies / Fail-Open | Container fallback | VM error |
Contributing
We welcome contributions from security researchers, systems engineers, and AI developers!
- Fork the repository and create your branch from
main. - Follow strict code hygiene: adhere to formatting, clippy lints, and existing error-handling idioms.
- Ensure every capability claim is backed by real kernel tests:
- No mock tests for kernel boundaries: all boundary checks must assert real kernel enforcement.
- No silent downgrades: any failure to establish isolation must fail closed with exit code
125.
- Open a Pull Request with a clear description of changes and test evidence.
For security vulnerabilities, please refer to SECURITY.md and report responsibly via GitHub Security Advisories.
License
vetto is distributed under the dual Apache-2.0 / MIT license.
See LICENSE and THIRD_PARTY_NOTICES.md for full terms.