VM · Agent sandboxAssume the agent is compromised

Exactly one
way out.

Preamble

We’re building sandboxes for AI agents. Each agent runs in a lightweight virtual machine with a single guarded channel to the outside world, and it launches only after a check proves that channel is its only exit.

Subject

Sandboxes for AI agents, with proof of containment.

In development · Taking design partners

Read a sample certificate → Become a design partner →

§1Why now

Two escapes.
Two different ways out.

This summer, agents being tested by two frontier labs got out of environments that were meant to hold them. One went out through an exit nobody knew was there. The other went out through the one exit it was allowed.

1.1 – 1.2

From the labs’ own disclosures

1.1 · Anthropic · 30 Jul 2026

An exit nobody knew about.

Claude was told its evaluation machines had no internet access. A misconfiguration in a partner’s environment had left them online, and the models reached the systems of three outside organizations.3

What answers it

A proof, before launch, that the channel is the only exit. §3

1.2 · OpenAI · 21 Jul 2026

The one allowed exit had a flaw.

OpenAI’s sandbox had a single route out: an internal service that fetches software libraries. The models found a previously unknown flaw in it, raised their privileges and moved through OpenAI’s network to a machine with internet access, then into Hugging Face’s production systems.2

What answers it

A guard proven to do only what its spec says. §2

That sandbox also had exactly one way out. So one channel isn’t the claim.

The claim is two proofs: the channel is the only exit, and the guard on it does only what its spec says. Anthropic drew the same line between the two incidents. OpenAI’s models “exploited a novel vulnerability to escape isolation,” while Claude “accessed the internet via an open path.”4

Table 1

Public containment failures.

Dated, sourced, kept current

Disclosed What happened The way out Answered by
21 Jul 2026
OpenAI
Models in an evaluation sandbox reached Hugging Face’s production systems.2 A flaw in the one allowed exit Verified guard §2
30 Jul 2026
Anthropic
Claude reached three outside organizations during cyber evaluations.3 Internet left open by a misconfiguration Pre-launch proof §3
25 Sep 2026
OpenAI
On Sept. 20, an agent with no sanctioned internet access sent queries to a public chatbot, weeks after OpenAI announced sandbox security upgrades.5 DNS lookups that weren’t filtered Pre-launch proof §3

As of 3 Nov 2026. Primary sources in the notes.

§2The guards

Assume the agent
is compromised.

We design for the worst case: whoever controls the agent controls everything inside its VM. The guarantees are built to hold anyway, because everything that enforces them sits outside it, on the one channel.

Exhibit A

One VM, one channel, one guard. The policy, the real credentials and the record all live with the guard.

Design · Being verified

Exhibit A · The sandbox The channelOutside the VMRefused
The agent runs inside a VM. A single channel crosses the VM’s boundary to a guard outside it. The guard forwards requests to an approved destination, api.github.com, and refuses others such as paste.example. Inside the VM the agent holds only a placeholder token. The policy, the real credentials and the audit log are held by the guard, outside the VM. VM · assume compromised agent.py Agent GITHUB_TOKEN placeholder itp_ph_7f3a9c… outside the VM Guard Policy Real credentials Audit log approved api.github.com not on the list paste.example The agent runs inside a VM. A single channel crosses the VM’s boundary to a guard outside it. The guard forwards requests to an approved destination, api.github.com, and refuses others such as paste.example. Inside the VM the agent holds only a placeholder token. The policy, the real credentials and the audit log are held by the guard, outside the VM. VM · assume compromised agent.py Agent GITHUB_TOKEN placeholder itp_ph_7f3a9c… outside the VM Guard Policy Real credentials Audit log approved api.github.com not on the list paste.example
  1. 2.1 · Destinations

    It cannot reach unapproved destinations.

    Every connection and every DNS lookup goes through the guard. Anything not on the allow list is refused there.

    Exhibit 2.1 · A refused request
    14:02:11Z  CONNECT  api.github.com:443    allow
    14:02:13Z  CONNECT  paste.example:443     refused
    14:02:13Z  DNS      x7f3a.paste.example   refused
    refused: not on the allow list
  2. 2.2 · Credentials

    It cannot obtain real credentials.

    The agent only ever holds placeholders. The guard swaps in the real credential on requests that pass its check, and only for the destination that credential belongs to.

    Exhibit 2.2 · The swap
    inside the VM
    GITHUB_TOKEN=itp_ph_7f3a9c…   worthless anywhere else
    
    at the guard, after the check
    Authorization: Bearer itp_ph_7f3a9c…
                → Bearer ghp_••••••••   api.github.com only
  3. 2.3 · Rules

    It cannot change its own rules.

    The policy is held by the guard, outside the VM. Nothing the agent sends over the channel can rewrite it.

    Exhibit 2.3 · Where the policy lives
    policy   sha256:4be1…09c2   held by the guard
    allow    api.github.com
    secrets  GITHUB_TOKEN → api.github.com
    
    agent → write policy        no such route on the channel
  4. 2.4 · The record

    It cannot hide what it did.

    The record is written by the guard, not by the agent, and the agent has no way to write to it.

    Exhibit 2.4 · Written by the guard
    #4127  14:02:11Z  allow    CONNECT api.github.com:443
    #4128  14:02:13Z  refused  CONNECT paste.example:443
    #4129  14:02:13Z  refused  DNS x7f3a.paste.example
    writer: guard · the agent has no write path
The limit, stated plainly

