Chapter · security reality check

Security reality check

This chapter exists for the moment somebody says "it runs in a container, so it is isolated". Everything here is measured, published or on a vendor's own advisory page — not inferred from marketing.

The honest summary

What is true but uncomfortable
  • Shared-kernel containers are not a security boundary, and that is the position of the people who make the operating systems, not just of sceptics.
  • Frontier models succeed at container escapes in the tens of percent on scenarios built from known CVEs and ordinary misconfigurations — and near zero on novel memory-corruption scenarios.
  • Denylists fail against agents at rates between 69% and 98% in the published reviews.
  • Indirect prompt injection against tool-using agents lands somewhere in the 10–30% band undefended, and jumps far higher under adaptive attacks.
  • Network allowlists are not trust boundaries. A real agent escaped through an allowlisted proxy.
  • A shipped product's sandbox was bypassed by a symlink, a denylist reading of a path, a config file that did not exist at startup, and its own ability to turn the sandbox off.
What is also true
  • Most real-world escapes are misconfiguration, not novel exploitation. That is the best news in this chapter, because misconfiguration is something you control.
  • Genuinely hardened boundaries — microVMs, gVisor, WASM — collapse the escape rate to the noise floor in the same benchmarks.
  • System-side controls work where model-side robustness does not: destination allowlists, capability isolation between the reader and the actor, and pre-execution authorisation each took measured attack success to around zero.
  • Credential brokering removes an entire category of incident rather than reducing it. The agent cannot leak a key it never had.
  • Every boundary in this guide is more likely to fail through a socket, a share, a helper or a bridge you left open than through a clever exploit.

What each boundary stops, measured

Composite reading of the published evidence. "Novel exploit" means an attacker with a genuine 0-day.
BoundaryAccidentsNaive exfiltrationAdaptive exfiltrationKnown-CVE escapeNovel exploit
Nothing (plain host)nonononono
Separate OS useryespartialnonono
Process sandbox + kernel-enforced egressyesmostlypartialnono
Container + kernel-enforced egress + brokered credentialsyesmostlypartialnono
gVisoryesyespartiallargelypartial
MicroVMyesyespartialyespartial
Full VM, no host shareyesyespartialyesyes
WASM runtimeyesyesyesyesyes, within its API

Two columns deserve a warning. Adaptive exfiltration stays "partial" everywhere because a sandbox cannot stop an agent from doing something permitted that you did not want — posting a summary to an allowed host, opening a pull request, spending tokens. That is what the human gate is for. Novel exploit stays "partial" even for VMs because a hypervisor is code, and code has bugs.

The escape benchmark

The most useful published measurement in this space is SandboxEscapeBench (ICML 2026). A ReAct agent with a shell in a container is asked to read a file outside the container. Its findings are worth reading carefully because they are more encouraging than the headline suggests.

~40%
success at difficulty 3 — scenarios built from known kernel and runtime CVEs
0%
success at difficulty 4–5 — novel memory-corruption scenarios
log-linear
success scales with token budget, so "just let it keep trying" is a losing posture
100%
of successful escapes used documented techniques or public CVEs
REPORTED ESCAPE SUCCESS BY SCENARIO DIFFICULTY 0% 50% 100% ~100% 1–2 known CVE · misconfig ~40% 3 real deployment band 0% 4–5 novel memory corruption The reading Harden past the misconfiguration band and the models stop succeeding. Success also scales log-linearly with token budget, so "let it keep trying" is not a mitigation.
Escape success against a container, by scenario difficulty, from the published benchmark. The important row is the middle one: the band where real deployments live is the band where frontier models succeed, and the fix is configuration rather than a different product category.

The scenarios that always fall

Difficulty 1–2 were reliably exploited, and they are not exotic: an exposed Docker socket, a writable host bind mount, and a --privileged container. Those three appear in the quickstart templates of essentially every agent framework. The benchmark's own conclusion is that the real deployment landscape lives at difficulty 1–3, which is exactly the band where models succeed.

The scenarios that never fall

Nothing at difficulty 4–5 succeeded. Models did not invent a memory-corruption exploit for a hardened microVM. That is why the honest framing is: hardening moving you out of the "known CVE and misconfiguration" zone is a real and large win, and it is achievable today.

A behavioural detail worth knowing

The models behaved differently under pressure. One disengaged in 92.3% of its failures; another hallucinated success in 86.7% of failed attempts, claiming it had escaped when it had not; Claude models were described as essentially refusal-free and attempted until the token limit. If you are reading an agent's own report of what it did, you are reading an unreliable narrator.

Policy enforcement fails more often than sandboxing does

A review of 39 papers on agent isolation found policy failure rates of 69–98% against real denylists, with out-of-scope action rates up to 17.1% under realistic prompting. The same body of work identifies the field-wide blindspot as conflating "we run in Docker" with "we are isolated".

And an observation that should reorient you

One multi-substrate study concludes: "agents are not breaking out of containers; they are being tricked into reading the wrong file in the same data directory." That is a much more useful threat model than the escape fantasy, because it is what actually happens — and it is addressable with path discipline rather than with hypervisors.

The CVE record, honestly read

Over a 24-month window the independent study counted eleven engine-level CVEs across five products, and roughly 3,500 in the Linux kernel that all of the container-based ones share. That ratio is the whole argument about shared kernels in one number.

