NVIDIA OpenShell: A Security Team's Guide to the Agent Sandbox and Its Defaults (2026)
- OpenShell is NVIDIA's open-source runtime for AI agents: Apache 2.0, written mostly in Rust, first published in February 2026, with its first stable minor release, 0.1.0, on September 25, 2026. It runs each agent in a sandbox and enforces a declared policy on every file access, system call and network connection.
- The design puts decisions outside the agent. A trusted supervisor checks every request against policy, holds the credentials and opens real connections. The sandbox beside the agent holds no secrets, and if the supervisor disconnects, the agent is frozen.
- Enforcement layers: Landlock for the filesystem, seccomp and privilege drop for processes, a deny-by-default egress proxy with OPA for the network, and providers that inject real credentials only into requests bound for approved endpoints.
- A policy prover uses an SMT solver to check that a policy stays within a boundary you define, and to flag risky proposed rules, such as new credentialed destinations or cloud metadata access, before approval.
- Several defaults favor getting started over enforcement: HTTP rules run in audit mode (log, then forward), filesystem policy is best effort if the kernel cannot apply it, OCSF JSON export is off until enabled, and anonymous telemetry is on.
- OpenShell governs the agents you start inside it. It does not find the agents running natively on developer machines. Treat it as the containment layer, and keep a fleet inventory as the denominator.
NVIDIA OpenShell is the runtime at the center of NVIDIA's Open Agent Safety Platform. That post covered the launch and the strategy. This one is for the team that has to deploy it: how OpenShell is built, what each control enforces, and which defaults you should change before treating it as a security boundary.
The short version is that the architecture is strong and the documentation is unusually honest about tradeoffs. Several defaults favor a smooth first run over strict enforcement, which is reasonable for adoption and worth knowing for production.
The project at a glance
| Item | Detail |
|---|---|
| License | Apache 2.0 |
| Language | Mostly Rust, with Go, Python and TypeScript SDKs |
| First published | February 2026 |
| First stable minor release | 0.1.0 on September 25, 2026; 0.1.2 followed on September 28 |
| Release cadence | Stable releases generally weekly; security fixes for the latest and previous minor lines |
| Host platforms | Linux (amd64, arm64), macOS on Apple Silicon via Docker Desktop; Windows via WSL 2 is experimental |
| Compute drivers | Docker, Podman, MicroVM and Kubernetes |
| Named agents | Claude Code, Codex, Pi and Hermes, per NVIDIA's developer documentation |
How the boundary is built
OpenShell splits responsibility across a trusted side and an untrusted side, and is strict about which side makes decisions.
- Gateway: the control plane. It authenticates users, stores sandbox state, delivers policy and settings, and attaches credential providers.
- Supervisor: the trusted side of the boundary. It checks every request against policy, supplies credentials, resolves DNS and opens approved connections.
- Sandbox: runs beside the agent inside the boundary. It owns the agent's processes, identifies which executable made each request, and forwards TCP and DNS to the supervisor. It never makes policy decisions.
- Providers: connect a service name to a stored credential that the supervisor hands out only where policy allows.
- Policy prover: checks policies and proposed rules with formal verification before they take effect.
Three properties make the boundary credible. First, the agent's side holds nothing worth stealing: no signing keys, no gateway token, no provider credentials. Second, the boundary fails closed: the sandbox will not launch the agent until the supervisor confirms the controls are in place, and if the supervisor disconnects, the agent is frozen. Third, program identity comes from trusted observation, not from what the agent claims; each network rule names the binaries allowed to use it, and OpenShell pins each binary's SHA-256 digest on first use and denies on mismatch.
The four enforcement layers
| Layer | Mechanism | Changeable on a running sandbox |
|---|---|---|
| Network | Deny-by-default egress proxy with an OPA policy engine, inside a dedicated network namespace | Yes |
| Filesystem | Landlock LSM; listed paths read-only or read-write, everything else inaccessible | No; recreate the sandbox |
| Process | Non-root identity, privilege drop and seccomp filters | No; recreate the sandbox |
| Provider credentials | Real secrets held by the supervisor and injected only for approved endpoints | Yes |
The network layer is where most of the policy work happens. With protocol: rest, the proxy inspects each HTTP request and can allow reads while denying writes through the same API. GraphQL and WebSocket traffic can be inspected too. TLS is terminated with a per-sandbox certificate authority so that inspection and credential injection work without application changes. And after a connection is allowed, the proxy still refuses loopback, link-local and cloud metadata addresses, which closes the most common SSRF path out of an agent.
Credential handling is the strongest idea in the design. The agent works with placeholders, and the real secret is substituted outside the sandbox, only on requests to endpoints the policy names. An agent that is tricked into exfiltrating its environment exfiltrates nothing useful. That is the property we argued for in secrets management for AI agents, enforced by the runtime instead of by convention.
What a policy looks like
Policies are YAML. This one, from the project's quickstart example, lets curl read the GitHub REST API and blocks every write method:
version: 1
filesystem_policy:
include_workdir: true
read_only: [/bin, /usr, /lib, /proc, /dev/urandom, /app, /etc, /var/log]
read_write: [/sandbox, /tmp, /dev/null]
landlock:
compatibility: best_effort
network_policies:
github_api:
name: github-api-readonly
endpoints:
- host: api.github.com
port: 443
protocol: rest
enforcement: enforce
access: read-only
binaries:
- { path: /usr/bin/curl }
Note the two settings that make it strict: enforcement: enforce and access: read-only. Without them, the same endpoint would log violations and allow any method. Note also compatibility: best_effort, which the hardening list below suggests changing.
Defaults to review before production
OpenShell's own security best-practices page documents each control, its default and the risk of relaxing it. These are the ones we would decide on deliberately:
| Setting | Default | Recommendation |
|---|---|---|
enforcement on inspected endpoints | audit: logs violations, forwards traffic | Validate rules in audit, then switch to enforce |
Endpoints without protocol | Host, port and binary checked; any HTTP method and path allowed | Use protocol: rest with access: read-only or explicit rules |
landlock.compatibility | best_effort: may skip unavailable paths, with a High-severity finding | hard_requirement, on Linux 6.2 or newer |
| OCSF JSON export | Off; sandbox and gateway outputs are enabled separately | Enable both and ship to your SIEM; collection is best effort |
gateway_jwt.ttl_secs | Unset: tokens last for the sandbox run | Set on shared and Kubernetes gateways |
| Kubernetes user namespaces | Disabled | Enable on non-GPU clusters with support; the CNI must enforce NetworkPolicy |
| Binary globs in network rules | Required list; globs allowed | Scope to specific executables; never /** |
tls: skip | Not set | Avoid; it disables inspection and credential injection for that endpoint |
| Anonymous telemetry | On | Set OPENSHELL_TELEMETRY_ENABLED=false if policy requires |
| Install method | README quickstart pipes install.sh from main to a shell | Use packaged stable releases for managed fleets |
Approvals, the advisor and the prover
Agents will hit the edge of their policy. What happens next is the most interesting part of OpenShell's design. With the policy advisor enabled (it is off by default), a blocked agent can submit a narrowly scoped proposal for a new network rule through a local API, and wait for a decision. A proposal can only add a network rule; it cannot touch filesystem, process or Landlock settings. The agent cannot approve its own request. Every proposal waits for human review unless you opt in to automatic approval for proposals that pass the risk checks.
This matters more than it looks. OpenAI's own data shows capable agents route around a blocked action roughly one time in four. Giving the agent a sanctioned way to ask, inside a boundary it cannot leave, turns that persistence into a reviewable request instead of a workaround.
The policy prover backs the review with formal verification. A proposal risk check runs on every proposal and flags new credentialed destinations, new HTTP methods or cloud metadata access. A separate boundary check, openshell-prover check candidate.yaml --boundary boundary.yaml, confirms that a policy grants nothing beyond an organization-wide maximum, and runs in CI without a gateway. Its coverage is explicit: filesystem, process, Landlock, network connections and REST. A policy that uses GraphQL or MCP rules is reported as uncheckable rather than silently passed.
One caution on approvals: endpoints approved from the terminal interface persist for the life of the sandbox and reset only when it is destroyed and recreated. Each approval durably widens the policy. Recurring needs belong in the policy file, where they get reviewed like code.
What OpenShell does not cover
- Agents outside the sandbox. OpenShell governs agents someone starts inside it. Claude Code, Codex or Cursor running natively on a laptop are not affected by it.
- Discovery. It has no way to tell you which agents, MCP servers or model runtimes exist across a fleet.
- What happens inside allowed traffic. An allowed endpoint is, in OpenShell's own words, a potential data exfiltration path. L7 rules narrow it; they do not remove it.
- Complete audit history. The documentation describes OCSF collection as best effort, not a guarantee.
None of these are flaws. They are the scope of a runtime. The first two are why sandbox adoption should be measured against an inventory, the argument of the containment gap: most organizations that solved agent identity never built isolation, and the ones that start now need to know which agents to isolate first.
How Anomity complements OpenShell
Anomity does not integrate with OpenShell today, and it does not need to for the two to work together. OpenShell is the containment layer for the agents you enroll. Anomity covers the fleet: the Endpoint Sensor inventories agents, CLIs, MCP servers, plugins, skills, hooks and local LLM runtimes on every managed endpoint, across 144 tracked AI tools. That inventory is the list of candidates for a sandbox, ranked by what each agent can reach, including the secrets in its environment, found with 162 credential patterns and redacted on the endpoint.
For the agents that stay native, Anomity governs at the agent's own hook. On Claude Code, it decides allow, deny or log at PreToolUse before a tool call runs, across 180 enforcement rules and nine guards, and records each attempted call, decision and outcome in a 90-day audit trail. That trail routes to SIEM, Slack, email or Jira, beside the OCSF records OpenShell writes for sandboxed agents, so both halves of the fleet land in one place. A hook is not a kernel boundary, and we do not present it as one. It is the control that exists for an agent nobody sandboxed.
OpenShell is a serious, well-documented open-source agent sandbox, and its documentation tells you exactly where its defaults trade strictness for convenience. Change those defaults, measure coverage against an inventory, and govern what remains outside. For the equivalent controls in OpenAI's agent, see securing OpenAI Codex sandbox modes and approvals. To find the agents across your fleet that are not in a sandbox yet, book a 30-minute demo.
Frequently asked questions
What is NVIDIA OpenShell?
OpenShell is an open-source runtime from NVIDIA for running autonomous AI agents inside sandboxes with a declared policy. Its README describes it as the safe, private runtime for fleets of autonomous AI agents: agents can read files, install packages, call APIs and use credentials, without unrestricted access to data, secrets or the network. It is licensed under Apache 2.0, is written mostly in Rust, and forms the runtime layer of NVIDIA's Open Agent Safety Platform.
How does OpenShell enforce policy?
At four layers. The network layer routes every outbound connection through a proxy that evaluates it with an OPA policy engine and denies anything not listed; the sandbox's own network namespace means a process that ignores proxy settings can still only reach the proxy. The filesystem layer uses Landlock to make listed paths read-only or read-write and everything else inaccessible. The process layer drops privileges to a non-root identity and applies seccomp filters. The credential layer keeps real secrets with the supervisor, outside the sandbox, and substitutes them only into requests to endpoints the policy allows.
Which defaults should a security team change?
Review at least these. HTTP request rules default to enforcement: audit, which logs violations but forwards the traffic, so switch to enforce once the rules are validated. Endpoints with no protocol field allow any method and path after the connection is permitted, so use protocol: rest with read-only access or explicit rules. Filesystem policy defaults to compatibility: best_effort, so set hard_requirement where every restriction must apply. OCSF JSON export must be enabled explicitly. Shared deployments should set a gateway token lifetime. Kubernetes user namespaces are off by default. Anonymous telemetry is on by default and can be disabled.
What is the policy prover?
The policy prover is OpenShell's verification engine. It uses an SMT solver to check two things. A boundary check, run with the openshell-prover command, confirms that a candidate policy grants nothing beyond a boundary policy you write, such as an organization's maximum allowed access for agents. A proposal risk check runs automatically when an agent proposes a new network rule, and flags added risk such as new destinations for credentials, new HTTP methods or cloud metadata access. The boundary check covers filesystem, process, Landlock, network connections and REST requests, and reports that it cannot check a policy that uses GraphQL or MCP rules rather than ignoring them.
What happens when an agent needs access that the policy does not allow?
The request is denied, and the denial explains what was blocked. With the policy advisor enabled, which is off by default, the agent can submit a narrowly scoped proposal for a new network rule through a local API. Every proposal waits for human review by default; automatic approval is opt-in and applies only when the risk checks find nothing to flag. Operators can also approve blocked endpoints from the terminal interface. Approved endpoints persist for the life of that sandbox and reset only when it is destroyed and recreated, so each approval durably widens the policy.
Does OpenShell replace endpoint visibility for AI agents?
No. OpenShell contains the agents someone deliberately runs inside it, and it does that well. It has no way to discover the coding agents, CLIs, MCP servers and local model runtimes that developers install and run natively on their machines, which on most fleets are the majority. A containment program needs both: a runtime for the agents you enroll, and an inventory of the agents you have not.
How does Anomity fit alongside OpenShell?
Anomity does not integrate with OpenShell today, and the two cover different ground. Anomity's Endpoint Sensor inventories the agents, CLIs, MCP servers, plugins, skills, hooks and local LLM runtimes on every managed endpoint, which tells you which agents are candidates for a sandbox and which remain outside one. For agents that stay native, Anomity decides allow, deny or log at hooks such as Claude Code's PreToolUse and records each decision in a 90-day audit trail that routes to SIEM, Slack, email or Jira, next to the OCSF records OpenShell produces for sandboxed agents.




