Skip to content

Advertisement

DevOps Society

Docker Wants Agent Permissions Inside the Image: Sandbox Kits Head to the CNCF

Docker launched Cloud Sandboxes and is submitting the Sandbox Kit spec to the CNCF. What it means to put an agent's network rules and credentials inside the image digest, and what is still unproven.

Published your local timeupdated

Docker Wants Agent Permissions Inside the Image: Sandbox Kits Head to the CNCF

Ask a platform team which credentials their coding agent actually held during last Tuesday's CI run. The answer gets assembled out of three places: a runtime flag in a workflow file, two environment variables from a secrets manager, and a network egress rule someone set in a dashboard six months ago. The job went green, the container exited, and the authority that agent carried is now recoverable only by archaeology. Docker's proposal, announced on 24 September 2026 at WeAreDevelopers 2026, puts that authority inside the image. The Docker Sandbox Kit specification makes an OCI image declare what the process inside it may do, and Docker is submitting the spec to the CNCF so the format is not Docker's alone to change.

Two announcements, one argument

The first is a product. Docker Cloud Sandboxes went generally available at docker.com/products/docker-sandboxes, extending Docker's local sandbox isolation into Docker's cloud so an agent keeps working after you close the laptop. It uses microVM isolation, applies the same policies as the local sandbox, boots in hundreds of milliseconds, scales from 1 to 16 vCPUs, is fully managed by Docker, and is built for hours-long unattended runs with workflows that move between local and cloud. Pricing was not disclosed in the announcement. Mark Cavage, President at Docker, framed the reasoning bluntly: "containers weren't designed for the level of isolation AI agents demand".

The second is the part worth arguing about. Docker is taking the Sandbox Kit Specification to the CNCF for neutral governance, comparing the move to donating the image format to the OCI a decade ago. The spec is Apache 2.0. It has been submitted, not accepted, and the difference matters to anyone planning around it.

Take the AI agent isolation claim seriously

Cavage's line reads as marketing but points at something real. A container isolates a process that does a predictable thing, and at build time you know roughly what it reaches, because you wrote the code doing the reaching. An agent inverts that. It decides at runtime what to touch, and the point of running it is that you did not enumerate the steps in advance. So the useful question stops being "what can this process reach" and becomes "what authority did we hand this thing, and can we prove it afterwards". Namespaces and seccomp answer the first question. Neither produces an artifact you can show an auditor.

Which makes the interesting claim one about where permissions live, not how strong the sandbox is. A runtime flag holds authority for one invocation. A dashboard holds it until someone quietly changes it. A digest holds it permanently, and that is what makes agent authority diffable and reviewable in a pull request. The same shift happened when environments moved from a wiki page of click-throughs to Terraform in version control, and the value was never the tooling. It was that changing an environment became a diff someone had to approve.

Agent permissions scattered across a document, a terminal window and a settings panel on one side, and the same permissions sealed inside a single crate being scanned before the agent starts on the other

What a Docker Sandbox Kit actually declares

A Kit is an ordinary OCI image that declares what an agent may do. There are two roles: a workload, which runs and supplies the root filesystem, and mixins, overlays that supply a CLI, credentials, network rules or context. Any launch is exactly one workload plus any number of mixins.

These OCI image permissions ride in the manifest under the annotation vnd.docker.sandbox.kit.descriptor, and that one choice carries most of the practical weight. Pinning the digest pins the content, the declarations and the metadata together, so you cannot run the code you reviewed with permissions somebody widened afterwards. It builds with docker buildx build and pulls with docker pull. Because it is not a new artifact type, existing scanners and signing tools work on it unmodified, which is the difference between a format your DevSecOps pipeline already understands and one you spend a quarter integrating. Capabilities are typed and versioned independently, with @1 and @2 suffixes, so network policy can evolve without a rewrite of every credential declaration.

Reading the capability block

Here is Docker's own GitHub CLI mixin, trimmed:

