Security assessments¶
This page summarizes authorized containment assessments of the hardened agent
images. The results below are based on commit
11b986b3182814279325dbeb8e833b9701b39ab6 on master.
All assessments were performed by an agent running inside a container built from the target workload image, using the documented hardened launch flags or an equivalent assessment harness. They evaluate workload-container containment; they do not assess host, Docker daemon, or kernel isolation as independent security boundaries.
These are evidenced from specific images, launch configurations, kernels, and runtime environments and not a certification that every deployment is secure. Use the documented hardened launch flags, keep images and the container runtime updated, and treat all agent-controlled project and home-volume contents as untrusted.
Assessment summary¶
No assessment achieved a container escape, dropped-capability acquisition, or restricted IPv4 egress bypass.
aider, adal, qwen-code, and hermes were not independently assessed.
The first three use the shared hardened workload pattern, so the assessed
images provide relevant supporting evidence, but do not replace image-specific
testing. Hermes uses an upstream-vendor base image and custom entrypoint, and
needs its own dedicated assessment before being included in this summary.
The tested images consistently demonstrated these controls:
- non-root agent execution with no effective or permitted Linux capabilities;
no-new-privileges, seccomp filtering, and AppArmor enforcement;- a read-only root filesystem with explicitly scoped writable mounts;
- blocked unprivileged user-namespace creation;
- no Docker or container-runtime socket exposure;
- no setuid/setgid binaries or executable file capabilities in the assessed hardened images;
- deny-by-default restricted IPv4 egress, including interception of direct DNS queries aimed at external resolvers.
Assessment matrix¶
| Target container | Assessing model | Configuration | Result |
|---|---|---|---|
claude-code |
Claude Opus 5, maximum effort | Unrestricted and restricted egress | No escape achieved. Restricted IPv4 egress held end to end. |
codex |
OpenAI Codex, GPT-5.6-sol, high reasoning effort | Unrestricted and restricted egress | No escape achieved. Restricted IPv4 egress held end to end. |
opencode |
DeepSeek V4 Flash, maximum setting | Restricted egress | No escape or egress bypass achieved. |
kilo-code |
Laguna S 2.1 | Restricted egress | No escape or egress bypass achieved. |
aider |
Not assessed | Not assessed | Uses the shared hardened workload pattern; no independent security conclusion. |
adal |
Not assessed | Not assessed | Uses the shared hardened workload pattern; no independent security conclusion. |
qwen-code |
Not assessed | Not assessed | Uses the shared hardened workload pattern; no independent security conclusion. |
hermes |
Not assessed | Not assessed | Upstream-vendor base image and custom entrypoint; no security conclusion. |
What restricted egress means¶
In the standard restricted profile, the workload configures its egress policy before dropping to the unprivileged agent user:
- A local filtering DNS resolver accepts only allowlisted names.
- Resolved addresses for allowed names are added to an IP set.
- IPv4 and IPv6 OUTPUT policies default to deny.
- Direct TCP and UDP DNS traffic is redirected to the filtering resolver, except for that resolver's own upstream forwarding.
The assessed restricted IPv4 configurations allowed the configured service hosts, refused off-list DNS queries, dropped direct off-list IP connections, and prevented the agent from reading, flushing, or changing the firewall and IP-set policy after privilege drop.
IPv6 was not fully validated end to end because the assessment environments did not have a routable public IPv6 path. The IPv6 policy is implemented and source reviewed, but operators requiring IPv6 should test it in their own deployment.
Important deployment limitations¶
The containment boundary limits what a running agent can reach. It does not remove the authority deliberately granted to it or make every deployment configuration equally strong.
These are deployment considerations, not demonstrated containment breaches. The levels describe the consequence of enabling the configuration or omitting the indicated operational control in a typical shared deployment.
| Consideration | Brief | Deployment risk |
|---|---|---|
| Project and home volumes | Writable state can persist and may later be used by host-side tools. | High |
| Credentials | An agent can use credentials that are mounted or otherwise supplied to it. | High |
| Hostname allowlists | Allowed services, CDNs, and registries can still deliver untrusted content. | Medium |
| Unrestricted egress | The explicit * opt-out exposes additional network attack surface. |
High |
| Resource limits | Without CPU, memory, and swap ceilings, agent work can affect availability. | Medium |
| Same-UID process control | Peer/helper-process interference is possible in some runtime and host-policy combinations. | Low–medium |
| Executable temporary storage | Some terminal runtimes require an executable /tmp; this is a compatibility tradeoff. |
Low |
Project and home volumes are trusted writable state¶
The project bind mount and persistent home volume are intentionally writable. An agent can leave behind code, hooks, configuration, package caches, or other state that a host-side process may later read or execute.
Use separate projects and home volumes where isolation between tasks matters. Review agent-produced changes before running them on the host.
See the containment philosophy for the full filesystem and credential trust model.
Credentials are granted authority¶
Credentials supplied through environment variables, the persistent home volume, Git configuration, package-manager configuration, or mounted files are available to the agent. Egress filtering controls destinations; it does not limit what an authorized agent can do with credentials at an allowed destination.
Hostname allowlists are not content filters¶
Allowlisting a service permits connections to addresses returned for that service. It does not distinguish legitimate from malicious content delivered by the same service, registry, CDN, or reverse-proxy infrastructure.
Use the narrowest practical allowlist and prefer a separately administered agent gateway when the workload must not control the system that enforces its network policy.
The assessments observed differing subdomain behavior across environments. Do not rely on an allowlist entry being an exact hostname match unless that behavior has been verified for the image version and runtime configuration you are deploying.
Unrestricted egress is an explicit opt-out¶
AGENT_ALLOWED_EGRESS=* disables the workload egress restrictions. It can make
host- or VM-side network services reachable as well as the public internet.
Use it only when unrestricted access is intentional. A reachable host service is not automatically a container escape, but it is additional attack surface.
Resource limits are deployment-specific¶
The assessed containers had a finite PID limit but no container-level CPU, memory, or swap ceiling. This is an availability concern: builds, dependency installs, or hostile project commands can consume resources needed by other workloads or the Docker VM.
For shared or unattended deployments, set limits appropriate to the workload:
docker run \
--memory=4g \
--memory-swap=4g \
--cpus=2 \
--pids-limit=512 \
# remaining documented image flags and mounts
These values are examples, not defaults. Coding workloads vary substantially; size limits for the project and enforce an outer host or VM resource ceiling.
Same-UID process control is a conditional availability concern¶
Agent commands and helper processes can share the same Linux UID. On hosts with a permissive ptrace policy, a dumpable same-UID process may be traceable or readable by another same-UID process. Same-UID processes can also interfere with ordinary peer or child helper processes through signals.
When the agent itself is the container namespace PID 1, Linux rejects
uncatchable SIGSTOP and SIGKILL directed at it from inside that namespace.
This does not automatically protect every helper process, every catchable
signal, or every runtime layout.
This is an in-container availability and defense-in-depth concern, not a demonstrated host escape. Deployments that run untrusted tools, are unattended, or are multi-tenant may additionally use:
- host Yama
ptrace_scope=1or stricter; - a tested custom seccomp profile that denies
ptrace,process_vm_readv, andprocess_vm_writev; and - an external watchdog or restart policy where agent availability matters.
Test these measures with the selected language tooling, debuggers, profilers, and process-management workflows before adopting them.
Intentional executable temporary storage¶
Some images require an executable /tmp because their terminal UI or runtime
loads native code from temporary storage. In particular, the documented Kilo
Code and OpenCode launch commands use --tmpfs /tmp:exec.
This is a compatibility requirement, not a privilege-escalation finding. The
other containment controls still apply: the agent cannot use /tmp to gain
root, acquire a dropped capability, or alter the read-only image filesystem.
Do not change /tmp to noexec for those images without verifying that the
agent and its terminal runtime still work.
Not covered by these assessments¶
The assessments did not establish that:
- the host kernel, Docker daemon, base image, package registries, or agent CLI have no vulnerabilities;
- every image version, kernel, architecture, network topology, or custom launch command has identical behavior;
- IPv6 restricted egress is effective on a routable IPv6 deployment;
- gateway-client mode, cloud metadata access, cross-container networking, or image supply-chain controls are safe in every environment.
These are important deployment and operational concerns. Keep the host and runtime patched, avoid exposing runtime sockets, use narrow networks, and test the exact image and flags you plan to use.
Reporting a security issue¶
Report suspected containment, isolation, capability, filesystem, or egress weaknesses privately. See the repository security policy for the reporting process and supported-version policy.