Container escape → host
When it applies
You have code execution inside a container and want the underlying host (and from there, other containers / the cluster / cloud creds).
Why it works
Containers are isolation by configuration, not a hard boundary. Privileged mode, extra capabilities, mounted host resources, or an exposed Docker socket give processes inside the container direct control over the host kernel/daemon.
Method
- Confirm & enumerate:
/.dockerenv,/proc/1/cgroup; runamicontained/deepceto list capabilities, seccomp, and mounts. - Exploit the misconfig:
- Docker socket mounted (
/var/run/docker.sock):docker -H unix://... run -v /:/host ...→ mount host FS as root → escape. - Privileged / CAP_SYS_ADMIN: mount the host disk, or use the classic
release_agentcgroup notify_on_release trick to run a command on the host. - hostPath / host mounts: write to host filesystem (cron, ssh keys, kubelet config).
- hostPID: access host processes;
nsenterinto PID 1's namespaces.
- Docker socket mounted (
- From the host: grab cloud metadata creds (→
cloud-imds-ssrf), pivot to other containers/nodes (→cloud-kubernetes).
Gotchas
- Enumerate capabilities/mounts first — the escape depends entirely on which misconfig exists.
- Kernel-exploit escapes are last-resort and risky on live targets; prefer the config-based paths.
- On bug bounty, a proven mount of the host FS is enough — don't disrupt the node.
Verify success
Command execution or file read/write on the host (outside the container namespace) — e.g. host
/etc/shadow, other containers, or the kubelet/cloud creds.
References
deepce/amicontained; "Understanding Docker container escapes" (Trail of Bits); HackTricks.