capabilities:
  - type: com.docker.sandbox/network-policy@2
    config:
      runtime:
        allow:
          - github.com
          - hosts: [api.github.com]
            methods: [GET, HEAD, POST, PATCH, PUT, DELETE]
        deny:
          - hosts: [api.github.com]
            methods: [DELETE]
            paths: [/repos/**]

  - type: com.docker.sandbox/credential@1
    optional: true
    config:
      service: github
      phase: runtime
      apiKey:
        name: GH_TOKEN
        proxyManaged: true
        inject:
          - {domain: api.github.com, header: Authorization, format: "Bearer %s"}

Two lines do the real work. The deny block revokes DELETE against /repos/** even though the allow block above grants DELETE on the same host. Deny beats allow, always, and that ordering is normative rather than convention. You can hand an agent broad API access and carve out the operations you will not let it find on its own, without an allow list that goes stale the moment the API adds an endpoint.

proxyManaged: true is the other. The real token never sits in the image. The runtime injects it into outbound requests to api.github.com as they are made, so the image carries the credential's shape (name, domain, header format) rather than the secret. An agent that exfiltrates its own environment gets a placeholder. That is the same failure class as the GitLab incoming-email token push-to-main issue: a credential with more reach than the task required.

How agent authority is handled today

Approach

Where the authority lives

Who can change it

What you can audit afterwards

Runtime flags on the invocation

One command line, one run

Anyone who can edit the job or type the command

Shell history and CI logs, if retained and if the flags were not built from variables

Environment variables from a secrets store

Injection config plus the store's policy

Platform team, plus anyone with write access to the store

That a secret was fetched, not what the agent did with it

Dashboard toggles and org policy

Vendor console

Console admins

A change log nobody reviews, rarely tied to a specific run

Ad hoc personal access tokens

Scopes set once at creation

The token's creator

Token scopes, if the token is still identifiable. Usually shared and long-lived

A Docker Sandbox Kit

The image manifest, under a digest

Whoever can merge a change to the image

The declared permission set for that digest, reviewable as a diff before it ran

The right-hand column is the argument. Every row but the last tells you only that a secret existed. The last one tells you what the agent was allowed to do.

Resolution, updates and conformance

Mixins are ordered by a dependency graph built from provides and requires, not by the order you typed them. Resolution is strict: every requirement must be satisfied or the launch fails, exactly one workload is allowed, and incompatible requests error instead of one mixin silently overriding another.

Declarations reduce to a normalised set of granted permissions, so a runtime can compare one version against another. Updates that stay inside the authority you already granted apply automatically. Anything that widens the grant needs approval, and removing a deny rule counts as widening. That last detail will catch implementers out, and it is the correct call.

The spec ships a normative grammar and two conformance suites: one checks whether an artifact is a conforming Kit, one checks whether a runtime behaves as specified. Docker Sandboxes is the first conforming runtime, installed with brew install docker/tap/sbx:

sbx run ./hello --kit ./gh .

Collaborators named by Docker include AWS, Palo Alto Networks, Snyk, Datadog, Dynatrace, Box and JFrog, plus the agent frameworks NanoClaw and OpenClaw.

Several permission overlays merging along a dependency graph into one sealed grant, with one overlay rejected because its requirement is unmet

What is unproven

A specification is only as good as its enforcement, and today there is exactly one conforming runtime, written by the company that wrote the spec. The conformance suites are the right hedge, but a suite only one implementation has ever passed is not yet a portability guarantee. Neutral governance has been submitted, not granted.

The governing principle, that Kits ask for permissions and hosts decide what to grant, cuts both ways. The security property depends entirely on the host being strict. A permissive host that grants whatever a Kit requests turns the mechanism into documentation, which is a different product from the one being pitched.

MicroVM isolation inside Docker's cloud is a vendor boundary, with what that implies for data residency and incident response, and the pricing is undisclosed. That matters when the pitch is hours-long unattended runs. An agent that ran for six hours because nobody stopped it is a cost story before it is a security story.

Nor does any of this stop an agent misusing authority it was legitimately granted. A Docker Sandbox Kit is a scoping and auditing mechanism, not behaviour control. An agent with POST access to your issue tracker can still write nonsense into three hundred issues, and the Kit will faithfully record that it was allowed to.

A signed, pinned image that declares its own authority answers the same class of problem as malicious providers in the Terraform registry: you pulled something and could not say in advance what it would reach for. The caveat is identical. A signature proves origin, not intent, and a declared permission set narrows what a hostile artifact can do without telling you it is benign.

Should you care yet

If you are already running agents against real credentials in CI, meaning tokens that can merge, deploy or spend, build a Kit for one of those workflows this month. The value arrives before the ecosystem does, because writing the declaration forces you to enumerate authority you currently grant implicitly. Teams usually find their agent holds push access it has never used.

Everyone else should wait for a second conforming runtime. Until something other than Docker Sandboxes passes the runtime suite, adopting the format is a bet on one vendor's implementation with a spec attached: fine for a team with an acute problem, poor for a team building a standard into a platform others depend on. The same patience applies to Docker Cloud Sandboxes, since undisclosed pricing on long unattended runs is hard to design around. Our notes on restoring GPU state instead of reloading it and the rest of our AI infrastructure coverage take up the same cost question.

What to watch

Four signals tell you whether this becomes infrastructure or stays a product feature.

  1. Whether this becomes an accepted CNCF specification, and at what level. The governance terms will say more than the announcement did.

  2. A second conforming runtime from someone other than Docker. Strongest signal on the list, and until it exists the portability claim is untested.

  3. Whether strict host-side policy tooling appears. The format needs hosts that reject over-broad requests by default, because a permissive host is the failure mode that makes all of this decorative.

  4. Whether the scanner vendors surface capability declarations in their output. If Snyk and JFrog show you the granted permission set next to CVEs, the format is real. If they do not, the annotation is a string nobody reads.

Advertisement

Written by

DevOpsSociety Editorial Team

Editorial Team

The DevOpsSociety Editorial Team covers DevOps, cloud infrastructure, Kubernetes, AI infrastructure, platform engineering, cybersecurity, FinOps, and modern engineering practices. We publish practical insights, technical guides, architecture analysis, and research for engineers and technology leaders.

More from DevOpsSociety →
The Infrastructure Briefing

Get the infrastructure briefing.

Practical DevOps, cloud, AI infrastructure and engineering insights, delivered weekly. Read by engineers and engineering leaders.

No spam. Unsubscribe anytime.