设计错误 本地权限提升
Docker 1.0.0使用全局可读可写的管理套接字,这种设计会允许本地用户利用写套接字,获得特殊的权限。
docker.socket 在docker 1.0.0版本时,并没有限制读写socket的权限,导致本地用户任何socket读写都能够完成。
本地用户使用构造的恶意请求写入到socket中会导致root权限执行任意代码。
在init/systemd中, docker.socket是指/var/run/docker.sock这个管理套接字,主要作用为docker client与docker deamon通信提供支持。在docker中,整个命令的传输全部都依靠socket,在管理套接字的读写问题上,如果可以读写管理套接字
那么docker client与docker deamon的信息流都可以读取和伪造,并可以构造相应的数据包来让deamon执行相关的命令。
关于为什么docker需要root权限的问题,可见Why we don’t let non-root users run Docker in CentOS, Fedora, or RHEL
docker 版本小于1.0.0均存在
docker version <= 1.0.0
官方限制了套接字的权限:
在文件contrib/init/systemd/socket-activation/docker.socket配置中
[Socket]
ListenStream=/var/run/docker.sock
# 对socket的权限进行了控制
+SocketMode=0660
+SocketUser=root
+SocketGroup=docker
[Install]
WantedBy=sockets.target
详情,可见Fix the systemd socket activation socket permissions