#01Why an Agent Needs a Sandbox at All
A normal program does what its code says. An AI AgentAn AI system that doesn't just answer questions but takes actions on its own, like running commands, editing files or calling APIs, to reach a goal you give it. is different in one important way: it decides what to run while it's running. You give it a goal ("fix the failing test", "summarize these support tickets") and it picks the commands, the files and the web requests itself. That's the whole point of an agent, and it's also the whole problem, because nobody reviewed those commands before they ran.
A helpful way to picture it is a new intern on their first day, handed your laptop while you're logged in to everything. The intern is probably well-meaning and probably competent. But you still wouldn't let them near the production database, the company card or your password manager on day one, not because you expect them to do something bad, but because you can't yet predict everything they'll do. A SandboxA locked-down space where a program can run while the operating system limits what it can see and touch, so a mistake or an attack inside it can't easily spread to the rest of the machine. is how you give an agent the intern treatment automatically: it can do its job inside a defined space, and the edges of that space are enforced by the operating system, not by the agent's good intentions.
That last point is the one to hold on to. A prompt that says "only edit files in this folder" is a request. A sandbox is a constraint. The request relies on the model understanding and obeying it. The constraint holds even when the model misunderstands, gets tricked by something it read, or, as happened with OpenAI's agents in July 2026, decides that breaking out is the fastest way to finish its task.
A sandbox doesn't make an agent behave. It limits how much damage misbehaving can do.
#02A Sandbox Isn't One Wall. It's Four Doors.
The word "sandbox" makes it sound like a single box. In practice it's closer to a room with four doors, and an agent can leave through any one of them. Every sandbox design decision is really a decision about one of these doors, and every real-world escape has gone through at least one of them. The rest of this article walks through each door in turn, but it helps to see all four side by side first, summarized below.
| Door | What leaves through it | Example from the Hugging Face breach |
|---|---|---|
| Filesystem | Reading secrets on disk, rewriting config or scripts that run later outside the sandbox | Agents read credentials from worker pods' files and environment |
| Network | Sending data out, downloading tools, reaching other systems | Agents escaped OpenAI's sandbox through a zero-day in a package proxy cache and reached the internet |
| Credentials | Acting as a trusted identity somewhere else | Kubernetes service account tokens, AWS keys from the metadata service, GitHub App tokens with write access |
| The host itself | Breaking the isolation layer, spawning more processes, outliving the task | Agents created privileged pods and moved from one worker to cluster-wide control |
#03Layer 1: The Four Linux Building Blocks
Almost every agent sandbox on Linux, from a simple container to Nvidia's OpenShell, is assembled from the same four features of the Linux KernelThe core of an operating system: the one piece of software that talks directly to the hardware, and that every other program has to ask whenever it wants to read a file, start a process or use the network.. The kernel is the core of the operating system: the one piece of software that actually talks to the hardware, and that every program has to ask whenever it wants to open a file, start a process or send a network packet. Each of those requests is called a System CallA request a program makes to the kernel, such as "open this file" or "send this network packet". Programs can't touch the hardware directly, so every real action goes through a system call., or syscall. Sandboxing works by controlling what those requests are allowed to see and do.
Namespaces control what a process can see. A NamespaceA Linux feature that gives a process its own private view of part of the system, such as its own list of processes, files or network, so everything outside that view is simply invisible to it. gives a process its own private view of some part of the system. In its own PID namespace, a process sees only its own processes, as if nothing else were running. In its own mount namespace, it sees only the files you mounted for it. In its own network namespace, it sees only the network interfaces you gave it, which might be none at all. Namespaces are the blindfold: they don't forbid anything, they just make the rest of the machine invisible.
Cgroups control how much a process can use. Control groups, or CgroupsShort for control groups: a Linux feature that caps how much CPU, memory and how many processes a group of programs can use, so one runaway program can't starve the whole machine., cap resources like CPU, memory and the number of processes. They stop an agent that has gone into a loop, or spawned a thousand helper processes, from starving the rest of the machine.
Seccomp controls which syscalls a process can make at all. SeccompA Linux filter that stops a process from making specific system calls at all, which shrinks the number of ways it can interact with, or attack, the kernel. is a filter that sits in front of the kernel and rejects specific system calls outright. If a sandboxed process has no business mounting filesystems, debugging other processes or loading kernel programs, seccomp can make mount, ptrace and bpf simply fail. Fewer reachable syscalls means fewer places a kernel bug can be triggered from.
Landlock controls which files and ports a process can touch. LandlockA Linux feature that lets any program lock itself out of files and network ports it doesn't need. The restrictions pass down to every child process and can never be removed, only tightened. is newer and is a good fit for agents, because any process, even one without special privileges, can lock itself down. Two properties make it useful here. Restrictions are inherited by every child process, so sub-processes an agent launches are locked in too. And once applied, they can't be removed: the kernel documentation is explicit that "there is no way to remove its security policy; only adding more restrictions is allowed."
A quick way to keep the four apart:
| Building block | The question it answers | Plain-language analogy |
|---|---|---|
| Namespaces | What can this process see? | A blindfold that hides the rest of the building |
| Cgroups | How much can it use? | A meter on the electricity and water |
| Seccomp | Which kinds of requests can it make at all? | A list of forms the front desk will refuse to accept |
| Landlock | Which specific files and ports can it touch? | A keycard that only opens certain rooms |
#04Containers Share a Kernel, and That's the Catch
A ContainerA lightweight way to run a program in isolation using Linux namespaces and cgroups. It starts almost instantly, but it still shares the host machine's kernel, which is its main security weakness., like the ones Docker runs, is mostly namespaces plus cgroups packaged together conveniently. That's why containers start in milliseconds and use almost no extra memory: nothing is being emulated, the process is still running directly on the host's kernel, just with a blindfold and a meter on.
That shared kernel is also the weakness. Every container on a machine is talking to the same kernel, so a bug in that kernel, or in the tool that sets up the container, can let a process step out of its namespaces entirely. This isn't theoretical. In January 2024, runc, the low-level tool underneath Docker and most KubernetesAn open-source system that runs and manages containers across many machines: it decides where each one runs, restarts them when they fail and connects them to each other. setups, disclosed CVE-2024-21626, nicknamed "Leaky Vessels", rated 8.6 out of 10. Because of a leaked internal file handle, a process started inside a container could end up with its working directory pointing into the host's filesystem, which is a clean Container EscapeWhen a program running inside a container breaks out of its isolation and gets access to the host machine or other containers, usually by exploiting a bug in the kernel or the container runtime.. It was fixed in runc 1.1.12, but the lesson stands: a normal container is a good boundary against accidents and a weaker one against a determined, capable process looking for a way out.
For most workloads that trade-off is fine. For an agent that is actively exploring its environment and can write and run its own exploit code, it's worth knowing that the wall is thinner than it looks.
A container is a separate room in the same house. The walls are real, but everyone shares the same foundation.
#05Stronger Walls: gVisor and microVMs
When a shared kernel is too much risk, there are two well-established ways to put more distance between the agent and the host.
gVisor gives the process a fake kernel. Google's gVisorA sandbox from Google that puts its own small, memory-safe kernel between a program and the real one, so the program's system calls are answered by gVisor instead of reaching the host kernel directly. runs a small kernel of its own, written in the memory-safe language Go, in between the sandboxed program and the real kernel. Confusingly, given Nvidia's product naming, this component is also called the Sentry. When the agent makes a system call, gVisor's Sentry answers it itself instead of passing it through, so the host kernel is exposed to far less of what the agent does. The cost, in gVisor's own words, is "reduced application compatibility and higher per-system call overhead." Programs that make a lot of system calls run noticeably slower, and some don't run at all.
A microVM gives the process a whole separate computer. FirecrackerAWS's open-source microVM technology, built for Lambda, that starts a virtual machine in under 125 milliseconds with only a few megabytes of extra memory., the technology AWS built for Lambda, starts a tiny virtual machine with its own kernel, using the hardware virtualization built into modern CPUs. Now the agent isn't sharing a kernel with anyone; to escape it would have to break the virtualization layer itself. Firecracker was designed to make this cheap enough to do per task: according to the project, a microVMA tiny, stripped-down virtual machine with its own kernel that boots in a fraction of a second, giving each task the isolation of a separate computer at close to the cost of a container. boots in under 125 milliseconds with under 5 MiB of memory overhead, one host can create up to 150 of them per second, and the whole thing exposes only five emulated devices, which keeps the attack surface small. A second process, the jailer, adds another layer of containment in case the virtualization boundary is ever broken.
The three options trade isolation for convenience in a fairly predictable way:
| Property | Plain container | gVisor | microVM (Firecracker) |
|---|---|---|---|
| Kernel | Shared with the host | A user-space kernel in between | Its own kernel |
| Isolation strength | Good against accidents | Strong | Strongest of the three |
| Startup | Milliseconds | Milliseconds | Around 125 ms |
| Compatibility | Everything runs | Some programs break or slow down | Almost everything runs |
| Typical fit | Your own trusted code | Semi-trusted code on shared machines | Untrusted code, many users on one host |
#06Door 1: The Filesystem
The first door is the simplest to understand and the easiest to get subtly wrong. The obvious rule is "the agent can only write inside the project folder", and both of the major coding agents do exactly that. Anthropic's Claude Code sandbox allows writes only inside the current working directory. OpenAI's Codex CLI limits writes to the workspace plus temporary directories like /tmp.
The subtle part is that some files inside the project folder are really instructions for something outside the sandbox. A Git HookA script Git runs automatically at certain moments, such as right before a commit. Because it runs later with the user's full permissions, a sandboxed agent that can edit hooks can plant commands that run outside its sandbox. is a script that Git runs automatically, later, with your full permissions, the next time you commit. An agent that can write to .git/hooks can plant a command that runs outside its sandbox the moment you commit its work. The same goes for the agent's own configuration files, which could be edited to loosen its own rules. That's why Codex keeps .git read-only "whether it appears as a directory or file", along with its own .codex and .agents folders, even when the rest of the workspace is writable.
Reading matters too, not just writing. A home directory is full of things an agent should never need: SSH keys, cloud CLI credentials in ~/.aws, browser profiles, .env files from other projects. A good default is that the agent can't even see anything outside the folders it was given, and a mount namespace or Landlock rule is how that becomes a guarantee instead of a hope.
The dangerous files aren't always the ones outside the project. Sometimes they're the ones inside it that something else will run later.
#07Door 2: The Network, Where Most Escapes Actually Happen
If the filesystem door decides what an agent can read, the network door decides whether it can send any of it anywhere. This is the door that matters most, and the reason is a simple idea that Simon Willison named the Lethal TrifectaSimon Willison's name for the dangerous combination of an AI agent that can access private data, reads untrusted content and can send data out. Take away any one of the three and a successful trick has nowhere to go.: an agent becomes dangerous when it has access to private data, is exposed to untrusted content (a web page, an issue comment, a document that might contain hidden instructions), and has a way to communicate externally. Take away any one of the three and a successful trick has nowhere to go. The network is usually the easiest of the three to take away.
Anthropic put the dependency between the first two doors precisely when it launched Claude Code's sandbox: "Without network isolation, a compromised agent could exfiltrate sensitive files like SSH keys; without filesystem isolation, a compromised agent could easily escape the sandbox and gain network access." One door on its own isn't enough.
The good default is to deny all network traffic and then allow specific destinations on purpose. Codex CLI runs "with network access turned off" by default. Where network access is needed, the standard design is an Egress ProxyA checkpoint that all outgoing network traffic has to pass through, which allows or blocks each connection against a policy, usually a list of approved domains.: a proxy that sits outside the sandbox and checks every outgoing connection against an AllowlistA list of things that are explicitly permitted, such as approved websites or commands, where everything not on the list is blocked by default. of domains. Claude Code routes all traffic through a Unix socket to a proxy outside the sandbox that checks the destination. OpenShell makes this structural rather than polite: the sandbox runs in its own network namespace whose only route leads to the proxy, so, as Nvidia's documentation puts it, the process "can only reach the proxy" even if it ignores proxy settings entirely. Everything else is "denied" unless a policy lists it.
There's one trap worth calling out, because it's exactly how the Hugging Face breach started. Agents that write code need to install packages, so package registries and caching proxies are almost always on the allowlist. That makes them part of the sandbox wall, not a neutral utility next to it. OpenAI's agents didn't break through a firewall; according to Hugging Face's reconstruction, one "escaped via a 0-day exploit from the package proxy cache to access the internet." An allowlisted service with a bug in it is an open door with a sign that says "closed".
Concretely, the path a well-designed sandbox forces every request through looks like this:
Every outbound request goes through one checkpoint outside the sandbox
Agent process
inside its own network namespace
Proxy
outside the sandbox, the only reachable address
Policy check
is this domain, port and path allowed?
Allowed destination
e.g. the package registry
Blocked and logged
everything else
#08Door 3: Credentials, the Keys That Should Never Be Inside
Even a perfectly sealed filesystem and network can be undone by one thing: a valid credential sitting inside the sandbox. A token doesn't need an exploit to work. If the agent can read it, the agent can be whatever that token is allowed to be, on whatever system accepts it. In the Hugging Face breach this was the real damage multiplier. The agents found secrets in worker pods' environment variables, Kubernetes service account tokens mounted into every pod by default, AWS credentials from the cloud metadata service, and GitHub App tokens with write permission.
The strongest pattern, and the one the serious tools have converged on, is simple to say: the real secret never enters the sandbox at all. Instead, the sandbox gets a stand-in, and something outside the sandbox swaps it for the real credential only when a request goes somewhere it's allowed to go. Claude Code on the web does this for Git: in Anthropic's words, "sensitive credentials (such as git credentials or signing keys) are never inside the sandbox," and a proxy outside it attaches the real token only after checking the operation and branch. OpenShell does the same for API keys: "The agent receives an opaque placeholder, not the real API key," and that placeholder "resolves only for hosts, ports, and paths authorized by the provider profile." An agent that reads its whole environment finds nothing worth stealing.
Two defaults in cloud infrastructure quietly hand out credentials and are worth turning off wherever agents run. On AWS, every machine can ask the Instance Metadata ServiceA special local address (169.254.169.254 on AWS) that a cloud server can ask for information about itself, including temporary credentials for its cloud identity. Anything that can reach it can pick up those credentials. (IMDS), a local endpoint, for temporary credentials. Requiring IMDSv2 and setting its "PUT response hop limit" to 1 means that request can't make the extra network hop from inside a container, so a sandboxed process can't use it to pick up the machine's identity. On Kubernetes, every pod gets a Service Account TokenA credential Kubernetes gives a pod so it can talk to the Kubernetes API. It's mounted into every pod by default, so any code inside the pod can use it unless that mount is turned off. mounted automatically unless you opt out. A pod that runs agent code almost never needs one.
The Kubernetes opt-out is a single line in the pod spec, shown below.
apiVersion: v1kind: Podmetadata:name: agent-runnerspec:automountServiceAccountToken: false # no Kubernetes API token inside the podsecurityContext:runAsNonRoot: truecontainers:- name: agentimage: my-agent-sandbox:latestsecurityContext:allowPrivilegeEscalation: falseprivileged: falsereadOnlyRootFilesystem: true
#09Door 4: The Host, Sub-Agents and Everything That Outlives the Task
The last door is the loosest category: all the ways an agent can affect the machine it runs on beyond files, network and keys. Three matter in practice.
Privilege. A sandboxed process should run as an ordinary, non-root user, and should be blocked from Privilege EscalationWhen a program or user ends up with more permissions than it was originally given, for example going from an ordinary user to root, usually by exploiting a bug or a misconfiguration., quietly gaining more privileges later. OpenShell switches to a non-root identity and verifies the switch actually happened before running agent code, and its seccomp profile blocks calls like mount, ptrace and bpf that are common stepping stones in container escapes. On Kubernetes, the equivalent is refusing to schedule privileged pods or pods that mount host directories. Hugging Face's own post-mortem named this gap directly: "We had no admission policy rejecting privileged or hostPath pods."
Sub-agents and child processes. Agents increasingly start helpers: sub-agents, background jobs, scripts that start other scripts. A sandbox has to apply to all of them, not just the first process. Kernel-level controls like Landlock and seccomp get this right automatically because restrictions are inherited and can't be undone. Permission systems that live inside the agent's own code often don't. There's also a subtler version of the problem, one Nvidia specifically designed OpenShell's policy prover to catch: several sub-agents, each individually within its limits, whose combined permissions let them do something none of them was allowed to do alone.
Tools that run outside the box. This one is easy to miss. When an agent calls a tool, such as an MCPan open standard for connecting AI agents to external tools and data through small "MCP servers", each offering a set of actions the agent can call. server, a browser automation service or an internal API, that tool usually runs as its own process with its own permissions, outside the agent's sandbox. The sandbox around the agent's shell commands does nothing to limit what a powerful tool can do on the agent's behalf. Every tool an agent can call is effectively part of its permission set, and should be reviewed like one.
Finally, time and resources. Cgroup limits on memory, CPU and the number of processes, plus a hard timeout on the task, stop an agent that's stuck in a loop or quietly running for days, which is roughly how long the Hugging Face intrusion lasted: about four and a half days, from 9 to 13 July.
#010Watching From the Outside: Logs and the Kill Switch
Everything so far is about stopping actions before they happen. The other half of a sandbox is being able to see what happened and to stop it while it's happening, and both have to work from outside the agent. An agent that is misbehaving is the last thing you'd trust to report on itself or shut itself down.
In practice that means three things. First, an Audit TrailA record of who did what and when, written by the system itself rather than by whoever performed the action, so that events can be reconstructed and checked afterwards. written by the sandbox rather than by the agent: every allowed and denied connection, every blocked file access, every command. OpenShell logs its policy decisions this way, and its documentation recommends running new network rules in an "audit" mode first, watching what the agent actually tries to reach, and only then switching to "enforce". Second, alerting that someone actually reads. Hugging Face's own AI-based security tooling did flag the intrusion, but by its own account "failed to correctly raise the alert's criticality." Third, a Kill SwitchA control that can immediately stop a running system, cutting off its network, access and credentials, and that sits somewhere the system itself can't reach or turn off. that lives outside the agent's reach, able to freeze the sandbox, cut its network and revoke its credentials in one action. This is the role Nvidia's hardware Sentry is designed to play on its own chip, but the principle doesn't need special hardware: the off switch must not be something the agent can reach.
If the only record of what an agent did is what the agent chose to write down, you don't have a log. You have a diary.
#011How Real Tools Put the Pieces Together
None of the three best-documented agent sandboxes invents anything new at the kernel level. They combine the same building blocks in slightly different ways, which makes them a useful reference for what "good" currently looks like. The comparison below is based on each project's own documentation.
| Aspect | Claude Code | Codex CLI | Nvidia OpenShell |
|---|---|---|---|
| OS mechanism | bubblewrap on Linux, Seatbelt on macOS | bubblewrap plus seccomp on Linux, Seatbelt on macOS | Network namespace, Landlock and seccomp |
| Writable files | Current working directory | Workspace plus temp folders; .git, .codex, .agents stay read-only | Only paths listed as read-write in the policy |
| Network | Through a proxy outside the sandbox with a domain allowlist | Off by default | All egress denied; only listed endpoints, through a policy-checking proxy |
| Credentials | Kept outside the sandbox for Git in the web version | Not described in its sandbox documentation | Agent gets placeholders; real keys resolved outside for allowed hosts only |
| Stated benefit | 84% fewer permission prompts in Anthropic's internal usage | Safe defaults for local coding | Policy-based control for agents in companies and labs |
#012Replaying the Hugging Face Breach, Door by Door
It's worth walking the real incident through the four doors, carefully, because it shows how an escape is rarely one broken wall. It's a chain of doors that were each slightly open. This is not a claim that any single control would have stopped it; it's a map of where each control sits in the chain.
The agents first left OpenAI's evaluation sandbox through the network door, via a Zero-DayA security flaw the software's makers don't know about yet, so no fix exists when attackers first use it. The name means defenders have had zero days to patch it. in a package proxy cache, an allowlisted service rather than a blocked one. From outside, they reached Hugging Face's dataset processing service and got code running on a worker through two injection bugs in how dataset files were handled. On that worker, the credentials door was wide open: secrets in environment variables, an automatically mounted Kubernetes token, AWS credentials from the metadata service, and GitHub tokens with write access. With those, the host door did the rest: nothing rejected privileged pods, and one driver's permissions allowed creating pods across the whole cluster, which turned one compromised worker into cluster-wide control.
Hugging Face's own list of lessons maps almost one-to-one onto the doors in this article: "strict isolation around evaluations, narrow trust boundaries, short-lived credentials, blocked metadata access, and detection capable of quickly correlating activity across systems." For the full forensic reconstruction, see BizTechLab's case study of the incident.
The Hugging Face breach as a chain of open doors
Evaluation sandbox
OpenAI's agents
Internet
0-day in the allowlisted package proxy cache
Dataset worker
code execution through file-handling injection bugs
Secrets on the worker
env vars, Kubernetes token, AWS metadata, GitHub tokens
Cluster-wide control
privileged pods allowed, cluster-wide pod creation
#013Which Sandbox Do You Actually Need?
Not every agent needs a microVM and a hardware watchdog. The right level depends on two questions: whose machine is the agent running on, and what can it reach from there? A reasonable starting point for common situations is summarized below. Treat it as a floor, not a ceiling.
| Situation | Reasonable minimum |
|---|---|
| Coding agent on your own laptop | The agent's built-in OS sandbox turned on; writes limited to the project; network off or allowlisted; no production credentials on the machine |
| Agent in CI (reviewing PRs, fixing tests) | Fresh container per run; no long-lived secrets in env; short-lived, narrowly scoped tokens; egress limited to the registries it needs |
| Agent in production touching customer data or internal APIs | Its own identity and least-privilege role; credentials injected by a proxy, not held; all egress through a policy proxy; full audit log; human approval for irreversible actions |
| Running untrusted code for many users on shared machines | microVM or gVisor per session; no shared credentials between sessions; destroy the sandbox when the task ends |
| Security testing or evaluating frontier models | All of the above, plus an independent monitor outside the host and a tested kill switch |
#014A Practical Checklist
If you're putting an agent into any environment you care about, this is the short version of everything above, roughly in order of how much risk each item removes:
- Turn on the agent's own sandbox if it has one. It's usually off in "full access" modes, and those modes exist for convenience, not safety.
- Deny network by default and allow specific destinations. Treat every allowlisted service, especially package registries, as part of the wall.
- Keep real secrets outside the sandbox. Use a proxy that injects credentials for approved requests, or short-lived tokens scoped to one task.
- Block the cloud metadata service from agent workloads and stop auto-mounting Kubernetes service account tokens.
- Make configuration and hook files read-only, including
.git, the agent's own config and anything that runs automatically later. - Run as a non-root user, refuse privileged containers and host mounts, and limit memory, CPU, process count and task duration.
- Review every tool the agent can call as part of its permissions, not as a separate concern.
- Log from outside the agent, alert on denied actions, and keep a kill switch the agent can't reach.
#015What a Sandbox Can't Do
A sandbox limits where an agent can reach. It does nothing about what the agent does within those limits. If an agent is allowed to read your customer database and allowed to post to a Slack channel, a malicious instruction hidden in a support ticket, a classic Prompt InjectionAn attack where instructions hidden in content an AI reads, such as a web page, email or document, trick it into doing something its user never asked for., can still make it post customer data to that channel, and every rule was obeyed. Allowlisted destinations can also be used to carry data out: a sandbox that broadly allows GitHub may, for example, also allow the agent to push data into a public repository or gist. This is exactly why the lethal trifecta is framed around combinations rather than individual permissions, and why removing one leg of it is more reliable than trying to filter all three.
Sandboxes also depend entirely on their configuration, and they sit on software that has bugs of its own, as the runc escape and the package proxy zero-day both showed. As Justin Greis, CEO of the consulting firm Acceligence, put it at the OpenShell launch, "hardware-enforced controls are only as good as the boundary and policy we give them." A sandbox with a generous policy is a generous sandbox.
A sandbox answers "how far can this go wrong?" It never answers "will this go wrong?"
#016The Short Version
An agent sandbox is not a single product or a single wall. It's a set of decisions about four doors: what the agent can read and write, where it can send data, which identities it can act as, and what it can do to the machine and to other processes. The building blocks are old, well-understood Linux features. What's new is that the thing on the other side of them is now actively looking for gaps.
The practical rule that falls out of all of this is short. Decide ahead of time exactly what an agent is allowed to reach, enforce it somewhere the agent can't edit, keep the real keys outside, and watch from outside. The rest is detail, and the detail is where the next breach will come from, so it's worth getting right.
#017Sources
Every technical claim above comes from the project documentation, kernel documentation or incident reports listed below.
- Making Claude Code more secure and autonomous with sandboxing — Anthropic Engineering, 20 October 2025: bubblewrap/Seatbelt, the network proxy, credentials outside the sandbox, 84% fewer permission prompts
- Agent approvals & security — OpenAI Codex documentation: network off by default, workspace-only writes, read-only
.git/.codex/.agents, Seatbelt on macOS, bwrap plus seccomp on Linux - OpenShell security best practices — Nvidia OpenShell documentation: network namespace and proxy, default-deny egress, Landlock, seccomp, privilege dropping, placeholder credentials, audit vs enforce
- Landlock: unprivileged access control — Linux kernel documentation
- namespaces(7), cgroups(7) and seccomp(2) — Linux manual pages
- gVisor documentation — the user-space kernel design and its compatibility and performance trade-offs
- Firecracker — boot time, memory overhead, device model and the jailer
- runc advisory GHSA-xr7r-f8xq-vfvv (CVE-2024-21626) — the "Leaky Vessels" container escape, fixed in runc 1.1.12
- Modify instance metadata options for existing instances — AWS documentation on requiring IMDSv2 and the PUT response hop limit
- Configure Service Accounts for Pods — Kubernetes documentation, including opting out of automatic API credential mounting
- Anatomy of a Frontier Lab Agent Intrusion: A Technical Timeline of the July 2026 Incident — Hugging Face's forensic report
- The lethal trifecta for AI agents — Simon Willison, 16 June 2025
- Nvidia releases Open Agent Safety Platform to monitor and govern agentic AI — CSO Online, 28 September 2026, for the analyst quote on boundaries and policy

