A secure shell for AI agents.
nono is a secure, kernel-enforced capability shell for running untrusted AI agents and processes. Unlike policy-based sandboxes that intercept and filter operations, nono leverages OS security primitives (Landlock on Linux, Seatbelt on macOS) to create an environment where unauthorized operations are structurally impossible.
Quick Start
# Build
# Run a command with filesystem access only to current directory
# Example: Run Claude Code with restricted access
# Block network access (air-gapped mode)
Features
- No escape hatch - Once inside nono, there is no mechanism to bypass restrictions
- Agent agnostic - Works with any AI agent (Claude, GPT, opencode, openclaw) or any process
- OS-level enforcement - Kernel denies unauthorized operations
- Destructive command blocking - Blocks dangerous commands like
rm,dd,chmodby default - Cross-platform - Linux (Landlock) and macOS (Seatbelt)
Usage
# Allow read+write to current directory
# Separate read and write permissions
# Multiple paths
# Block network access
# Dry run (show what would be sandboxed)
# Check why a path would be blocked
Command Blocking
nono blocks dangerous commands by default to prevent AI agents from accidentally (or maliciously) causing harm. This provides defense-in-depth beyond filesystem restrictions.
Blocked Commands
The following categories of commands are blocked by default:
| Category | Commands |
|---|---|
| File destruction | rm, rmdir, shred, srm |
| Disk operations | dd, mkfs, fdisk, parted, wipefs |
| Permission changes | chmod, chown, chgrp, chattr |
| System modification | shutdown, reboot, halt, systemctl |
| Package managers | apt, brew, pip, yum, pacman |
| File operations | mv, cp, truncate |
| Privilege escalation | sudo, su, doas, pkexec |
| Network exfiltration | scp, rsync, sftp, ftp |
Overriding Command Blocks
# Allow a specific blocked command (use with caution)
# Block an additional command
Kernel-Level Protection
Even if a command is allowed via --allow-command, nono applies kernel-level protection that blocks:
- File deletion -
unlink/rmdirsyscalls are blocked - File truncation - Cannot zero out files via truncation
This means even if rm is allowed, the actual deletion is blocked by the kernel:
How It Works
┌─────────────────────────────────────────────────┐
│ Terminal │
│ │
│ $ nono run --allow ./project -- claude │
│ │
│ ┌───────────────────────────────────────────┐ │
│ │ nono (applies sandbox, then exec) │ │
│ │ │ │
│ │ ┌─────────────────────────────────────┐ │ │
│ │ │ Claude Code (sandboxed) │ │ │
│ │ │ - Can read/write ./project │ │ │
│ │ │ - Cannot access ~/.ssh, ~/.aws... │ │ │
│ │ │ - Network: allowed (or blocked) │ │ │
│ │ └─────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘
Platform Support
| Platform | Mechanism | Kernel | Status |
|---|---|---|---|
| macOS | Seatbelt | 10.5+ | Filesystem + Network |
| Linux | Landlock | 5.13+ | Filesystem |
| Linux | Landlock | 6.7+ | Filesystem + Network (TCP) |
| Windows | - | - | Not yet supported |
Roadmap
- Phase 1: Filesystem sandbox (MVP)
- Phase 2: Network isolation (TCP blocking on Linux 6.7+, full on macOS)
- Phase 3: Runtime capability expansion
- Phase 4: Polish and release
See SPEC.md and IMPLEMENTATION.md for detailed design documents.
Security Model
nono follows a capability-based security model with defense-in-depth:
- Command validation - Dangerous commands (rm, dd, chmod, etc.) are blocked before execution
- Sandbox applied - OS-level restrictions are applied (irreversible)
- Kernel enforcement - Even allowed paths cannot have files deleted or truncated
- Command executed - The command runs with only granted capabilities
- All children inherit - Subprocesses also run under restrictions
Defense Layers
| Layer | Protection | Bypass |
|---|---|---|
| Command blocklist | Blocks known-dangerous binaries | --allow-command |
| Kernel (delete) | Blocks unlink/rmdir syscalls | None |
| Kernel (truncate) | Blocks file truncation | None |
| Filesystem sandbox | Restricts path access | Explicit --allow |
| Network sandbox | Blocks network access | Remove --net-block |
The key difference from policy-based sandboxes: there is no "escape hatch" API. The agent cannot request more permissions because the mechanism doesn't exist.
License
Apache-2.0