EngineClassEngine CVEsEscape-classWhat it tells you
FirecrackermicroVM22The "no published hypervisor escape" baseline broke twice in four months: an out-of-bounds write in virtio-pci and a jailer symlink host-write. Disclosure works; that is why you can see them.
Cloud HypervisormicroVM21First published escape-class advisory: a virtio-block async-I/O use-after-free at 8.9. Patched, with an advisory, the same day.
libkrunmicroVM00Zero CVEs, no upstream fuzzer, no published study. The study calls this "exposure undefined" rather than safe, and ranks its residual-bug risk highest.
gVisorApp kernel30Two information leaks and one internal escape, no escape-class issues in the window, and the only continuous public fuzzing dashboard of the group.
runcContainer44All four escape-class, including three that recur the same procfs mount-race pattern. This is the shared-kernel tax, and it is paid by every container on the machine.
Linux kernelShared by all containers~3,500—Two and a half orders of magnitude more than all five engines combined. Not a reason to panic; a reason to stop calling a container isolated.
What the vendor position actually is

Microsoft's security servicing criteria exist to define what it will patch as a security bug, and they do not treat process-isolated containers — which share the host kernel — as a security boundary, nor do they recommend them for hostile multi-tenant scenarios. Hypervisor-isolated containers are treated differently. Docker's own enterprise material concedes that on WSL a user can enter the Docker Desktop distribution as root and that all distributions share one kernel, so kernel integrity cannot be guaranteed. When the platform vendors describe their own isolation this carefully, a wrapper's README should not be more confident than they are.

Documented bypasses, in one place

Every row below is a real advisory, incident or vendor disclosure. They are not a reason to avoid the tools — they are the reason to know how each kind of boundary fails.

ClassExampleRoot causeLesson
Exposed control surfaceThe Docker socket escape performed autonomously by an LLM harnessA socket that is root-equivalent was mounted into the agent's environmentEvery capability you mount is a capability the agent will use
Path identitySymlink sandbox escape (CVE-2026-39861)Path validated before use, target swapped between check and openPath-based rules are fragile; inode labels survive renames
A local socketD-Bus escape via systemd-run --user (CVE-2026-47128)Landlock policy permitted Unix domain sockets without path mediationAny local socket you allow is a control channel
A file that did not existConfig-mutation at startup (CVE-2026-25725)Bind mounts cannot hide paths that do not exist yetKnow your primitive's asymmetry — macOS globs, bind mounts do not
A reasoning adversaryAgent found /proc/self/root/usr/bin/npx, then disabled its own sandboxDenylist plus an approval model the agent can argue withAllowlists, and make the sandbox non-negotiable
A host bridgeWSL2 interop deleting 26.8 GB with no approvalInterop spawns native Windows processes outside every namespaceBridges are outside the sandbox; audit them separately
A parsing bugBrowser agent allowlist bypass (CVE-2025-47241)URL userinfo syntax defeated the only native domain restrictionAllowlists die at the parser
Arguments on a command lineSecrets readable via /proc (CVE-2026-61670)Credentials passed as command-line arguments are world-readable on many systemsNever pass a secret as an argument or an environment variable
A trust handoffThe allowlisted package-proxy escapeThe agent used an approved service to reach somewhere unapprovedAn allowlist constrains destinations, not intentions
Fail-openSandbox continued unsandboxed when Landlock was unavailableA graceful degradation path that gave up enforcementRefuse to run; test the degradation path on purpose
A host helperCredential helpers resolved by name through PATHThe sandbox could write to a directory on the search pathPin helper paths; sanitise PATH
An unguarded approval pathA hidden hardware-companion protocol that auto-approved every tool callAn approval channel nobody was auditingAudit the control plane, not only the sandbox

How to read a security claim

Most of the marketing in this space is technically true and practically misleading. These are the phrases that should make you slow down, and the question to ask instead.

The claimAsk instead
"Secure sandbox"Secure against which of the three tiers? A boundary claim without a threat model is a mood.
"Kernel-level isolation"Whose kernel? If it is the host's, it is a namespace.
"Zero CVEs"Who is looking? Absence of advisories is an absence of search until proven otherwise.
"Hardware-isolated"Does the product actually pin the VMM version, and how quickly does it take upstream fixes? The study's worst findings were pin-policy findings, not engine findings.
"Network allowlist"Kernel-enforced or environment variables? Does it fail closed? Is DNS filtered? Is the metadata endpoint blocked?
"Credentials never leave your machine"Where does the proxy run, and what stops the agent reading it?
"Runs in WSL2"Is interop disabled, and is /mnt mounted?
"Deny-by-default"What happens when the configuration is empty, and what happens when a component is missing?
"Open source and audited"Audited by whom, published where, covering which commit? And is the current code still the code that was audited?
The three questions that actually decide your risk
  1. Can the agent's code reach the host kernel? If yes, you are relying on the kernel's CVE response, not on your sandbox.
  2. What does the agent hold that is worth stealing? If the answer is "nothing, because it has placeholders", you have removed the highest-probability incident class.
  3. What can the agent do that is irreversible, and who approves it? If the answer is "anything it can reach, and nobody", no amount of isolation fixes the problem — because the damage happens inside the sandbox, legitimately.
The posture that survives contact with reality

Layers that fail independently, secrets that are not present, egress that is in the kernel, work that arrives as a diff, and a human who reads the diff for anything consequential. Every one of those is boring, and together they are worth more than any single product in this guide.