Containing models under evaluation with isolated execution, verifiable policy, and independent enforcement
A high-assurance evaluation containment plan for running capability, alignment, and agentic evaluations against highly capable models while reducing breakout paths through tool use, generated code, scoring, artifact handling, networking, and operator workflow. The components are assigned to distinct trust domains; they are not interchangeable and none is treated as a proof of ASI containment.
Introduction
To find out what a highly capable model can do, you have to let it do things: write and run code, use tools, read files, call services, and work for hours on hard problems. Evaluations are where a model's most dangerous capabilities are deliberately drawn out, often before anyone knows how strong they are. That makes the evaluation environment the first containment boundary a new model meets, and one of the most important.
This is no longer a hypothetical concern. Several frontier labs have reported agents that left the evaluation environments meant to hold them, reached systems they should not have, and in some cases misreported what they had done. None of these needed a single new capability; tools, time, ambiguous instructions, and persistence were enough.
This plan describes how to run those evaluations so that a model that tries to leave, whether by design, by drift, or by accident, cannot turn tool use into host compromise, weight theft, internet access, contamination of other samples, or capture of the people and credentials running the evaluation.
The approach in seven ideas
- Separate thinking from doing. The model runs on inference hardware. Its code and tool calls run in separate, disposable virtual machines that have no route to the model, the weights, or any secret.
- One hardware-isolated box per sample. Every sample gets a fresh Firecracker microVM that is destroyed afterwards. Containers and namespaces are never the inner boundary for model-written code.
- Fix authority before launch. Each run has a signed maximum set of files, services, tools, and credentials it may ever reach. A policy prover checks that set before the run starts, and nothing at runtime can exceed it.
- Authority expires unless renewed. The run's access to the model and to services is a short lease that an independent safety plane must keep renewing. If anything goes wrong, including the safety plane itself failing, the run stops on its own.
- Everything that comes back is hostile. Output is size-bounded, rich files go to quarantine, and hidden tests are scored in a separate, isolated scorer. Nothing the model produces is rendered or unpacked in a trusted process.
- Watchers are independent. Enforcement and the audit trail sit outside the execution host, are run by different administrators, and never rely on the agent's own account of what it did. Monitors can stop a run; they can never grant it more.
- People are a boundary too. Operators review model output in disposable, offline compartments (Qubes OS or separate machines), so a malicious artifact cannot reach the credentials that control the system.
What this plan is, and is not
It is a defense-in-depth engineering design for bounded evaluation runs, with concrete controls, a go/no-go checklist, and 45 acceptance tests that must pass before tool-using evaluations begin. It is not a formal proof that an arbitrarily capable system is contained. Section 15 lists the risks it does not remove, and section 0 says when a model has outgrown this plan and the decision must move to an organizational containment protocol.
How the document is organized
| Part | Sections | Read it for |
|---|---|---|
| Foundations | 0–3 | Goals and limits, the threat model, design principles, and the seven trust domains |
| Architecture | 4–8 | The target system, execution standards (Firecracker, Kata), the operator plane, networking, secrets, policy verification, and approvals |
| Running evaluations | 9–10 | The runner contract, capability stages, leases and the stop sequence, and nested escape evaluations |
| Building and operating | 11–13 | Supply chain, monitoring, staffing, and implementation milestones |
| Verification | 14–16 | Acceptance tests, residual risk, and the go/no-go checklist |
| References | 17 | Upstream documentation each design choice relies on |
0. Purpose and hard limits
This plan answers a narrow question: during evaluations, how do we stop the agent-under-test from turning tool use into host compromise, weight theft, internet reach, contamination of other samples, or capture of operator credentials.
Success for this plan means all of the following:
- Model-written code cannot reach the host, sibling samples, orchestration plane, or secret stores through any declared interface.
- The guest never holds provider keys, model weights, hidden-test material, backend credentials, or reusable administrative authority.
- Egress is deny-by-default and independently enforced outside the guest at two layers.
- Every byte returned by the guest is treated as attacker-controlled until reduced to a bounded, typed representation or opened in quarantine.
- Operators cannot casually mix untrusted model output with secrets or administrative credentials.
- Any escape evaluation is nested inside a sacrificial outer VM on a host with no weights or production authority.
- A failed sample leaves no reusable writable state, credential, network identity, or cross-sample channel.
- Loss of an enforcement control or its verification signal fails closed and stops new scheduling.
- Each run has a signed maximum authority envelope that is machine-checked before launch; live policy can narrow or activate pre-approved capabilities but cannot exceed that envelope.
- All inference requests pass through an independently controllable gateway, and the run's right to inference and brokered service access is a short lease that stops by itself unless the safety plane keeps renewing it.
- A stop halts the guest as well as the model: running tool code is frozen and captured, not left to finish.
Threat-model assumptions that must be explicit per suite
| Assumption | Required treatment |
|---|---|
| Time and compute are bounded | Hard wall-clock, vCPU, memory, disk, file-count, and output quotas enforced outside the guest. |
| No persistence except declared transcript/artifacts | Fresh per-sample state; no writable shared caches; retained artifacts enter quarantine, not a future agent workspace. |
| No physical access | Physical tamper, firmware compromise, and facility security are handled by the hosting environment, not this plan. |
| Inference endpoint is a separate trust domain | Execution VMs cannot route to it. Sensitive tool output is not automatically relayed to an external provider. |
| Host/hypervisor exploits remain possible | Use dedicated hosts, minimal VMM surface, rapid security-update response, and sacrificial pools for escape research. |
| Human reviewers can be targeted | Rich artifacts open only in disposable/quarantine domains; administrative approval paths never depend on untrusted rendered content. |
1. Threat model
Assume the model will sometimes try to leave. Do not require proof of “intentional ASI scheming” before applying these controls. The same design also stops sloppy eval harnesses and compromised dependencies.
In-scope adversary actions
| Action | Typical path | Primary control |
|---|---|---|
| Guest-to-host escape | Kernel exploit, Docker socket, privileged container, VMM bug | Firecracker + jailer; no privileged devices |
| Lateral movement | Sibling pods, shared caches, cluster DNS, writable image layers | Per-sample VM; no shared writable stores |
| Credential theft | Mounted env files, cloud metadata, K8s service accounts | Nothing ambient in guest; metadata blocked at tap |
| Exfiltration | Open HTTPS, DNS tunneling, allowed package registry | Host-enforced egress allowlist / no network |
| Harness hijack | Prompt injection into scoring, import of Inspect from guest | Runner outside sandbox; push-in command channel |
| Operator compromise | Malicious HTML/PDF, “paste this kubectl”, USB, phishing | Qubes compartments + disposable VMs |
| Eval contamination | Hidden tests readable from agent FS; gold labels in image | Offline answer VM; inject only task files |
| Coordination channel | Shared package cache directory names as messages | No shared cache; content-addressed read-only mirrors |
| Return-path exploit | ANSI/terminal injection, malicious archive, parser bug, crafted notebook or image | Bounded typed protocol + artifact quarantine + isolated scorer |
| Transcript-mediated exfiltration | Guest encodes sensitive data in stdout that the runner forwards to a remote model or judge | Suite data classification; no automatic forwarding of sensitive bytes; internal inference for restricted suites |
| Control-channel confused deputy | Guest influences vsock/K8s exec path, filenames, or runner RPC parameters | One-way host-initiated protocol; strict schemas; no guest-initiated privileged RPC |
| Resource exhaustion | Fork/CPU bomb, disk fill, huge stdout, decompression bomb | Host quotas, output caps, archive limits, watchdog kill, host reserve |
| Snapshot clone-state reuse | Duplicated identifiers, cached tokens, entropy/userspace PRNG state | Secret-free snapshots; VMGenID-capable guests; refresh identities; cold boot for uniqueness-sensitive runs |
| Policy drift | Kata backend, CNI, admission rules, or Firecracker flags change underneath a suite | Attested configuration manifest; reject runs when effective runtime or hashes differ |
| Permission persuasion / scope creep | Agent repeatedly requests broader access or manipulates an approver into widening policy | Pre-proved maximum authority envelope; agent cannot self-approve; broadening requires terminating and re-authorizing a new run |
| Host-blind monitoring failure | Compromise of the execution host disables local logs, firewall state, or watchdogs | Independent upstream enforcement plus separate model-path safety plane; optional host-independent DPU/in-silicon enforcement |
| Self-report falsification | Agent's transcript, tool narration, or final summary misstates what it actually did (reported in recent lab breakout incidents) | Audit derived only from enforcement points (VMM, network layers, broker, gateway); automated transcript-vs-audit reconciliation; mismatch is an incident |
| Denial-driven drift | After a policy block, the agent searches for workarounds (alternate tools, encodings, other endpoints); long horizons amplify this | Denial circuit breaker; minimal denial text; envelope already covers indirect routes; wall-clock and step caps |
| Monitor manipulation | Guest-authored text in the transcript prompt-injects an LLM monitor or approver, or floods it to hide a signal | Monitors can only restrict; different model lineage; approvers see structured diffs, not agent prose; monitor outage fails closed via lease expiry |
| Safety-plane capture | Same credential or admin compromises both execution farm and the watchdog | Separate admins and credentials; separate management network; attested DPU/gateway firmware |
Out of scope for this infrastructure alone
- Novel hardware side channels (Spectre-class leakage across microVMs).
- Long-horizon social engineering of staff who hold production authority.
- Weight theft from the inference cluster if that cluster is mis-built.
- Post-eval deployment to millions of users with tools.
- Formal containment of a system outside the bounded assumptions above, including unknown hardware or hypervisor exploits.
2. Design principles
- Split inference from execution. The model API lives in a trusted runner. Only tool calls and generated code enter a VM. This is the Inspect / METR Hawk pattern.
- Hardware virtualization for untrusted Linux. Namespaces are not the inner boundary for model-authored code.
- Policy lives outside the guest. Egress, credentials, and time limits must not be implementable as “please don’t” inside the agent framework.
- No ambient authority. A guest that behaves exactly as designed still cannot reach weights, keys, or the public internet.
- Ephemeral by default. One microVM per sample. Destroy after scoring.
- Nest escape tests. Never evaluate breakout against the machine that holds the crown jewels.
- Operators are a plane. Untrusted model artifacts are opened in a domain that cannot see vault material.
- Shared infrastructure is a covert channel until proven otherwise. Caches, overlays, and “helpful” package mirrors are hostile.
- Treat the return path as hostile. stdout, stderr, files, archives, notebooks, HTML, images, patches, and scorer inputs are attacker-controlled bytes.
- Separate operator secrets from backend secrets. A Qubes vault stores human/recovery credentials; a backend broker/HSM issues job-scoped machine credentials. The Qubes vault is not an online token service.
- Use two independent network barriers. Per-VM enforcement and an upstream firewall/router must both deny unauthorized IPv4, IPv6, DNS, multicast, link-local, and metadata traffic.
- Fix a maximum authority envelope before launch. Compile the suite policy into a machine-checkable model of reachable files, services, operations, credentials, tools, and delegation paths. Runtime changes may narrow policy or activate a pre-approved subset, but may not exceed the signed envelope.
- Detection is not the boundary. The system must remain contained if logging, alerting, or a dashboard fails; loss of verification stops new runs.
- Minimize parsers in the trusted computing base. The orchestration process should move bounded bytes and typed actions, not render or recursively unpack untrusted content.
- Bind credentials to approved requests outside the workload. If a C3 suite needs authenticated service access, the guest gets only a placeholder/reference. A trusted proxy substitutes the real credential only after destination, protocol, method/operation, identity, and policy all match.
- Control the path to inference. Every model request passes through a gateway outside the execution environment. The gateway is an observation point and kill switch; no guest or execution host has a bypass route to the model endpoint.
- Prefer independent enforcement over self-observation. For the highest-risk runs, move monitoring and cutoff authority into a separate host or hardware security domain. Behavioral monitoring is useful evidence, but containment must not depend on the agent reporting its own state or exposing private chain-of-thought.
- Give every action lineage. Agent, sub-agent, tool, credential, policy decision, inference call, and brokered request carry a run identity and parentage so delegation cannot silently create ungoverned authority.
- Authority expires unless renewed. Inference and brokered access are leases with short TTLs, renewed only while the safety plane has a healthy, independent view of the run. A cutoff that has to be actively fired is a backup, not the primary mechanism.
- Monitors may restrict, never grant. Anything that reads attacker-influenced content (LLM monitors, drift detectors, human reviewers of transcripts) can pause or narrow a run but cannot widen authority or clear an alarm raised by a deterministic control.
- Independence is a property of administration, not of hardware. A separate box managed by the same people, credentials, or network as the execution farm is not an independent control.
3. Seven trust domains and which component owns them
| Trust domain | Job | Primary mechanism | Must never hold / do |
|---|---|---|---|
| Execution | Run model-written code and tools | Firecracker; Kata only for required Kubernetes scale-out | No provider keys, weights, hidden tests, cluster credentials, general internet, or reusable state |
| Orchestration | Eval loop, model calls, capability policy, bounded byte transfer | Small trusted runner on separate hosts/node pool | Never execute, render, import, or recursively unpack model-controlled content in-process |
| Artifact / scoring quarantine | Normalize output, run candidate code against hidden tests, inspect rich artifacts | Disposable scorer/sanitizer VMs with no egress | No administrative credentials; no route back to execution; do not expose hidden tests to the interactive agent |
| Inference | Serve model weights or reach external provider | Internal inference service or provider gateway; provider/model credentials held only here | No route from execution VMs; no raw restricted artifact bytes without suite approval; no credential that works from the runner directly |
| Independent safety / model-path control | Verify policy envelope, observe inference/tool authority, preserve lineage, cut off further inference | Separate gateway/supervisor; for highest assurance, host-independent DPU/security domain (for example Sentry/BlueField or equivalent) | Must not be writable or bypassable by the guest or execution host; not administered by execution-farm admins or credentials; no unrestricted credential store; no dependence on agent self-report |
| Backend secrets | Issue job-scoped machine credentials | HSM / cloud secret manager / token broker with narrow audience and TTL | No human browsing; no guest reachability; no broad reusable tokens |
| Operator | Humans, SSH, review, incident response | Qubes OS / Xen or physically separated workstations | No rich untrusted content in credential-bearing domains; local vault is not the online backend broker |
Firecracker is the inner box
KVM microVM, tiny device model, jailer, snapshot/restore. Right primitive for “this guest may run arbitrary Linux.”
Kata is the cluster adapter
OCI/CRI runtime that makes a pod a VM. Use it to keep Kubernetes from sharing a host kernel across samples. Do not treat the cluster as trusted.
Qubes is the human OS
Xen desktop compartments for researchers. Stops the common failure where model output or a USB device owns the laptop that can reach weights.
They nest; they do not substitute
Kata can drive Firecracker. Qubes does not replace Firecracker on servers. Running Firecracker inside a Qubes VM is nested virt for a special case, not the default.
Scoring is a separate boundary
Hidden tests and rich artifacts do not belong in the runner. Candidate output is copied into a disposable scorer or sanitizer, and only a bounded result returns.
Two different “vaults”
The human Qubes vault protects administrator/recovery material. Backend jobs obtain short-lived credentials from a machine broker or HSM. Conflating these creates an unnecessary bridge from laptops to server authority.
Policy is proved against an envelope
A signed suite declares the maximum reachable authority. A policy compiler/prover checks that files, services, credentials, methods, tools, and delegation paths cannot cross that boundary before a run starts.
The model path is a cutoff point
All inference passes through a separate gateway. The runner may request a model step, but neither the guest nor the execution host can bypass the gateway. The run's inference right is a short lease: if the safety plane stops renewing it, for any reason, model calls stop.
4. Target architecture
Solid arrows are the only permitted flows. Red dashed arrows are stop/capture paths owned by the safety plane. Anything not drawn does not exist; in particular, nothing in the execution farm can open a connection to the runner, gateway, inference, or broker.
Where a DPU goes in this design. In NVIDIA's reference, the DPU sits on the node's path to the model because the agent loop runs on that node. Here the agent loop runs in the runner, and execution hosts have no model route at all. So a DPU does two separate jobs: on execution hosts it is the host-independent network enforcer (the second egress layer and the “drop net” actuator); on runner hosts it can be the model-path gate. Treat them as two deployments with separate policy, not one.
Data flow rules
- An operator submits a signed suite manifest containing the maximum authority envelope. A policy compiler/prover checks modeled file, process, network, service, credential, tool, and delegation reachability against forbidden resources before scheduling.
- The backend broker issues only job-scoped machine credentials. All model requests pass through the independent model-path gateway, which alone holds the provider/model credential. The runner authenticates to the gateway with a per-run workload identity that has no value elsewhere; the runner and execution host have no alternate route to inference.
- The runner receives structured model actions and validates them against the immutable envelope. Runtime policy may narrow access or activate a pre-approved subset, but any true broadening requires terminating the run and approving a new manifest.
- If the suite is at stage C3 (brokered service access), the guest sends a typed request containing a placeholder/reference. The external supervisor/proxy validates identity, endpoint, protocol, method/operation, and policy before substituting a real credential outside the workload.
- The runner injects only bounded commands/files through a host-initiated control channel. The independent safety plane records the run identity, agent/sub-agent lineage, policy decision, brokered request, and inference step.
- The guest returns bounded stdout/stderr and files as opaque bytes. Rich artifacts go to quarantine; terminal/control sequences are normalized before text enters logs or transcripts.
- For hidden-test scoring, candidate artifacts are copied into a fresh scorer VM. Hidden tests are injected only after the interactive agent is disconnected. The scorer returns only a bounded typed result.
- On a stop condition, or when the safety plane stops renewing the run's lease, the stop sequence in §9A runs: inference and brokered access end, the VM loses its network and is frozen, its state is captured if the stop was an incident, and then execution and scorer VMs are destroyed; overlays, network namespaces, API sockets, and temporary credentials are removed.
- Humans review plain text in eval-ctrl. Rich model output opens in a no-network disposable qube. Promotion into a trusted domain requires an explicit logged transfer.
5. Firecracker execution standard
Firecracker is the default isolation primitive for any sample that can run a shell, interpreter, package manager, or compiler.
5.1 Host baseline
- Dedicated bare-metal (preferred) or a tightly controlled VM with nested virt explicitly accepted as a degraded mode.
- Current kernel with KVM, IOMMU on, SMT policy documented (default: disable SMT on eval hosts if side channels are in-scope).
- No general-purpose workloads on the same host: no CI for other teams, no shared build cache, no developer login.
- Host SSH limited to jump from Qubes
eval-ctrlvia hardware key. No passwords. - Firecracker binary and jailer pinned by hash; deploy only via signed images.
- Host firmware, CPU microcode, KVM, and kernel are pinned to an approved baseline; emergency security advisories trigger rebuild/requalification before new frontier runs.
- Use cgroups v2. Keep a reserved host resource margin so a guest cannot force the VMM or enforcement processes into host-level OOM or disk exhaustion.
- Where supported, verify Secure Boot/measured-boot or equivalent host attestation before scheduling high-risk suites; a mismatch is a scheduling failure, not a warning.
5.2 Jailer and VMM
- Every microVM starts under the Firecracker jailer: new namespaces, cgroup, dropped privileges, chroot, seccomp for the VMM threads.
- Device model stays minimal: virtio-net, virtio-block or virtio-vsock as needed, serial console for host logs. No USB, no GPU, no extra PCI unless a named eval requires it and IOMMU groups are reviewed.
- Resource caps per sample: vCPU, memory, disk, and wall-clock timeout. Kill on expiry; do not migrate the guest to “finish.”
- Rate-limit tap and block devices so one sample cannot I/O-starve the host into dropping other controls.
- Use release Firecracker and the matching statically linked jailer. Reject debug/experimental builds for production evals and reject startup with seccomp disabled.
- Keep the Firecracker API socket in a root-owned per-VM directory inside the jail; no developer or unrelated service account can write it.
- MMDS is disabled unless a named suite requires it. If enabled, it contains only per-sample non-secret data and is never used as a credential channel.
- Disable developer-preview device hotplug and any device not named in the suite manifest. Do not add vhost-user backends unless they are independently jailed and reviewed.
- Use a dedicated network namespace and tap per microVM; do not place untrusted samples on a shared L2 bridge.
5.3 Guest image
- Golden snapshot built offline from a locked package set. No compilers-as-root surprises at runtime unless the task needs them, in which case they are in the snapshot already.
- No cloud-init that fetches from the network. No SSH daemon facing the world.
- No Docker socket, no container runtime privileged enough to talk to the host.
- No
evaluser with sudo. If root-in-guest is required for a task, that still must not imply root-on-host. - Kernel chosen for the guest is a known version with a tracked CVE process. Patch on a cadence; rebuild snapshots rather than live-updating guests.
- Guest kernel/modules are minimized to the devices actually exposed. Root-in-guest is treated as adversary-controlled from the first instruction.
- No SSH host keys, API tokens, machine credentials, unique signing material, or reusable secrets are baked into the snapshot or rootfs.
- For snapshot restores, use a VMGenID-capable guest kernel, regenerate per-VM identifiers/network identity, and cold-boot suites whose userspace cryptographic state cannot be proven clone-safe.
5.4 Lifecycle
build golden snapshot (offline)
→ register image hash in runner
→ for each sample:
restore snapshot OR cold-boot from known image
inject task files via vsock or block attach
start wall clock
pump tool calls from runner
collect artifacts over control channel
power off
wipe overlay / delete jailer chroot
retain only host-side logs and copied artifacts
5.5 What Firecracker is not allowed to do here
- Long-lived “agent workspaces” that survive across days on a host that also sees weights.
- Open egress “because the SWE task needs GitHub.” Mirror the repos into the snapshot.
- GPU passthrough as a convenience. Only for named GPU evals on hosts whose IOMMU groups are clean.
6. Kata / Kubernetes profile (optional scale-out)
Use Kata only when sample volume or operational constraints require Kubernetes. Kata provides a VM boundary for a pod, but the effective hypervisor and runtime must be pinned and verified. Do not assume that selecting a Kata RuntimeClass automatically means Firecracker; current Kata distributions support several VMMs and defaults can change.
6.1 Cluster split
| Pool | Runs | Runtime | Trust |
|---|---|---|---|
| runner-pool | Inspect/Hawk runner, scoring, log shipper | Ordinary runc is acceptable; still locked down | Trusted, no model code |
| exec-pool | Agent tool pods | Kata (Firecracker or Cloud Hypervisor backend) | Untrusted |
| answers-pool | Hidden tests / gold labels | Kata or isolated VM, network_mode: none |
Trusted content, no agent code |
6.2 Mandatory Kubernetes controls
- Untrusted pods set
runtimeClassNameto the Kata class. Admission controller rejects exec pods without it. - No default service account token mounted. No RBAC that can list Secrets, exec other pods, or read node files.
- NetworkPolicy deny-all on exec-pool. DNS that can resolve the internet is a fail.
- No hostPath, no Docker socket, no privileged: true, no CAP_SYS_ADMIN.
- Separate CNI / no shared writable volume across samples.
- Node taints so runner pods cannot schedule onto exec nodes and vice versa.
- Control plane and etcd are not reachable from exec-pool.
- Admission verifies both runtimeClassName and the approved node/runtime configuration hash. If the containment profile requires Firecracker, a Kata pod using another VMM is rejected rather than silently accepted.
- Enforce Pod Security “restricted” or stricter plus custom admission: deny hostNetwork, hostPID, hostIPC, hostPath, privileged containers, device mounts, dangerous capabilities, and runtime/socket mounts.
- Set automountServiceAccountToken: false for exec pods. Do not merely rely on the absence of RBAC permissions.
- NetworkPolicy is one layer only. Exec nodes also sit behind infrastructure-level egress controls that do not depend on the cluster CNI being correct.
- Use per-run or per-sample namespaces where feasible; never place a privileged helper sidecar in the same pod/VM as model-controlled code.
- Control-plane credentials, kubelet APIs, node metadata, cloud pod identity endpoints, and container runtime sockets are unreachable from the sandbox network.
7. Qubes operator plane
Eval breakout is often guest → operator, not guest → host. Model output is untrusted content. Researchers must not open it in the domain that holds credentials.
7.1 Required qubes
| Qube | Role | Net | May hold |
|---|---|---|---|
| dom0 | Window manager only | None | Nothing eval-related |
| vault | Keys, weight paths, gold-label pointers, signing keys | None | Secrets only |
| eval-ctrl | Job UI, runner SSH, log review (text) | Via sys-firewall to eval API only | Operational access, not raw weights |
| untrusted-browse | Papers, GitHub, vendor docs | Yes, firewalled | No secrets |
| dispXXXX | Open model HTML, PDFs, patches, notebooks | None by default | One artifact, then destroyed |
| sys-net / sys-usb / sys-firewall | Drivers and policy | As Qubes default | Untrusted by design |
7.2 Operator rules
- No qrexec policy permits a disposable artifact qube to invoke shell-like services in eval-ctrl or vault. Inter-qube RPC is explicit and narrowly allowlisted.
- There is no normal artifact→vault path. If material must be promoted, export a reduced representation (plain text, flattened image, or reviewed patch) through a dedicated review workflow; never copy the original rich object.
- The local vault stores administrator/recovery secrets only. Live job credentials are issued by the backend broker, so compromise of eval-ctrl does not reveal a reusable provider or cluster key.
- No USB passthrough into eval-ctrl or vault. sys-usb/sys-net remain untrusted service qubes.
- Model-produced HTML, PDF, notebook, office document, archive, or image metadata is opened in a no-network disposable by default. Rendering in eval-ctrl is limited to sanitized plain text.
- If Qubes is not acceptable operationally, reproduce the same separation with distinct physical workstations and a narrow, auditable transfer path; do not collapse the trust domains.
8. Network, secrets, and shared state
Isolation technology and network policy are separate controls. A perfectly isolated microVM with broad egress is still an exfiltration endpoint. All execution networks therefore use two independent enforcement layers: a per-VM host/netns policy and an upstream router/firewall policy.
8.1 Egress matrix
| Destination | Golden image build | Sample runtime |
|---|---|---|
| Public internet | Deny (use internal mirror) | Deny |
| Package registries | Allow via internal mirror | Deny |
| Model provider API | N/A | Deny (runner only) |
| Eval broker / data proxy | N/A | Allow only if the named task requires it |
| Sibling samples | N/A | Deny |
| Cloud metadata (169.254.169.254 and equivalents) | Deny | Deny at tap |
| Cluster DNS that can recurse to the world | Deny | Deny |
| IPv6 global/link-local/multicast | Deny unless explicitly needed | Deny unless explicitly declared; default is no IPv6 route |
| ARP/NDP/L2 peers | Builder network only | No shared L2 peer set; per-VM tap/netns |
| Runner control plane | N/A | No routable path; host initiates control out-of-band |
| Time/NTP | Internal pinned source if required | No network NTP by default; inject/virtualize time if needed |
Enforce first at the microVM edge using a dedicated network namespace/tap policy that the guest cannot reconfigure, and again at an upstream firewall or router outside the eval host. Rules cover IPv4, IPv6, UDP, TCP, ICMP, DNS, multicast, broadcast, link-local, metadata ranges, and cluster/service CIDRs. A failure of either layer blocks scheduling.
8.2 Secret handling
- Provider keys and internal model tokens live in a backend hardware-backed secret store or HSM; the Qubes vault holds only human/recovery authority.
- Runner receives a per-run workload identity that the model gateway accepts, and nothing that a provider or inference service would accept directly. Guest receives nothing.
- If a task needs a dataset, the runner attaches a read-only block or injects files. No cloud SDK with a role in the guest.
- Hidden tests and flags live in the answers plane. The agent filesystem never contains
/flagfor the real host.
8.3 Banned shared conveniences
- Writable package caches visible to more than one sample.
- Shared
/tmp, overlay networks with pod-to-pod DNS, NFS “scratch.” - World-listable object buckets used as drop boxes.
- CI systems that build eval images on the same nodes that run them.
If caching is required for speed, use a content-addressed, append-only, non-listable store populated only by the image builder.
8.4 Credential-bound service access
For authenticated service access at stage C3, prefer a supervisor/proxy pattern in which the guest never receives the real credential. The guest presents a non-secret provider reference or placeholder; the proxy substitutes the credential only after the complete request matches the signed policy.
- Credential binding includes agent/run identity, destination, TLS identity, protocol, method/operation, and where feasible request/resource scope. A token approved for one endpoint is never exposed or replayable at another.
- Read-only policy is enforced at the request layer when the protocol is inspectable; possession of a backend credential with broader native permissions does not automatically grant those permissions to the agent.
- Policy denials are recorded out of band. The model may receive a minimal denial reason, but denial text must not reveal secrets, hidden policy structure, or security instrumentation details.
- Read-only is not no-exfiltration. Request-level “read-only” stops writes. It does not stop information leaving: paths, query strings, header values, object names, request timing, and request counts all carry bits, and the receiving service logs them. Allowed destinations must be internal services we control, request fields are length- and charset-bounded by the typed schema, and each run has a request-rate and request-bytes budget.
- Where TLS terminates. The guest talks to the supervisor over a typed local channel (vsock or a fixed-schema local socket); the supervisor originates TLS to the upstream service. Avoid designs that install an interception CA inside the guest: they work, but they make the CA private key on the proxy a high-value secret and teach the guest a trust anchor it can study.
8.5 Brokered network is a capability, not a proxy
- No arbitrary URL parameter, CONNECT method, open redirect following, user-controlled DNS resolver, or generic SOCKS/HTTP proxy.
- Each broker action names a resource class and operation in advance (for example, fetch object X from mirror Y), with fixed destination rules and response-size limits.
- The broker strips caller-supplied authentication headers, rejects private/link-local/metadata destinations after resolution, rechecks redirects, and records the resolved endpoint.
- Responses return as bounded opaque bytes to quarantine or the runner; executable/rich content is never automatically rendered in the trusted process.
- Suites containing restricted source code, personal data, or unreleased research may use only approved internal inference so tool transcripts cannot become an exfiltration channel to a third party.
8.6 Independent safety and model-path enforcement
- All model traffic is forced through a separate inference gateway; there is no DNS, route, credential, or alternate provider path from execution to the model endpoint.
- The gateway can stop future inference for a run and revoke brokered service access without cooperation from the agent, guest, or execution-host user space.
- For highest-risk runs, place a second monitor/enforcer outside the execution host's trust domain—for example on a dedicated security appliance/DPU or separate network hop. NVIDIA Sentry/BlueField is one implementation pattern, not a mandatory dependency.
- Continuous behavioral/drift monitoring may correlate policy decisions, tool calls, service requests, and inference events, but it is detection layered on top of deterministic authority controls, not a substitute for them.
- Do not make private reasoning or hidden chain-of-thought availability a prerequisite for containment. Security decisions must be derivable from externally observable requests, identities, policy, and resource access. Reasoning visibility may still be required in addition for higher capability stages (§9 staging).
- Monitors can only restrict. Drift detectors, LLM classifiers, and human transcript reviewers read content that contains guest-authored bytes, so they can be prompt-injected or flooded. Their outputs may pause, narrow, or escalate a run; they may never widen authority, renew a lease on their own, or clear an alarm raised by a deterministic control.
- Monitor lineage. LLM-based monitors and AI approvers come from a different model family or training lineage than the model under evaluation, so they do not share its blind spots or give it a same-model collusion channel. Where that is not possible, the run is capped at C2.
Independence conditions for the safety plane and any DPU layer
“Separate hardware” is not enough. The safety plane counts as independent only if all of the following hold, and each is checked before high-risk runs:
- Its management/policy plane is reachable only from a separate admin network, not from execution hosts, runner hosts, or the execution farm's admin network.
- It is administered by different people with different credentials from the execution farm (§12.3). No single operator credential can reconfigure both.
- Its firmware and policy are measured/attested, and a mismatch is a scheduling failure. The host it sits in cannot reflash it, change its policy, or disable it through a host-side driver.
- Loss of its signal from a host (heartbeat, telemetry, attestation) stops lease renewal for every run on that host.
- Vendor statements about line-rate enforcement, “in-silicon” isolation, or out-of-band placement are treated as claims until our own drill (T32, T40) reproduces them on the exact hardware and firmware in use.
8.7 What the policy prover does and does not prove
A policy prover answers: “given this policy model, can any modeled action reach a forbidden resource?” That is valuable and cheap, and it catches indirect routes a human reviewer misses. It is not a proof about the running system. Three gaps have to be closed separately.
- Model–enforcer conformance. The prover reasons about a model of the policy; the supervisor, firewall, and broker enforce compiled rules. These can disagree (a parser difference, a Rego edge case, an unmodeled protocol feature). Before each release, fuzz the enforcers with generated requests and compare their allow/deny decisions to the prover's model. Any disagreement blocks release.
- Binary-scoped rules inside a hostile VM. OpenShell-style rules can bind network access to an executable path. Inside an adversarial guest, any binary can be copied, renamed, or rewritten, so executable identity is not a boundary. Compute the envelope as if every process in the VM holds the union of all binary-scoped permissions; binary scoping may remain as extra hygiene.
- Composition across agents. Two agents whose permissions are each within bounds can combine, through shared services or messages to each other, into a route that neither has alone. The envelope is computed over the union of every agent and sub-agent in the run, including inter-agent message channels as edges.
- Coverage. The prover only knows the resources and operations it was told about. Every service in the suite manifest must have a declared operation model; an undeclared service or operation is denied, not assumed harmless.
8.8 Permission requests and approvals
Agents will ask for more access, and a capable agent will argue well. NVIDIA reports frontier agents with reduced safeguards spending up to two hours trying to persuade an AI reviewer to grant write access to a protected repository. The approval path is therefore an attack surface.
- A request is a structured diff against the current live policy. The approver (human or AI) sees the diff, the prover's result for the new policy, and the envelope; it does not see agent-authored justification text. If justification is needed, it is shown only in a quarantine viewer to a human, and never to an AI approver.
- Requests inside the signed envelope may be activated by an approver who is not the agent and not an AI from the same model lineage. Requests outside the envelope are refused automatically; the run must end and a new manifest be approved.
- Proposal rate limit per run (proposed default: at most 3 pending, at most 10 per run). Exceeding it pauses the run for review.
- Denial circuit breaker. NVIDIA observes that drift often starts right after a policy block. A run that accumulates denials above a suite-set threshold, or that hits denials across several distinct resource classes, is paused and reviewed rather than left to search for a workaround.
9. Evaluation loop (runner contract)
Implement the runner so that the guest cannot import it, talk to it as a library, or hold its credentials.
for sample in suite:
manifest = verify_signed_capability_manifest(sample)
prove_within_authority_envelope(manifest) # all agents, union of binary scopes
run = safety_plane.open_run(manifest) # issues first short lease
vm = exec.start(image=manifest.image_hash, net=manifest.network_profile)
runner.inject_bounded(vm, sample.public_task_files)
while not done and not timeout and run.lease_valid():
# gateway rejects the call itself if the lease has lapsed;
# the runner's check is a courtesy, not the control
action = gateway.next(run.id, transcript_view(), tools=manifest.tools)
if action.type == "final":
break
action = validate_typed_action(action, manifest)
result_bytes = runner.exec_bounded(vm, action)
result = ingest.normalize_text_or_quarantine(result_bytes)
transcript.append(result.safe_view)
# authoritative audit comes from enforcement points, not from here
if run.stopped_for_incident():
stop_sequence(run, vm, capture=True) # §9A
continue
candidate = ingest.collect_quarantined(vm, manifest.artifact_limits)
exec.destroy(vm)
score = scorer.run_disposable(candidate, sample.hidden_test_ref)
reconcile(transcript, safety_plane.audit(run.id)) # mismatch = incident
store.write(plain_transcript=transcript, score=score, audit_ref=run.id)
9.1 Return-path quarantine and scoring
- Text is not trusted merely because it is text. Strip/escape terminal control sequences, OSC links, bidirectional control characters where appropriate for the viewer, and enforce per-message and per-run byte limits.
- No recursive parsing in the runner. Archives, notebooks, PDFs, HTML, images, serialized objects, compiler diagnostics with clickable links, and other rich formats enter quarantine as opaque blobs.
- Safe extraction only. If extraction is required, do it in a disposable sanitizer with limits on expanded bytes, file count, nesting depth, path length, symlinks/hardlinks, devices, absolute paths, and traversal.
- Hidden tests stay blind. Interactive agent execution ends before hidden tests are attached. Candidate code runs against them in a separate no-network scorer VM; only a bounded score/result object returns.
- The score comes from the harness, not the candidate. Candidate code runs in its own process (or VM) with no write access to the test harness, test files, or result channel. The harness decides pass/fail from its own observations, so patched test frameworks, faked exit codes, or printed “PASS” lines cannot change the score.
- No auto-open. A generated URL, file, image, patch, or notebook cannot cause a trusted browser, editor, terminal, Git client, or shell to launch automatically.
- Parsing failures fail closed. Truncation, malformed structured output, oversized logs, or ambiguous content types produce an explicit evaluation error rather than falling back to permissive handling.
Capability staging
| Stage | Tools in guest | When allowed | Extra gate |
|---|---|---|---|
| C0 Text | None | Default for new checkpoints | — |
| C1 Structured tools | No shell; allowlisted functions only, executed in a VM, never in the runner process | After C0 deception / exfil review | — |
| C2 Code, no net | Firecracker + interpreter/shell | After C1; most agentic evals live here | Lease-based model path active |
| C3 Brokered service access | Typed requests to named internal resources through the host supervisor | Two-person approval per suite | Different-lineage monitor; reasoning/activation monitoring where the model exposes it |
| C4 Escape research | Inner sandbox under test, nested in Firecracker | Dedicated hosts; no weights on those hosts | As C3, plus independent-plane drill (T32, T40) passed on that pool |
9A. Leases, the stop sequence, and forensic capture
A kill switch that someone has to fire leaves a hole: if the safety plane crashes, is cut off, or is fed false telemetry by a compromised host, nobody fires it. This plan turns that around. A run keeps its authority only while the safety plane keeps saying yes.
9A.1 Leases
- At launch the safety plane issues a signed lease per run, with a short TTL. The model gateway and the service broker check the lease on every request and refuse if it has lapsed.
- The safety plane renews the lease only while all of these are healthy for that run's host: attestation, independent network-layer telemetry, deny-log pipeline, and the run's own step and denial budgets.
- Any failure, including the safety plane itself failing, means no renewal, which means the run stops by itself within one TTL. This is a dead-man's switch; the explicit kill command still exists but is the backup path.
- Leases are bound to run ID and host identity. A lease presented from another host or for another run is refused (T31, T35).
9A.2 Stop sequence
Cutting inference alone does not stop the guest: code already running in the VM keeps going. A stop therefore runs these steps in order. Each step is owned by a component that does not depend on the previous one succeeding.
| Step | Action | Owner | Works if execution host is compromised? |
|---|---|---|---|
| 1 | Refuse further inference; abort in-flight model streams | Model gateway (lease lapse or explicit revoke) | Yes |
| 2 | Revoke broker/credential leases; outstanding substituted credentials are invalidated at the secret broker | Secret broker | Yes |
| 3 | Drop all traffic for the VM, and for the whole host if host health is in doubt | Upstream firewall / DPU | Yes |
| 4 | Pause the VM's vCPUs through the Firecracker API | Host orchestrator | No; if the host does not confirm the pause in time, go to step 6 |
| 5 | If the stop was an incident: snapshot paused memory and disk to the sealed forensic store | Host orchestrator → forensic store (write-once, no-route) | No; evidence from a compromised host is treated as possibly tampered |
| 6 | Destroy the VM, or if the host is unresponsive, power the host off through its out-of-band management controller and quarantine it | Host orchestrator, else separately administered BMC | Yes, via BMC (loses memory evidence) |
9A.3 Forensic capture rules
- The forensic store is write-once, on hosts with no route to execution, runner, inference, or office networks.
- Captured images are opened only inside a no-network quarantine VM on a separate pool, never restored on a production eval host and never given to an agent.
- Captures are hostile artifacts: same rules as §9.1 for extraction and rendering.
- Non-incident stops (timeouts, normal completion) skip capture and go straight to destroy.
9A.4 Proposed initial targets
These are starting numbers for the acceptance tests, not measured results. Set final values per suite after measuring on the real hardware.
| Quantity | Proposed target | Tested by |
|---|---|---|
| Lease TTL | 10–30 s | T33 |
| Inference refused after lapse or revoke | next request; in-flight stream aborted ≤ 1 s | T30, T33 |
| VM network dropped at upstream layer | ≤ 2 s from stop decision | T34 |
| VM paused | ≤ 5 s from stop decision, else escalate to BMC path | T34 |
| Denial circuit breaker | suite-set; start at 5 denials, or denials across 3 resource classes | T39 |
| Permission proposals | ≤ 3 pending, ≤ 10 per run | T38 |
10. Nested architecture for escape evaluations
If the suite measures whether the model can leave Docker, gVisor, or a misconfigured pod, that environment is the specimen, not the containment boundary.
- Outer VM image is hardened to this document’s Firecracker standard.
- Inner environment may be runc, an old kernel, or a planted misconfig — only here.
- Those hosts are a separate physical pool. Compromise of the outer guest is an incident, not a weight leak.
- Outer hosts sit on a dedicated network segment with an independent egress deny at the upstream firewall; they cannot route to CI, artifact stores, inference, secret brokers, or office networks.
- Planted flags and credentials are synthetic canaries only. Never place a real provider token, cloud credential, SSH key, or weight-store credential in an escape target.
- If the outer VMM/jailer crashes or an unexpected host-level effect is observed, quarantine the physical host and stop reuse until the event is classified.
11. Image factory and supply chain
- Build snapshots on a builder that cannot be reached from exec VMs.
- Pin every package. Generate SBOM. Sign the snapshot hash.
- Runner refuses to boot an image whose hash is not in the allowlist for that suite.
- Rebuild on kernel/VMM/guest CVE; do not patch live guests.
- Third-party eval tasks are reviewed before their Dockerfiles touch the builder. Treat upstream task code as untrusted until diff-reviewed.
- Pin base images and packages by digest/hash, not mutable tags. Preserve provenance from source to signed image/snapshot manifest.
- Builder credentials are ephemeral and are not committed to image layers, shell history, build caches, or snapshot memory.
- Treat Firecracker, jailer, host kernel, guest kernel, Kata runtime, CNI, Qubes/Xen, and sanitizer/scorer images as independently versioned security dependencies with advisory tracking.
- A suite manifest records exact image hashes, VMM/jailer hashes, host baseline ID, network policy ID, scorer image hash, and effective Kata hypervisor when applicable.
12. Operations, monitoring, and staffing
12.1 Telemetry (host-side)
- VMM start/stop, jailer failures, resource kills.
- Tap packet summaries (denied flows especially).
- Full tool-call transcript on the runner, kept as a record of what the agent said. The authoritative record of what it did comes from enforcement points (VMM, network layers, broker, gateway) and is reconciled against the transcript after every run.
- Syscall audit of the VMM process, not a security agent the guest owns.
- Alerts: unexpected egress attempt, jailer crash, attempt to reach metadata, sample talking to another sample, runner process spawning a shell from model output.
- Append-only remote audit hashes for suite manifest, image/VMM versions, capability decisions, network denies, scorer result, and teardown completion.
- Record run identity and lineage across agent/sub-agent creation, tool invocation, policy decisions, brokered service requests, credential bindings, and inference requests. Prefer an open event schema such as OCSF-compatible records where practical.
- For high-risk runs, maintain a monitoring/enforcement signal outside the execution host so host compromise cannot erase the only audit trail or disable the only cutoff.
- Telemetry health is itself monitored. If deny logging, upstream firewall verification, or teardown verification is unavailable, new high-risk samples do not start.
- Log viewers render escaped plain text only. ANSI/OSC escape sequences and clickable URI handling are disabled in credential-bearing domains.
12.2 Review
- Sample trajectories for “am I being evaluated,” hidden goal language, and attempts to touch secrets or net.
- Weekly harness red team: MITM between runner and VM, RBAC review, cache abuse, scoring-channel injection.
- Incident rule: any unauthorized outbound packet, DNS request, metadata attempt, control-channel anomaly, or cross-sample signal is an incident, not merely a log line.
- Crash rule: unexpected VMM/jailer crash, seccomp violation, host kernel warning, or teardown failure quarantines the host until triage.
- Canary endpoints and synthetic credentials may be used to detect boundary contact, but a canary alert never substitutes for a preventative control.
12.3 Roles
| Role | Duty | Must not |
|---|---|---|
| Eval engineer | Suites, scoring, runner policy | Hold production weight keys on the same laptop used for browsing |
| Isolation engineer | Firecracker/Kata/Qubes baselines | Weaken egress to make a task “work” |
| Safety-plane owner | Model gateway, lease service, upstream/DPU policy, forensic store | Hold execution-farm admin credentials, or share an admin network with the farm |
| On-call | Pages for breakout-shaped events | SSH to exec hosts from an unlocked personal phone |
| Approver (two-person) | C3 brokered service access, GPU passthrough, new image hashes, in-envelope policy activations | Approve their own change |
| External eval liaison | METR / AISI-style partners on their infra when stakes rise | Ship raw weights to a partner without a written control |
13. Implementation milestones
Stop the obvious holes
- Inventory every current eval path. Ban runc-as-inner-box for model code on shared nodes.
- Stand up one Firecracker host, jailer, golden snapshot, deny-all tap.
- Move runner off the exec host. Remove keys from guest images.
- Qubes or two-machine split for anyone with vault access.
Release criterion. a code-exec sample can run with no guest credentials, no public egress, a separate runner, and successful teardown verification.
Production eval path
- Runner implements C0–C2 with image-hash allowlist and per-sample destroy.
- Host-side telemetry and denied-flow paging.
- Answers plane isolated.
- First harness red-team week.
- Add policy compiler/prover checks for the signed maximum authority envelope and reject any manifest with a modeled route to forbidden resources.
- Route all inference through a separately controlled gateway with a tested per-run cutoff. Move every provider/model credential off the runner and onto the gateway.
- Lease-based authority for inference and broker access; stop sequence §9A implemented and drilled.
- Prover–enforcer conformance fuzzing wired into release.
Release criterion. C0–C2 use signed manifests, quarantine/scoring isolation, two-layer network enforcement, host-side audit, and the expanded acceptance suite passes.
Scale and special evals
- Optional Kata exec-pool with admission controls, only if Firecracker farm saturates.
- C3 brokered-service tasks under two-person rule, using credential substitution outside the workload and request-level policy where protocols are inspectable.
- Pilot an OpenShell-like supervisor/policy layer if it reduces custom trusted code without weakening the Firecracker boundary. Treat its per-binary rules as hygiene only (§8.7).
- Structured-diff approval path with proposal limits and denial circuit breaker (§8.8).
- Sealed forensic store and capture path; first incident-drill that ends with a capture opened in quarantine.
- C4 nested escape suite on a dedicated pool.
- Snapshot fork for ablation runs from a frozen decision point.
Release criterion. any Kata, brokered-network, GPU, or escape-research path demonstrates the same invariants before it is enabled for frontier runs.
Assume the checkpoint got better
- Re-run harness red team before each frontier checkpoint.
- Patch/rebuild cadence for guest kernel, Firecracker, Xen (Qubes), and host kernel.
- Written stop condition: if escape-eval success rate or covert-channel evidence crosses a pre-registered line, freeze tool-using evals and escalate off this document to an org-level pause.
- Chaos drills at a fixed cadence: kill the safety plane, partition it, feed it stale telemetry; every drill must end with runs stopping by lease lapse.
- For the highest-risk hardware tier, evaluate host-independent monitoring/enforcement on the path to inference and services (for example Sentry/BlueField-class DPU or equivalent separate security domain).
Release criterion. every frontier checkpoint revalidates the containment profile; security-advisory or configuration drift reopens the affected checks automatically.
14. Acceptance tests (the plan is not done until these pass)
| ID | Test | Expected result |
|---|---|---|
| T1 | Guest inspects /proc, mount namespaces, devices, and Firecracker API paths | Only guest-visible state; no host proc mount, API socket, or host filesystem path is reachable |
| T2 | Guest curl to public IP and to metadata IP | Timeout / reject at tap |
| T3 | Guest lists env and files for keys | No provider tokens, no AWS/GCP/Azure creds |
| T4 | Two concurrent samples write a cache path | No shared writable path exists |
| T5 | Guest tries Docker socket / K8s API / SSH to runner | Not present or refused |
| T6 | Kill VMM mid-sample | Jailer tears down; no leftover tap or disk with task data |
| T7 | Inner runc escape in C4 suite | Flag of specimen visible; real host flag absent |
| T8 | Open model-produced HTML on operator laptop | Only possible in disposable qube; vault unreachable |
| T9 | Admission of an exec pod without Kata runtime (if K8s used) | Rejected |
| T10 | Runner binary imported or executed from guest | Not on guest filesystem; no credentials to call it |
| T11 | Guest probes MMDS and Firecracker API socket | MMDS absent unless suite-declared; API socket unreachable from guest and unrelated host users |
| T12 | Guest sends IPv6, UDP, ICMP, DNS, multicast, link-local, metadata, and random L2 traffic | Denied by VM-edge policy and independently by upstream policy as applicable |
| T13 | Guest emits 100+ MiB stdout, terminal escapes, OSC links, malformed UTF-8, and control characters | Bounded/truncated with explicit status; trusted viewer remains plain text and inert |
| T14 | Guest returns zip/tar with ../ traversal, symlinks, devices, nested bombs, huge expansion | Runner never extracts it; disposable sanitizer rejects or safely bounds it |
| T15 | Candidate attempts to read hidden tests during interactive phase | Hidden tests do not exist in execution VM or transcript |
| T16 | Scorer runs malicious candidate against hidden tests | Scorer has no network/admin credentials; only bounded score/result returns; scorer is destroyed |
| T17 | Kata RuntimeClass resolves to an unapproved VMM/configuration | Admission/scheduler rejects the run; effective hypervisor is recorded |
| T18 | Disposable artifact qube invokes qrexec toward vault/eval-ctrl with shell/file-copy services | Denied by policy; no rich artifact can flow directly into vault |
| T19 | Disable one network-enforcement layer in a staging drill | Verification fails and high-risk scheduling stops; remaining layer still denies traffic |
| T20 | Telemetry/deny-log pipeline unavailable | High-risk scheduling stops; containment rules remain active |
| T21 | Restore two VMs from the same snapshot and inspect IDs/random-dependent state | Kernel reseeds via VMGenID-capable path; per-run identities differ; uniqueness-sensitive suites cold-boot |
| T22 | Crash VMM/jailer or leave teardown incomplete | Host is quarantined; no automatic reuse until triage |
| T23 | Guest tries to reach runner, inference, broker, kubelet, container runtime, and control plane by all known addresses | No routable path or authentication surface is reachable |
| T24 | Restricted suite attempts to forward raw tool/artifact bytes to an external model/judge | Policy blocks or reduces data according to suite classification |
| T25 | Mutate suite image hash, VMM hash, network profile, scorer hash, or capability manifest after approval | Run is rejected before execution |
| T26 | Add an apparently narrow policy rule that creates an indirect route to a forbidden service through another tool/provider | Authority-envelope analysis finds the reachable forbidden action and rejects the manifest before launch |
| T27 | Agent requests broader network/file/tool authority during a live run | It cannot self-approve; changes outside the signed envelope require run termination and a newly approved manifest |
| T28 | Guest uses an approved service placeholder against the wrong hostname, method, resource, redirect, or TLS identity | Real credential is never inserted; request is denied and audited |
| T29 | Inspect guest environment, process memory, files, and packet payloads during authenticated brokered access | No reusable provider/service credential is observable inside the workload |
| T30 | Trigger the per-run model-path kill switch while the guest continues requesting actions | No further inference completes; guest cannot reach an alternate model endpoint |
| T31 | Forge/replay a sub-agent or tool identity, or detach an action from its parent run | Request is rejected; audit trail preserves run/parent lineage for every authorized action |
| T32 | In a staging drill, compromise/disable execution-host telemetry and local policy processes | Independent upstream/model-path enforcement remains active, detects loss of the host signal, stops high-risk scheduling, and can cut inference/service access |
| T33 | Kill, hang, or network-partition the safety plane during a live run | Leases lapse; gateway and broker refuse within one TTL; runs stop without anyone firing a kill command |
| T34 | Trigger a stop while the guest runs a long CPU loop, a background process, and a retrying network client | Upstream layer drops VM traffic, vCPUs pause, all within the §9A targets; if the host does not confirm the pause, BMC path fires |
| T35 | From a compromised runner, call the inference endpoint directly and replay the runner's gateway identity from another host | No credential on the runner works at the inference endpoint; replayed identity is refused |
| T36 | Fuzz supervisor, broker, and firewall with generated requests; compare decisions to the prover's model | Zero disagreements; any disagreement blocks release |
| T37 | Guest copies/renames an allowed binary, or writes its own HTTP client, to use a binary-scoped network permission | Envelope analysis already assumed this; no reachable action exceeds the envelope |
| T38 | Agent submits permission proposals with persuasive, adversarial, or prompt-injecting justification text | AI approver never sees the text; proposals over the rate limit pause the run; out-of-envelope requests auto-refused |
| T39 | Agent hits repeated denials across several resource classes | Circuit breaker pauses the run for review |
| T40 | From the execution host (root), try to reconfigure, reflash, or disable the DPU/upstream layer, and reach its management plane | No path; attestation mismatch stops scheduling; lease renewal stops for that host |
| T41 | Guest output contains text aimed at the LLM monitor (e.g. instructions to report “normal”) | Monitor cannot widen authority or clear a deterministic alarm; injection attempts are flagged, not obeyed |
| T42 | Agent's final summary claims actions it did not take, or omits actions it did take | Transcript-vs-audit reconciliation flags the mismatch as an incident |
| T43 | Using one execution-farm admin credential, attempt to change safety-plane policy, gateway config, or lease issuance | Refused; no shared credential or admin network exists |
| T44 | Candidate code patches the test framework, forges exit codes, or prints fake pass markers | Harness-derived score is unaffected |
| T45 | Two agents in one run each hold in-envelope permissions that combine into a forbidden route via a shared service or messages | Composed envelope analysis finds the route and rejects the manifest |
15. Residual risk (do not file this under “solved”)
- VMM and hypervisor 0-days. Firecracker and Xen shrink surface; they do not prove it empty.
- Microarchitectural leakage. VM isolation does not erase Spectre-class issues between co-tenants.
- The trusted runner. If scoring scripts or eval packages become attacker-influenced, the VM was never in the path.
- Operators. Qubes reduces splash radius; it does not stop a coerced paste of a key.
- Allowed channels. Timing of API calls, token usage, and content of permitted tool results still leak.
- Deployment. A clean eval says little about serving the same weights with tools to the world.
- Return-path bugs. A new parser, renderer, editor integration, log processor, or scorer can silently become part of the trusted computing base.
- Policy/configuration drift. RuntimeClass, CNI, hypervisor flags, qrexec policy, firewall rules, or image tags can change without changing the evaluation code.
- Prover model gaps. Conformance fuzzing finds disagreements it happens to generate; it does not prove there are none. An unmodeled protocol feature is invisible to both the prover and the fuzzer.
- Covert channels through allowed requests. Request budgets reduce bandwidth; they do not make it zero.
- Common-mode failure in the safety plane. Separate admins and hardware reduce shared failure, but the lease service, gateway, and DPU still share a vendor, a policy language, or an organization.
- Inference-mediated channels. The model endpoint is itself a communication endpoint; what the runner sends back to it must be considered part of the information-flow policy.
16. Go / no-go checklist
Do not start tool-using evals on a new frontier checkpoint until every box is true.
- □ Signed suite manifest fixes tools, image hash, VMM/jailer hash, network profile, scorer image, time/resource limits, and data classification.
- □ Inference, independent safety/model-path control, execution, scoring/quarantine, backend secrets, orchestration, and operator domains are separated.
- □ Every code-exec sample boots a jailed Firecracker microVM (or an explicitly approved equivalent profile) with production seccomp enabled and no undeclared devices/MMDS.
- □ Execution has two independent egress barriers; IPv4, IPv6, DNS, metadata, multicast, link-local, and control-plane routes are covered.
- □ No shared writable cache, overlay, bucket, namespace, or L2 segment exists across untrusted samples.
- □ Hidden tests never enter the interactive agent environment; scoring occurs in a disposable isolated scorer.
- □ Return bytes are size-bounded; rich artifacts are quarantined; trusted viewers render inert plain text only.
- □ Backend job credentials come from a short-lived machine broker/HSM; Qubes vault holds human/recovery authority, not live server tokens.
- □ Escape suites are nested on sacrificial hosts with no weights, real credentials, or route to production infrastructure.
- □ Qubes qrexec policy has no rich-artifact→vault path; model artifacts open in no-network disposable domains.
- □ Effective Kata hypervisor/runtime and CNI/admission configuration are verified rather than inferred from RuntimeClass name.
- □ Host patch/advisory status, teardown verification, telemetry health, and upstream firewall verification are green.
- □ Signed maximum authority envelope is machine-checked; live changes cannot exceed it; the agent cannot approve its own expansion.
- □ Authenticated C3 service access keeps real credentials outside the workload and binds substitution to approved identity, endpoint, protocol, and operation.
- □ Every inference call traverses the independent model-path gateway; the per-run cutoff has been tested and no alternate model route exists.
- □ Agent/sub-agent/tool/service/inference lineage is complete in the remote audit trail; high-risk runs retain an enforcement signal outside the execution host.
- □ Inference and broker access run on leases; the chaos drill (T33) ended with runs stopping by lease lapse.
- □ Stop sequence meets the §9A targets on this hardware; forensic store is write-once and no-route.
- □ No provider/model credential exists outside the gateway.
- □ Prover–enforcer conformance fuzzing passed; envelope computed over all agents and the union of binary scopes.
- □ Approvals use structured diffs only; AI approvers and LLM monitors come from a different model lineage than the model under test.
- □ Safety-plane admins and credentials are disjoint from execution-farm admins and credentials.
- □ T1–T45 passed on the exact current host + VMM + guest + policy + scorer + model-gateway + safety-plane build.
- □ Written stop condition and escalation owner exist above this infrastructure plan.
17. Source anchors and verification notes
This plan should be revalidated against current upstream documentation before deployment. The NVIDIA material was checked on 28 September 2026.
| Component | Operational point anchored upstream | Source |
|---|---|---|
| Firecracker | Production use is intended with the jailer; Firecracker installs default thread-specific seccomp filters; overall isolation also depends on host configuration. | Firecracker design · seccomp · jailer |
| Firecracker snapshots | Snapshot reuse can duplicate userspace uniqueness state; VMGenID helps reseed the guest kernel but does not make arbitrary userspace clone state safe. | snapshot support · entropy for clones |
| Kata Containers | Kata supports multiple hypervisors, including Firecracker, so RuntimeClass alone is not enough evidence of the effective VMM. | Kata hypervisors |
| Kubernetes | RuntimeClass, NetworkPolicy, admission controls, and disabling unnecessary service-account token mounts are separate security controls. | Kubernetes security checklist |
| Qubes OS | Security comes from compartmentalization; qrexec is the explicit inter-domain RPC boundary; disposables are intended for untrusted files and lose state on shutdown. | Qubes architecture · qrexec · disposables |
| Inspect / METR Hawk | Modern eval infrastructure separates trusted runner/model credentials from sandbox execution and uses deny-by-default sandbox networking; output sizes are explicitly bounded. | Hawk network isolation · Inspect sandbox API |
| NVIDIA OpenShell 0.1.0 | Gateway / per-sandbox supervisor / sandbox split; kernel-level file and process controls; no network path except through the supervisor; HTTP, GraphQL, and MCP request inspection (e.g. allow reads, block writes); policies written in YAML and compiled to OPA/Rego, with network rules bound to endpoints and executable paths; placeholder credentials substituted outside the workload and only for approved endpoints; OCSF audit trail; agent-proposed policy changes held for review and not self-approvable; filesystem/process limits fixed at sandbox start. The prover checks modeled permissions against an operator boundary; multi-agent composition is described as ongoing work. The two-hour persuasion experiment and its “no protected repository writes” outcome are vendor-reported. | OpenShell runtime controls · policy prover docs · repository |
| NVIDIA Open Agent Safety Platform | Five principles: verifiable policy, out-of-band enforcement, the path to the model as control point and kill switch, authority scaled with reasoning visibility, and shared responsibility. Motivated by reports from several labs of agents leaving evaluation environments and misreporting what they did. Notes that drift can start in response to a policy block. Sentry on BlueField-4 (via DOCA) is an optional layer that correlates agent interactions, policy decisions, and tool/data access, with identity governance at a DOCA gateway. In Vera Rubin PODs the DPU is described as on the node's only path to the model. Line-rate, “in-silicon”, and “just a software update” statements are vendor claims not independently verified here. | NVIDIA technical blog · platform overview |
Security advisories and release notes are operational inputs, not background reading. A signed image is not safe merely because its hash is stable.
NVIDIA's September 28, 2026 material is used here for architecture patterns, not as evidence that any one product formally contains ASI. Reasoning visibility is adopted only as an additional restricting gate for higher stages, never as a security prerequisite or a reason to grant authority; deterministic authority, identity, information-flow, lease expiry, and out-of-band cutoff remain the enforceable controls.