Back to AI guides

NVIDIA OpenShell: How Policy-Based Sandboxing Secures AI Coding Agents

Stanley Ulili
Updated on November 2, 2026

AI coding agents can read your files, run commands, install packages, and call external APIs. Those capabilities make them useful, but they also create a security problem: an agent with permission to read from a service may also have enough access to change or delete data in that service. A conventional container can isolate a process, but a network rule allowing api.github.com:443 generally cannot distinguish a harmless HTTP GET request from a potentially destructive POST request.

NVIDIA OpenShell addresses this gap with policy-based controls for agent sandboxes. Its architecture separates the agent's execution environment from the components that evaluate network access, filesystem permissions, and credentials. The result is a model where an agent receives access to specific resources rather than broad permission to use everything available in its environment.

This article explains how OpenShell's architecture works, what its policies look like in practice, and where its protections have limits.

Why AI agents need more than container isolation

A container is useful for separating an application from its host, but it does not automatically understand the intent of an AI agent's actions. Consider an agent assigned to summarize a GitHub repository. It may need a token to retrieve the repository's README through the GitHub API.

A request to https://api.github.com/repos/octocat/hello-world/readme uses HTTP GET. A request to https://api.github.com/repos/octocat/hello-world/issues using POST attempts to create an issue. Both reach the same API host over port :443, but the consequences are different.

A network allowlist based only on the hostname and port would treat both connections alike. The distinction that matters is not merely where the agent connects, but what it is allowed to do there.

A diagram illustrating how a standard container cannot differentiate between a safe GET request and a potentially harmful POST request to the same GitHub API endpoint.

The same problem appears beyond network access. An agent might legitimately require read access to source files, write access to a build directory, permission to install packages, and a credential for a third-party service. Providing unrestricted permissions for convenience expands the damage a mistake or prompt injection could cause.

For example, options such as claude --dangerously-skip-permissions or codex --yolo remove interactive approval barriers in their respective tools. These settings are not inherently malicious, but they increase the importance of independent isolation and permission controls.

A diagram showing the four main resource categories an agent needs—Files, Packages, APIs, and Credentials—and the danger of granting full, unrestricted access.

OpenShell's approach is to define a narrower set of allowed operations and enforce those rules outside the agent's own decision-making process.

How OpenShell enforces security policies

OpenShell is an open-source runtime for isolated AI-agent workloads. Instead of trusting the agent to decide which operations are safe, it uses policies to express which filesystem paths, processes, and network destinations are permitted.

For instance, a policy may allow writes to /tmp while denying writes to /etc, or allow /usr/bin/curl to make read-only requests to api.github.com:443 while rejecting requests that modify data.

The important separation is between an agent's intentions and the permissions enforced by its environment. Even when an agent decides to attempt an unauthorized operation, the sandbox and associated enforcement components can deny that operation without relying on the agent to self-correct.

A diagram showing how OpenShell's policy file is used to validate file access, system calls, and network connections, allowing some and blocking others.

These restrictions operate at different levels. Filesystem restrictions depend on the paths and access types that are allowed. Network restrictions depend on destination and policy-aware mediation, including application-layer controls where supported. Neither should be confused with a guarantee that every possible harmful action can be detected from its intent.

The gateway, supervisor, and sandbox architecture

OpenShell separates management functions from the environment in which an agent executes. This design makes it possible to change or inspect permissions without making the untrusted agent responsible for enforcing its own rules.

The high-level architecture diagram of OpenShell, showing the relationship between the Gateway, the trusted Supervisor, and the untrusted Sandbox where the Agent lives.

The architecture has three primary components:

  • Gateway: The control plane that manages sandboxes and policies. The openshell CLI communicates with this component.
  • Supervisor: The trusted component responsible for evaluating relevant activity against the active security policy, mediating approved communication, and supporting credential handling.
  • Sandbox: The isolated environment where the agent and its tools run. It is treated as untrusted, even when the task itself is legitimate.

The main security benefit comes from placing policy decisions outside the agent's environment. A compromised agent should not be able to grant itself new permissions merely by changing its instructions.

That does not mean the entire system is immune to bypasses. Its security still depends on correct configuration, the enforcement mechanisms in the deployed version, and the integrity of trusted components.

What a restricted sandbox looks like

A useful way to understand OpenShell is to look at the behavior of a sandbox before additional network access is granted. The following commands are illustrative examples from the source scenario, not a setup procedure. Command names and flags may change between releases.

The CLI can report its connection to the management service:

 
openshell status

A sandbox named demo can be described by a command like this:

 
openshell sandbox create --name demo --from openshell-curl-demo:latest --no-auto-providers

Here, --name demo identifies the sandbox, --from specifies its base image, and --no-auto-providers avoids automatically attaching configured providers. The available image and command options are version-dependent.

Inside the sandbox, the process may run as an ordinary user rather than root. Filesystem permissions can also differ by directory. For example, a write attempt against /etc/test may fail:

 
touch /etc/test
Output
touch: cannot touch '/etc/test': Permission denied

The terminal screen clearly shows the "Permission denied" error when attempting to create a file in a restricted directory.

By contrast, a policy can permit writes under /tmp for temporary files. This matters because an effective sandbox does not have to prohibit every operation. It can allow the resources a task requires while restricting unrelated parts of the environment.

Network access follows a similar principle. Before a matching policy is present, a request such as the following can be denied:

 
curl https://api.github.com/zen

