Docker安全概览
Docker安全概览
前面的文章已经简单介绍了docker容器相关概念,docker的使用对于接触过ctf出题的人来说还是相对熟悉了,这里也不做过多介绍,接下来从安全的角度来分析一下docker
Docker面临的风险
镜像风险
镜像的内容是由用户进行配置的,所以有可能造成一些安全问题
不安全的第三方组件
比如在镜像中引入了一些具有严重nday的组件,毫无疑问,这个镜像也就存在漏洞了
不安全的镜像
类似供应链攻击,在公共镜像仓库比如 Docker Hub 里,会存在一些有漏洞的镜像或者恶意镜像,如果使用了这些镜像那就存在风险了
敏感信息泄漏
如果在镜像开发完毕后没有删除自己配置的api key、AK/SK等,那么如果别人获取到该镜像就可能造成敏感信息泄漏
活动中的容器风险
容器在运行时也有一些能够用户自定义的配置,这些配置不当同样可能造成风险
不安全的容器应用
比如映射出来的端口的服务存在漏洞,那么自然会导致风险
不受限制的资源共享
容器运行在宿主机上,容器必然要使用宿主机的各种 CPU、内存等资源,如果没有对容器进行资源使用限制,那么就存在宿主机被资源耗尽的风险
不安全的配置/挂载
正常来说,容器有两大隔离机制:
- linux命名空间:实现文件系统、网络、进程、主机名等方面的隔离
- linux控制组:实现CPU、内存、硬盘等方面的隔离
而配置不当会导致容器本身隔离机制失效:
- –privileged:使容器内的 root 权限和宿主机上的 root 权限一致,权限隔离被打破
- –net=host:使容器与宿主机处于同一网络命名空间,网络隔离被打破
- –pid=host:使容器与宿主机处于同一进程命令空间,进程隔离被打破
- –volume /:/host:宿主机根目录被挂载到容器内部,文件系统隔离被打破
容器管理程序接口风险
Docker 守护进程主要监听 UNIX socket 和 TCP socket,默认情况下,Docker 只会监听 UNIX socket
UNIX socket
风险主要在于Docker守护进程默认以宿主机的root权限运行,说到这里其实熟悉后渗透的师傅都能想到,可以利用这一点进行提权,除此之外我们还可以利用这点进行容器逃逸,这类风险有两个利用场景
普通用户被加到Docker用户组内
如果普通用户被加入到 Docker 用户组内,那么普通用户也将有权限访问 Docker UNIX socket,如果攻击者获得了这个普通用户权限,就可以借助 Docker 提权到 root 用户权限
Unix socket挂载到容器内部
有时为了实现容器内部管理容器,可能会将 Docker UNIX socket 挂载到容器内部,那么如果该容器被入侵,渗透测试人员就可以借助这个 socket 进行容器逃逸获得宿主机 root 权限
TCP socket
现在 Docker 守护进程默认不会监听 TCP socket,不过有时可能用户会因为方便开启 TCP socket 的监听,一般默认监听端口是 2375
默认情况下,Docker 守护进程 TCP socket 是无加密无认证的,因此如果发现宿主机 Docker 开放了 TCP socket,就可以直接使用 docker -H 接管目标的容器
其他风险
- 容器网络:可能存在横向的风险
- 宿主机操作:容器通常与宿主机共享内核,若宿主机内核存在漏洞那么容器也可能存在相同漏洞,比如利用脏牛实现容器逃逸
- 软件自身:即Docker自身存在的漏洞比如CVE-2019-14271、CVE-2019-5736 等可以导致容器逃逸