docker 1.0.0 docker.socket world accessible

2016-01-13T00:00:00
ID SSV:90394
Type seebug
Reporter _Jimmy_
Modified 2016-01-13T00:00:00

Description

CVE-2014-3499 docker.socket world accessible

漏洞类型

设计错误 本地权限提升

漏洞分析

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

参考链接

  • https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-3499
  • https://github.com/docker/docker/issues/6836