A failed request is useful evidence of enforcement, but its precise error message depends on how the request is intercepted and how the client reports the failure.

Dynamic policies and network-level permissions

An agent's requirements can change during a task. OpenShell's policy model supports updates to a running sandbox rather than requiring a completely new environment for every permission adjustment.

In the source example, a command resembling the following associates read-only GitHub API access with /usr/bin/curl:

 
openshell policy update demo --rule-name github_api --add-binary /usr/bin/curl --add-endpoint api.github.com:443:read-only:rest:enforce --wait

The key parts of this rule are github_api, its name; /usr/bin/curl, the permitted executable; api.github.com:443, the destination; and read-only:rest:enforce, the requested access and enforcement mode.

The intended behavior is straightforward: a read operation can succeed without granting the same executable blanket permission to modify resources on that host.

Once the policy is active, the earlier GET request can return an ordinary API response:

 
curl https://api.github.com/zen

The terminal showing the successful output of the command after the policy was updated.

A contrasting POST request to the same hostname illustrates the difference between network reachability and application-level permission:

 
curl -X POST https://api.github.com/repos/octocat/hello-world/issues -H "Content-Type: application/json" -d '{"title":"oops"}'

Under the read-only rule described in the source, the expected result is a policy denial rather than an attempt to create an issue. Whether OpenShell can classify and enforce a particular request depends on the protocol and policy configuration. An allowlist for the destination alone would not provide this distinction.

How policy denials are recorded

Logging is an important part of making a sandbox usable. Without it, an agent that cannot reach an API may appear broken even when the denial is intentional.

The source example uses this command to inspect recent sandbox activity:

 
openshell logs demo --since 5m --source sandbox

A relevant log entry may identify the attempted destination, executable, and policy that rejected the operation. This supports debugging and security review, although the level of detail and retention guarantees should be checked against the deployed version's documentation.

Keeping credentials outside the agent's environment

Network restrictions are only part of the problem. An agent that can read a real API token may disclose it through an unintended response, write it to a file, or send it to an unauthorized destination.

OpenShell describes a credential-injection pattern that keeps the actual secret in a trusted component. The sandbox receives a placeholder, represented in the source material by a value such as GITHUB_TOKEN=openshell:resolve:env:.... When an approved request is mediated, the trusted component resolves the placeholder and attaches the credential to that outgoing request.

This reduces the need to place a usable secret directly in the agent's environment.

A diagram demonstrating the credential injection process, where the agent has a placeholder token and the Supervisor injects the real token for approved requests.

Credential isolation reduces exposure, but it does not eliminate the possibility of misuse. A compromised agent may still be able to perform harmful actions through an endpoint and operation that the policy legitimately permits. The scope of the underlying token and the destination's own authorization rules remain important.

Policy verification and auditability

Permissions can become difficult to reason about as an application grows. A narrow rule combined with a broader wildcard rule might unintentionally allow operations that were meant to stay blocked.

The source material describes a policy prover using the Z3 satisfiability modulo theories (SMT) solver. Its purpose is to reason about how a proposed policy change affects the set of permitted actions. For example, an operator could examine whether a change expands access from read-only operations to writes for a particular executable and endpoint.

This is a different kind of safeguard from runtime blocking. A runtime policy evaluates an attempted operation, while a policy prover analyzes the implications of the policy definition. Formal analysis is valuable, but any assurance depends on the completeness of the modeled permissions and the implementation being analyzed.

OpenShell's logs provide another layer of visibility by recording relevant security events, including denials. These records can help explain why an agent cannot complete a task or reveal repeated attempts to reach restricted resources. They should not automatically be described as immutable or exhaustive without confirming the logging configuration and retention behavior.

What OpenShell does and does not protect

OpenShell is most useful when an AI agent needs to execute commands and access external systems, but should operate within explicit boundaries.

Security concern How OpenShell helps Remaining consideration
Host and filesystem access Restricts paths and operations available to the sandbox Rules must be configured correctly
External API access Applies destination and, where supported, request-level permissions Allowed requests can still have unintended effects
Credential exposure Supports mediated access to credentials Authorized operations can still misuse permissions
Policy mistakes Policy analysis can expose unexpected permission expansion Coverage depends on the modeled policy
Incident investigation Logs provide visibility into enforcement decisions Collection, integrity, and retention require review

The broader security model still matters. An agent sandbox does not replace least-privilege API tokens, repository branch protections, code review, network segmentation, or monitoring. It adds another layer of control, particularly where an agent's generated commands cannot be assumed to be safe.

Final thoughts

AI agents need permissions to be useful, but they do not need unrestricted access to every resource their tools can reach. That's the central idea behind NVIDIA OpenShell. Its gateway, supervisor, and sandbox architecture moves permission enforcement out of the agent's control and into a separate policy-driven layer.

The distinction between allowing access to api.github.com:443 and allowing only specific kinds of requests to that endpoint captures the practical benefit. A useful security boundary defines not just where an agent can connect, but which actions are acceptable. Dynamic policies, mediated credentials, audit logs, and policy analysis help make those boundaries understandable and manageable.

OpenShell is not a guarantee against prompt injection, misuse of legitimate permissions, or configuration mistakes. It is a way to reduce the scope of what an untrusted agent can do when something goes wrong. For development teams adopting increasingly autonomous coding agents, that separation between capability and authority is the most important design principle.

Got an article suggestion? Let us know
Licensed under CC-BY-NC-SA

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.