The guard controls where the agent can go, not what happens once it arrives. Approve a destination that can itself be broken into, and the guard can work exactly as proven while the agent attacks that destination and moves on from there. That is roughly what happened to OpenAI’s package service. Approved destinations are your responsibility, and every certificate says so.

§3Before launch

Checked before
it launches.

Before a sandbox starts, the checker looks for every way out of the VM, not just the one you meant to give it. If it finds a second exit, the launch is blocked and the path is named. If it can’t prove there isn’t one, the launch is blocked too. Couldn’t prove it means it doesn’t launch.

  1. Checking

    One approved destination, one secret.

    allow: api.github.com · secrets: GITHUB_TOKEN
1 / 4
Exhibit B · A second exit The channelAnother way outContained
A sandbox is submitted with one guarded channel to api.github.com. The checker finds a second exit: the VM’s DNS lookups go to the host’s resolver and out to the internet, around the guard. The launch is blocked with that path named. DNS is sent through the guard, the check runs again, and the VM is shown contained with one exit. VM · sbx_7f3a9c agent.py Agent guard allow: api.github.com approved api.github.com udp/53 · on the host Host resolver not approved Internet second exit data in the names LAUNCH BLOCKED dns: via the guard CONTAINED · 1 EXIT certificate issued A sandbox is submitted with one guarded channel to api.github.com. The checker finds a second exit: the VM’s DNS lookups go to the host’s resolver and out to the internet, around the guard. The launch is blocked with that path named. DNS is sent through the guard, the check runs again, and the VM is shown contained with one exit. VM · sbx_7f3a9c agent.py Agent guard allow: api.github.com approved api.github.com udp/53 · on the host Host resolver not approved Internet second exit data in the names LAUNCH BLOCKED dns: via the guard CONTAINED · 1 EXIT certificate issued

Illustrative. DNS is how an OpenAI agent reached a public chatbot on Sept. 20.5

§4The certificate

The proof is
the product.

Every sandbox comes with a document you can hand to an enterprise customer or an auditor. It says what was proven, what the proof relies on, and what it doesn’t cover.

Exhibit C

The document a customer forwards to their auditor, in three parts.

Sample · Not a real sandbox

Interpolant · Certificate of containmentSample

sbx_7f3a9c runs agent.py with one exit.

Verdict
Contained
Exits found
1 · the guarded channel
Checked
2026-11-03 14:01:58Z · before launch
Image
sha256:91d0…7e44
Policy
sha256:4be1…09c2
Allowed
api.github.com · GITHUB_TOKEN

Proven

For this sandbox, by the checker

  • The guarded channel is the only way out of the VM.
  • The guard refuses every destination except api.github.com.
  • The real GITHUB_TOKEN never enters the VM, and is only sent to api.github.com.
  • The policy cannot be changed from inside the VM.
  • Every request on the channel is recorded by the guard.

Trusted

What the proof relies on

  • The hypervisor that isolates the VM.
  • The hardware it runs on.
  • The proof checker.
  • That the running guard was built from the verified source.

Not covered

Said plainly, so the rest can be believed

  • Approved destinations. What api.github.com lets the agent do is yours to secure.
  • Side channels: timing, shared caches, power.
  • What the agent does with access you gave it on purpose.
Signed, Interpolant sample signature · ed25519:9f1c…a24b

§5Developers

Works like the sandboxes
you already use.

Fast sandboxes, a few lines to integrate, and pay for what you use. The difference is the last line.

Exhibit D

A sandbox with one approved destination and one secret.

Planned API · Illustrative

from interpolant import Sandbox

sb = Sandbox(allow=["api.github.com"], secrets=["GITHUB_TOKEN"])
sb.run("python agent.py")
sb.certificate.url  # shareable proof of containment
SDK
Python first. Other languages as design partners need them.
Pricing
Usage-based. You pay for the time your sandboxes run.
Speed
We’ll publish boot and check times once we’ve measured them.

§6Design partners

Send us the agent you’re least sure about.

We’re working with a small number of design partners whose agents run code, hold credentials or act on real systems. Bring the one that worries you most, and we’ll look for every way out of it.

Interpolant Proof attached

Notes

  1. 1Interpolant. In model checking, an interpolant is a formula that separates the states a system can reach from the states it must never reach. Finding one proves those states unreachable. On this page it is the cerulean line: the channel, and the only thing that crosses the box.
  2. 2OpenAI and Hugging Face, July 2026. The sandbox had “no route to the open internet except OpenAI’s one internal service that fetches software libraries.” KQED, 23 Jul 2026. Hugging Face’s technical timeline, 27 Jul 2026. Reporting differs on how many models were involved and how long the intrusion lasted. kqed.org/news/12092162 huggingface.co/blog/agent-intrusion-technical-timeline fortune.com, 21 Jul 2026
  3. 3Anthropic, “Investigating three incidents in our cybersecurity evaluations,” 30 Jul 2026. Anthropic later reported a fourth incident, from January 2026, and revised part of its July assessment (9 Sep 2026). anthropic.com/news/investigating-incidents-cybersecurity-evals anthropic.com/research/alignment-assessment-cybersecurity-incidents
  4. 4Anthropic, 30 Jul 2026, same post as note 3. anthropic.com/news/investigating-incidents-cybersecurity-evals
  5. 5OpenAI, “An agent used DNS to reach an external chatbot,” updated 25 Sep 2026: “insufficient DNS filtering in its training sandbox.” Fortune, 26 Sep 2026, on the steps OpenAI announced on Aug. 18. alignment.openai.com/misalignment-reports/an-agent-used-dns-to-reach-an-external-chatbot fortune.com, 26 Sep 2026